warscript 0.0.1-dev.d842bb6 → 0.0.1-dev.da5fb2e

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 (153) hide show
  1. package/attributes.d.ts +5 -0
  2. package/attributes.lua +8 -1
  3. package/config.d.ts +5 -0
  4. package/config.lua +10 -0
  5. package/core/types/effect.d.ts +1 -3
  6. package/core/types/effect.lua +26 -29
  7. package/core/types/frame.lua +10 -12
  8. package/core/types/player.lua +3 -1
  9. package/core/types/playerCamera.d.ts +2 -0
  10. package/core/types/playerCamera.lua +79 -5
  11. package/core/types/sound.d.ts +17 -25
  12. package/core/types/sound.lua +91 -46
  13. package/core/types/timer.d.ts +8 -8
  14. package/core/types/timer.lua +39 -23
  15. package/core/util.lua +6 -1
  16. package/decl/native.d.ts +844 -788
  17. package/engine/behavior.d.ts +5 -0
  18. package/engine/behavior.lua +106 -27
  19. package/engine/behaviour/ability/apply-buff.lua +1 -1
  20. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  21. package/engine/behaviour/ability/damage.d.ts +9 -3
  22. package/engine/behaviour/ability/damage.lua +26 -38
  23. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  24. package/engine/behaviour/ability/emulate-impact.lua +18 -3
  25. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  26. package/engine/behaviour/ability/restore-mana.lua +6 -6
  27. package/engine/behaviour/ability.d.ts +5 -1
  28. package/engine/behaviour/ability.lua +26 -21
  29. package/engine/behaviour/unit/stun-immunity.d.ts +5 -3
  30. package/engine/behaviour/unit/stun-immunity.lua +43 -27
  31. package/engine/behaviour/unit.d.ts +32 -0
  32. package/engine/behaviour/unit.lua +185 -4
  33. package/engine/buff.d.ts +15 -12
  34. package/engine/buff.lua +133 -117
  35. package/engine/internal/ability.d.ts +7 -1
  36. package/engine/internal/ability.lua +48 -9
  37. package/engine/internal/item/ability.lua +63 -11
  38. package/engine/internal/item+owner.lua +12 -6
  39. package/engine/internal/item.d.ts +5 -2
  40. package/engine/internal/item.lua +85 -10
  41. package/engine/internal/mechanics/ability-duration.lua +1 -1
  42. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  43. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  44. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  45. package/engine/internal/misc/frame-coordinates.lua +21 -0
  46. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  47. package/engine/internal/misc/get-terrain-z.lua +11 -0
  48. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  49. package/engine/internal/misc/player-local-handle.lua +5 -0
  50. package/engine/internal/unit/ability.d.ts +35 -0
  51. package/engine/internal/unit/ability.lua +62 -0
  52. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  53. package/engine/internal/unit/allowed-targets.lua +9 -1
  54. package/engine/internal/unit/order.d.ts +20 -0
  55. package/engine/internal/unit/order.lua +136 -0
  56. package/engine/internal/unit+ability.lua +10 -1
  57. package/engine/internal/unit+damage.d.ts +2 -11
  58. package/engine/internal/unit+damage.lua +10 -14
  59. package/engine/internal/unit+spellSteal.lua +1 -2
  60. package/engine/internal/unit-missile-launch.lua +9 -2
  61. package/engine/internal/unit.d.ts +30 -8
  62. package/engine/internal/unit.lua +253 -107
  63. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  64. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  65. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  66. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  67. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  68. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  69. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  70. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  71. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  72. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  73. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  74. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  75. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  76. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  77. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  78. package/engine/object-data/entry/ability-type/blank-configurable.lua +0 -9
  79. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  80. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  81. package/engine/object-data/entry/ability-type/curse.lua +2 -2
  82. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  83. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  84. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  85. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  86. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  87. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  88. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  89. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  90. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  91. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  92. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  93. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  94. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  95. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  96. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  97. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  98. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  99. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  100. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  101. package/engine/object-data/entry/ability-type/web.lua +52 -0
  102. package/engine/object-data/entry/ability-type.d.ts +19 -17
  103. package/engine/object-data/entry/ability-type.lua +82 -24
  104. package/engine/object-data/entry/buff-type/applicable.lua +9 -4
  105. package/engine/object-data/entry/buff-type.d.ts +6 -12
  106. package/engine/object-data/entry/buff-type.lua +13 -29
  107. package/engine/object-data/entry/destructible-type.d.ts +1 -1
  108. package/engine/object-data/entry/item-type.d.ts +1 -1
  109. package/engine/object-data/entry/item-type.lua +4 -4
  110. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  111. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  112. package/engine/object-data/entry/sound-preset.lua +140 -0
  113. package/engine/object-data/entry/unit-type.d.ts +21 -5
  114. package/engine/object-data/entry/unit-type.lua +214 -93
  115. package/engine/object-data/entry/upgrade.d.ts +1 -1
  116. package/engine/object-data/entry/upgrade.lua +4 -4
  117. package/engine/object-data/entry.d.ts +16 -14
  118. package/engine/object-data/entry.lua +60 -32
  119. package/engine/object-field/ability.d.ts +4 -4
  120. package/engine/object-field/ability.lua +7 -6
  121. package/engine/object-field/unit.d.ts +57 -3
  122. package/engine/object-field/unit.lua +207 -7
  123. package/engine/object-field.d.ts +17 -6
  124. package/engine/object-field.lua +188 -92
  125. package/engine/standard/entries/buff-type.d.ts +3 -0
  126. package/engine/standard/entries/buff-type.lua +3 -0
  127. package/engine/standard/entries/sound-preset.d.ts +10 -0
  128. package/engine/standard/entries/sound-preset.lua +10 -0
  129. package/engine/standard/fields/unit.d.ts +4 -0
  130. package/engine/standard/fields/unit.lua +7 -0
  131. package/engine/text-tag.d.ts +36 -2
  132. package/engine/text-tag.lua +249 -10
  133. package/engine/unit.d.ts +1 -0
  134. package/engine/unit.lua +1 -0
  135. package/objutil/buff.lua +1 -2
  136. package/objutil/unit.lua +8 -0
  137. package/package.json +2 -2
  138. package/patch-lualib.lua +1 -1
  139. package/utility/arrays.d.ts +1 -0
  140. package/utility/arrays.lua +3 -0
  141. package/utility/callback-array.d.ts +13 -0
  142. package/utility/callback-array.lua +46 -0
  143. package/utility/functions.d.ts +8 -0
  144. package/utility/functions.lua +13 -0
  145. package/utility/linked-set.d.ts +1 -0
  146. package/utility/linked-set.lua +3 -0
  147. package/utility/lua-maps.d.ts +4 -0
  148. package/utility/lua-maps.lua +20 -0
  149. package/utility/lua-sets.d.ts +2 -0
  150. package/utility/lua-sets.lua +7 -0
  151. package/utility/reflection.lua +11 -7
  152. package/core/types/order.d.ts +0 -25
  153. package/core/types/order.lua +0 -55
package/attributes.d.ts CHANGED
@@ -1,8 +1,12 @@
1
1
  /** @noSelfInFile */
2
+ declare const marker: {};
2
3
  export type Attribute<T> = {
3
4
  readonly __attribute: unique symbol;
4
5
  readonly __type: T;
6
+ readonly __marker: typeof marker;
5
7
  } & symbol;
8
+ export declare const attribute: <T>() => Attribute<T>;
9
+ export declare const isAttribute: (value: unknown) => value is Attribute<unknown>;
6
10
  export declare namespace Attribute {
7
11
  const create: <T>() => Attribute<T>;
8
12
  }
@@ -10,3 +14,4 @@ export declare class AttributesHolder {
10
14
  readonly get: (<T>(attribute: Attribute<T>) => T | undefined) & LuaExtension<"TableGetMethod">;
11
15
  readonly set: (<T>(attribute: Attribute<T>, value: T | undefined) => void) & LuaExtension<"TableSetMethod">;
12
16
  }
17
+ export {};
package/attributes.lua CHANGED
@@ -1,11 +1,18 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local ____exports = {}
4
+ local marker = {}
5
+ ____exports.attribute = function()
6
+ return {__marker = marker}
7
+ end
8
+ ____exports.isAttribute = function(value)
9
+ return type(value) == "table" and rawget(value, "__marker") == marker
10
+ end
4
11
  ____exports.Attribute = {}
5
12
  local Attribute = ____exports.Attribute
6
13
  do
7
14
  Attribute.create = function()
8
- return {}
15
+ return {__marker = marker}
9
16
  end
10
17
  end
11
18
  ____exports.AttributesHolder = __TS__Class()
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
@@ -15,6 +15,10 @@ local Event = ____event.Event
15
15
  local TriggerEvent = ____event.TriggerEvent
16
16
  local ____timer = require("core.types.timer")
17
17
  local Timer = ____timer.Timer
18
+ local ____frame_2Dcoordinates = require("engine.internal.misc.frame-coordinates")
19
+ local FRAME_MAX_Y = ____frame_2Dcoordinates.FRAME_MAX_Y
20
+ local FRAME_MIN_Y = ____frame_2Dcoordinates.FRAME_MIN_Y
21
+ local getFrameMinXMaxX = ____frame_2Dcoordinates.getFrameMinXMaxX
18
22
  local frameClick = BlzFrameClick
19
23
  local frameGetEnable = BlzFrameGetEnable
20
24
  local frameIsVisible = BlzFrameIsVisible
@@ -344,27 +348,21 @@ __TS__ObjectDefineProperty(
344
348
  Frame,
345
349
  "minX",
346
350
  {get = function(self)
347
- local w = BlzGetLocalClientWidth()
348
- local h = BlzGetLocalClientHeight()
349
- local width4by3 = (w - h / 600 * 800) / 2
350
- local pxtodpi = 0.6 / h
351
- return -width4by3 * pxtodpi
351
+ local minX = getFrameMinXMaxX()
352
+ return minX
352
353
  end}
353
354
  )
354
355
  __TS__ObjectDefineProperty(
355
356
  Frame,
356
357
  "maxX",
357
358
  {get = function(self)
358
- local w = BlzGetLocalClientWidth()
359
- local h = BlzGetLocalClientHeight()
360
- local width4by3 = (w - h / 600 * 800) / 2
361
- local pxtodpi = 0.6 / h
362
- return (-width4by3 + w) * pxtodpi
359
+ local ____, maxX = getFrameMinXMaxX()
360
+ return maxX
363
361
  end}
364
362
  )
365
363
  Frame.centerX = 0.4
366
- Frame.minY = 0
367
- Frame.maxY = 0.6
364
+ Frame.minY = FRAME_MIN_Y
365
+ Frame.maxY = FRAME_MAX_Y
368
366
  Frame.centerY = 0.3
369
367
  __TS__SetDescriptor(
370
368
  Frame.prototype,
@@ -21,6 +21,8 @@ local ____exception = require("exception")
21
21
  local IllegalStateException = ____exception.IllegalStateException
22
22
  local ____math = require("math")
23
23
  local MAXIMUM_INTEGER = ____math.MAXIMUM_INTEGER
24
+ local ____player_2Dlocal_2Dhandle = require("engine.internal.misc.player-local-handle")
25
+ local PLAYER_LOCAL_HANDLE = ____player_2Dlocal_2Dhandle.PLAYER_LOCAL_HANDLE
24
26
  local getPlayerColor = GetPlayerColor
25
27
  local getPlayerName = GetPlayerName
26
28
  local getPlayerTechCount = GetPlayerTechCount
@@ -249,7 +251,7 @@ Player.all = (function()
249
251
  end
250
252
  return all
251
253
  end)()
252
- Player["local"] = ____exports.Player:of(GetLocalPlayer())
254
+ Player["local"] = ____exports.Player:of(PLAYER_LOCAL_HANDLE)
253
255
  Player.neutralPassive = ____exports.Player.all[PLAYER_NEUTRAL_PASSIVE + 1]
254
256
  Player.neutralAggressive = ____exports.Player.all[PLAYER_NEUTRAL_AGGRESSIVE + 1]
255
257
  Player.neutralVictim = ____exports.Player.all[bj_PLAYER_NEUTRAL_VICTIM + 1]
@@ -1,4 +1,5 @@
1
1
  /** @noSelfInFile */
2
+ import type { Unit } from "../../engine/internal/unit";
2
3
  export declare class PlayerCamera {
3
4
  private readonly player;
4
5
  private readonly isLocal;
@@ -28,5 +29,6 @@ export declare class PlayerCamera {
28
29
  get roll(): number;
29
30
  set roll(v: number);
30
31
  reset(): void;
32
+ static isUnitInView(unit: Unit): boolean;
31
33
  static of(player: jplayer): PlayerCamera;
32
34
  }
@@ -3,33 +3,49 @@ local __TS__Class = ____lualib.__TS__Class
3
3
  local __TS__New = ____lualib.__TS__New
4
4
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
5
  local ____exports = {}
6
+ local ____timer = require("core.types.timer")
7
+ local Timer = ____timer.Timer
8
+ local ____player_2Dlocal_2Dhandle = require("engine.internal.misc.player-local-handle")
9
+ local PLAYER_LOCAL_HANDLE = ____player_2Dlocal_2Dhandle.PLAYER_LOCAL_HANDLE
10
+ local ____preconditions = require("utility.preconditions")
11
+ local check = ____preconditions.check
12
+ local ____frame_2Dcoordinates = require("engine.internal.misc.frame-coordinates")
13
+ local FRAME_MAX_Y = ____frame_2Dcoordinates.FRAME_MAX_Y
14
+ local FRAME_MIN_Y = ____frame_2Dcoordinates.FRAME_MIN_Y
15
+ local getFrameMinXMaxX = ____frame_2Dcoordinates.getFrameMinXMaxX
6
16
  local getHandleId = GetHandleId
7
17
  local setCameraField = SetCameraField
8
18
  local getCameraField = GetCameraField
9
19
  local setCameraPosition = SetCameraPosition
20
+ local getCameraEyePositionX = GetCameraEyePositionX
21
+ local getCameraEyePositionY = GetCameraEyePositionY
22
+ local getCameraEyePositionZ = GetCameraEyePositionZ
10
23
  local getCameraTargetPositionX = GetCameraTargetPositionX
11
24
  local getCameraTargetPositionY = GetCameraTargetPositionY
12
25
  local resetToGameCamera = ResetToGameCamera
26
+ local cos = math.cos
13
27
  local deg = math.deg
14
- local localPlayer = GetLocalPlayer()
28
+ local sin = math.sin
15
29
  local memoized = {}
16
30
  ____exports.PlayerCamera = __TS__Class()
17
31
  local PlayerCamera = ____exports.PlayerCamera
18
32
  PlayerCamera.name = "PlayerCamera"
19
33
  function PlayerCamera.prototype.____constructor(self, player)
20
34
  local id = getHandleId(player)
21
- if memoized[id] then
22
- error("Double-constructor run player camera!")
23
- end
35
+ check(memoized[id] == nil)
24
36
  memoized[id] = self
25
37
  self.player = player
26
- self.isLocal = player == localPlayer
38
+ self.isLocal = player == PLAYER_LOCAL_HANDLE
27
39
  end
28
40
  function PlayerCamera.prototype.reset(self)
29
41
  if self.isLocal then
30
42
  resetToGameCamera(0)
31
43
  end
32
44
  end
45
+ function PlayerCamera.isUnitInView(self, unit)
46
+ local ____, ____, isInView = ____exports.worldCoordinatesToFrame(unit.x, unit.y, unit.z)
47
+ return isInView
48
+ end
33
49
  function PlayerCamera.of(self, player)
34
50
  return memoized[getHandleId(player)] or __TS__New(____exports.PlayerCamera, player)
35
51
  end
@@ -159,4 +175,62 @@ __TS__SetDescriptor(
159
175
  },
160
176
  true
161
177
  )
178
+ local cameraEyeX = 0
179
+ local cameraEyeY = 0
180
+ local cameraEyeZ = 0
181
+ local cameraAngleOfAttack = 0
182
+ local cameraAngleOfAttackCos = 0
183
+ local cameraAngleOfAttackSin = 0
184
+ local cameraRotation = 0
185
+ local cameraRotationCos = 0
186
+ local cameraRotationSin = 0
187
+ local cameraAngleOfAttackCosRotationCos = 0
188
+ local cameraAngleOfAttackCosRotationSin = 0
189
+ local cameraAngleOfAttackSinRotationCos = 0
190
+ local cameraAngleOfAttackSinRotationSin = 0
191
+ local yCenterScreenShift = 0
192
+ local scaleFactor = 0
193
+ local frameMinX = 0
194
+ local frameMaxX = 0
195
+ local isCameraViewPrecalculated = false
196
+ local function precalculateCameraView()
197
+ cameraEyeX = getCameraEyePositionX()
198
+ cameraEyeY = getCameraEyePositionY()
199
+ cameraEyeZ = getCameraEyePositionZ()
200
+ cameraAngleOfAttack = getCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK)
201
+ cameraAngleOfAttackCos = cos(cameraAngleOfAttack)
202
+ cameraAngleOfAttackSin = sin(cameraAngleOfAttack)
203
+ cameraRotation = getCameraField(CAMERA_FIELD_ROTATION)
204
+ cameraRotationCos = cos(cameraRotation)
205
+ cameraRotationSin = sin(cameraRotation)
206
+ cameraAngleOfAttackCosRotationCos = cameraAngleOfAttackCos * cameraRotationCos
207
+ cameraAngleOfAttackCosRotationSin = cameraAngleOfAttackCos * cameraRotationSin
208
+ cameraAngleOfAttackSinRotationCos = cameraAngleOfAttackSin * cameraRotationCos
209
+ cameraAngleOfAttackSinRotationSin = cameraAngleOfAttackSin * cameraRotationSin
210
+ yCenterScreenShift = 0.1284 * cameraAngleOfAttackCos
211
+ local cameraFieldOfView = getCameraField(CAMERA_FIELD_FIELD_OF_VIEW)
212
+ scaleFactor = 0.0524 * cameraFieldOfView ^ 3 - 0.0283 * cameraFieldOfView ^ 2 + 1.061 * cameraFieldOfView
213
+ frameMinX, frameMaxX = getFrameMinXMaxX()
214
+ isCameraViewPrecalculated = true
215
+ end
216
+ Timer.onPeriod[1 / 64]:addListener(
217
+ 4,
218
+ function()
219
+ isCameraViewPrecalculated = false
220
+ end
221
+ )
222
+ ---
223
+ -- @internal For use by internal systems only.
224
+ ____exports.worldCoordinatesToFrame = function(x, y, z)
225
+ if not isCameraViewPrecalculated then
226
+ precalculateCameraView()
227
+ end
228
+ local dx = x - cameraEyeX
229
+ local dy = y - cameraEyeY
230
+ local dz = z - cameraEyeZ
231
+ local xPrime = scaleFactor * (-cameraAngleOfAttackCosRotationCos * dx - cameraAngleOfAttackCosRotationSin * dy - cameraAngleOfAttackSin * dz)
232
+ local frameX = 0.4 + (cameraRotationCos * dy - cameraRotationSin * dx) / xPrime
233
+ local frameY = 0.42625 - yCenterScreenShift + (cameraAngleOfAttackSinRotationCos * dx + cameraAngleOfAttackSinRotationSin * dy - cameraAngleOfAttackCos * dz) / xPrime
234
+ return frameX, frameY, xPrime < 0 and frameX >= frameMinX and frameX <= frameMaxX and frameY >= FRAME_MIN_Y and frameY <= FRAME_MAX_Y
235
+ end
162
236
  return ____exports
@@ -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,29 @@ 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)
124
+ ---
125
+ -- @internal For use by internal systems only.
126
+ ____exports.isSoundLabelCustom = function(label)
127
+ return customSoundPresetDataByLabel[label] ~= nil
128
+ end
110
129
  local function createPresetSound(fileName, preset)
111
130
  local ____fileName_1 = fileName
112
131
  local ____preset_looping_0 = preset.looping
@@ -120,7 +139,7 @@ local function createPresetSound(fileName, preset)
120
139
  true,
121
140
  preset.fadeInRate or 12700,
122
141
  preset.fadeOutRate or 12700,
123
- preset.eax or ____exports.SoundEax.Default
142
+ preset.eax or "DefaultEAXON"
124
143
  )
125
144
  setSoundChannel(sound, preset.channel or ____exports.SoundChannel.General)
126
145
  setSoundVolume(sound, preset.volume or 127)
@@ -143,7 +162,7 @@ local function createPreset3DSound(fileName, preset)
143
162
  ____preset_stopWhenOutOfRange_3,
144
163
  preset.fadeInRate or 12700,
145
164
  preset.fadeOutRate or 12700,
146
- preset.eax or ____exports.SoundEax.Default
165
+ preset.eax or "DefaultEAXON"
147
166
  )
148
167
  setSoundChannel(sound, preset.channel or ____exports.SoundChannel.General)
149
168
  setSoundVolume(sound, preset.volume or 127)
@@ -153,29 +172,51 @@ local function createPreset3DSound(fileName, preset)
153
172
  return sound
154
173
  end
155
174
  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
175
+ local customSoundPresetData = customSoundPresetDataByLabel[label]
176
+ if customSoundPresetData == nil then
177
+ local ____label_7 = label
178
+ local ____preset_looping_5 = preset.looping
179
+ if ____preset_looping_5 == nil then
180
+ ____preset_looping_5 = false
181
+ end
182
+ local ____preset_stopWhenOutOfRange_6 = preset.stopWhenOutOfRange
183
+ if ____preset_stopWhenOutOfRange_6 == nil then
184
+ ____preset_stopWhenOutOfRange_6 = true
185
+ end
186
+ return createSoundFromLabel(
187
+ ____label_7,
188
+ ____preset_looping_5,
189
+ true,
190
+ ____preset_stopWhenOutOfRange_6,
191
+ preset.fadeInRate or 12700,
192
+ preset.fadeOutRate or 12700
193
+ )
194
+ else
195
+ local ____customSoundPresetData_filePaths_index_10 = customSoundPresetData.filePaths[randomInteger(#customSoundPresetData.filePaths - 1) + 1]
196
+ local ____preset_looping_8 = preset.looping
197
+ if ____preset_looping_8 == nil then
198
+ ____preset_looping_8 = false
199
+ end
200
+ local ____preset_stopWhenOutOfRange_9 = preset.stopWhenOutOfRange
201
+ if ____preset_stopWhenOutOfRange_9 == nil then
202
+ ____preset_stopWhenOutOfRange_9 = true
203
+ end
204
+ local sound = createSound(
205
+ ____customSoundPresetData_filePaths_index_10,
206
+ ____preset_looping_8,
207
+ true,
208
+ ____preset_stopWhenOutOfRange_9,
209
+ preset.fadeInRate or 12700,
210
+ preset.fadeOutRate or 12700,
211
+ customSoundPresetData.eax
212
+ )
213
+ setSoundChannel(sound, customSoundPresetData.channel)
214
+ setSoundVolume(sound, customSoundPresetData.volume)
215
+ setSoundPitch(sound, customSoundPresetData.pitch)
216
+ setSoundDistances(sound, customSoundPresetData.minimumDistance, customSoundPresetData.maximumDistance)
217
+ setSoundDistanceCutoff(sound, customSoundPresetData.distanceCutoff)
218
+ return sound
164
219
  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
220
  end
180
221
  ____exports.Sound = __TS__Class()
181
222
  local Sound = ____exports.Sound
@@ -249,9 +290,13 @@ function Sound3D.playOnUnit(self, fileName, preset, unit)
249
290
  startSound(sound)
250
291
  killSoundWhenDone(sound)
251
292
  end
252
- function Sound3D.playFromLabel(self, label, preset, unit)
293
+ function Sound3D.playFromLabel(self, label, preset, unitOrX, y, z)
253
294
  local sound = createPreset3DSoundFromLabel(label, preset)
254
- attachSoundToUnit(sound, unit.handle)
295
+ if type(unitOrX) ~= "number" then
296
+ attachSoundToUnit(sound, unitOrX.handle)
297
+ else
298
+ setSoundPosition(sound, unitOrX, y or 0, z or 0)
299
+ end
255
300
  startSound(sound)
256
301
  killSoundWhenDone(sound)
257
302
  end