warscript 0.0.1-dev.6be8f21 → 0.0.1-dev.6c4635c

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/frame.lua +24 -21
  2. package/core/types/player.lua +3 -1
  3. package/core/types/playerCamera.d.ts +2 -0
  4. package/core/types/playerCamera.lua +123 -5
  5. package/core/types/tileCell.d.ts +9 -0
  6. package/core/types/tileCell.lua +92 -0
  7. package/core/types/timer.d.ts +3 -1
  8. package/core/types/timer.lua +27 -2
  9. package/decl/native.d.ts +6 -4
  10. package/engine/behavior.d.ts +3 -0
  11. package/engine/behavior.lua +63 -10
  12. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  13. package/engine/behaviour/ability/restore-mana.lua +6 -6
  14. package/engine/behaviour/unit/stun-immunity.d.ts +2 -0
  15. package/engine/behaviour/unit/stun-immunity.lua +11 -2
  16. package/engine/behaviour/unit.d.ts +8 -2
  17. package/engine/behaviour/unit.lua +29 -2
  18. package/engine/buff.d.ts +0 -3
  19. package/engine/buff.lua +59 -80
  20. package/engine/internal/ability.d.ts +3 -1
  21. package/engine/internal/ability.lua +26 -9
  22. package/engine/internal/item+owner.lua +12 -6
  23. package/engine/internal/item.d.ts +13 -15
  24. package/engine/internal/item.lua +63 -49
  25. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  26. package/engine/internal/misc/frame-coordinates.lua +21 -0
  27. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  28. package/engine/internal/misc/get-terrain-z.lua +11 -0
  29. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  30. package/engine/internal/misc/player-local-handle.lua +5 -0
  31. package/engine/internal/unit/ability.d.ts +14 -14
  32. package/engine/internal/unit/ability.lua +72 -45
  33. package/engine/internal/unit+ability.lua +10 -1
  34. package/engine/internal/unit-missile-launch.lua +18 -5
  35. package/engine/internal/unit.d.ts +5 -5
  36. package/engine/internal/unit.lua +27 -17
  37. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  38. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  39. package/engine/object-data/entry/ability-type.lua +5 -4
  40. package/engine/object-data/entry/unit-type.d.ts +11 -2
  41. package/engine/object-data/entry/unit-type.lua +59 -1
  42. package/engine/object-field/ability.d.ts +3 -3
  43. package/engine/object-field/ability.lua +7 -6
  44. package/engine/object-field.d.ts +2 -2
  45. package/engine/object-field.lua +8 -6
  46. package/engine/random.d.ts +9 -0
  47. package/engine/random.lua +13 -0
  48. package/engine/text-tag.d.ts +1 -1
  49. package/engine/text-tag.lua +91 -17
  50. package/objutil/buff.lua +1 -1
  51. package/package.json +2 -2
  52. package/patch-lualib.lua +1 -1
  53. package/utility/arrays.d.ts +1 -0
  54. package/utility/arrays.lua +8 -0
  55. package/utility/callback-array.d.ts +17 -0
  56. package/utility/callback-array.lua +61 -0
  57. package/utility/functions.d.ts +2 -0
  58. package/utility/functions.lua +7 -0
  59. package/utility/lua-maps.d.ts +11 -2
  60. package/utility/lua-maps.lua +33 -2
  61. package/utility/lua-sets.d.ts +1 -0
  62. package/utility/lua-sets.lua +4 -0
  63. package/utility/types.d.ts +3 -0
@@ -0,0 +1,46 @@
1
+ local ____exports = {}
2
+ local ____records = require("utility.records")
3
+ local invertRecord = ____records.invertRecord
4
+ local stringByArmorType = {
5
+ [0] = "small",
6
+ [1] = "medium",
7
+ [2] = "large",
8
+ [3] = "fort",
9
+ [4] = "normal",
10
+ [5] = "hero",
11
+ [6] = "divine",
12
+ [7] = "none"
13
+ }
14
+ local armorTypeByString = invertRecord(stringByArmorType)
15
+ local nativeByArmorType = {
16
+ [0] = DEFENSE_TYPE_LIGHT,
17
+ [1] = DEFENSE_TYPE_MEDIUM,
18
+ [2] = DEFENSE_TYPE_LARGE,
19
+ [3] = DEFENSE_TYPE_FORT,
20
+ [4] = DEFENSE_TYPE_NORMAL,
21
+ [5] = DEFENSE_TYPE_HERO,
22
+ [6] = DEFENSE_TYPE_DIVINE,
23
+ [7] = DEFENSE_TYPE_NONE
24
+ }
25
+ local armorTypeByNative = invertRecord(nativeByArmorType)
26
+ ---
27
+ -- @internal For use by internal systems only.
28
+ ____exports.armorTypeToString = function(armorType)
29
+ return stringByArmorType[armorType]
30
+ end
31
+ ---
32
+ -- @internal For use by internal systems only.
33
+ ____exports.stringToArmorType = function(____string)
34
+ return armorTypeByString[____string] or 7
35
+ end
36
+ ---
37
+ -- @internal For use by internal systems only.
38
+ ____exports.armorTypeToNative = function(armorType)
39
+ return nativeByArmorType[armorType]
40
+ end
41
+ ---
42
+ -- @internal For use by internal systems only.
43
+ ____exports.nativeToArmorType = function(armorType)
44
+ return armorTypeByNative[armorType]
45
+ end
46
+ return ____exports
@@ -38,6 +38,8 @@ local ____sound = require("core.types.sound")
38
38
  local isSoundLabelCustom = ____sound.isSoundLabelCustom
39
39
  local Sound3D = ____sound.Sound3D
40
40
  local SoundSettings = ____sound.SoundSettings
41
+ local ____lua_2Dsets = require("utility.lua-sets")
42
+ local luaSetOf = ____lua_2Dsets.luaSetOf
41
43
  local castAnimationFQNByAbilityTypeId = {}
42
44
  local isButtonVisibleFalseAbilityTypes = {}
43
45
  local casterCastingEffectPresetsByAbilityTypeId = {}
@@ -979,9 +981,7 @@ for abilityTypeId, animationFQN in pairs(postcompile(function() return castAnima
979
981
  4,
980
982
  function(caster, ability)
981
983
  if ability:getField(ABILITY_RLF_CASTING_TIME) ~= 0 then
982
- Timer:run(function()
983
- caster:playAnimation(animationFQN)
984
- end)
984
+ Timer:run(caster, "playAnimation", animationFQN)
985
985
  end
986
986
  end
987
987
  )
@@ -1006,9 +1006,10 @@ for abilityTypeId, soundPresetId in pairs(postcompile(function() return targetEf
1006
1006
  )
1007
1007
  end
1008
1008
  end
1009
+ local unsupportedEffectSoundAbilityTypeIds = luaSetOf(fourCC("AAns"))
1009
1010
  Unit.abilityChannelingStartEvent:addListener(function(caster, ability)
1010
1011
  local soundPresetId = ability:getField(ABILITY_SF_EFFECT_SOUND)
1011
- if isSoundLabelCustom(soundPresetId) then
1012
+ if isSoundLabelCustom(soundPresetId) or soundPresetId ~= "" and unsupportedEffectSoundAbilityTypeIds[ability.parentTypeId] ~= nil then
1012
1013
  Sound3D:playFromLabel(soundPresetId, SoundSettings.Ability, caster)
1013
1014
  end
1014
1015
  end)
@@ -13,6 +13,7 @@ import type { AbilityTypeId } from "./ability-type";
13
13
  import type { UpgradeId } from "./upgrade";
14
14
  import { AnimationQualifier } from "../auxiliary/animation-qualifier";
15
15
  import { AttackType } from "../auxiliary/attack-type";
16
+ import { ArmorType } from "../auxiliary/armor-type";
16
17
  export type UnitTypeId = ObjectDataEntryId & number & {
17
18
  readonly __unitTypeId: unique symbol;
18
19
  };
@@ -144,6 +145,8 @@ export declare abstract class UnitType<Id extends UnitTypeId = UnitTypeId> exten
144
145
  set runSpeedSD(runSpeedSD: number);
145
146
  get runSpeedHD(): number;
146
147
  set runSpeedHD(runSpeedHD: number);
148
+ get selectionCircleHeight(): number;
149
+ set selectionCircleHeight(height: number);
147
150
  get selectionCircleScale(): number;
148
151
  set selectionCircleScale(selectionCircleScale: number);
149
152
  get selectionCircleScaleSD(): number;
@@ -182,16 +185,20 @@ export declare abstract class UnitType<Id extends UnitTypeId = UnitTypeId> exten
182
185
  set walkSpeedSD(walkSpeedSD: number);
183
186
  get walkSpeedHD(): number;
184
187
  set walkSpeedHD(walkSpeedHD: number);
188
+ get armor(): number;
189
+ set armor(armor: number);
185
190
  get armorSoundType(): ArmorSoundType;
186
191
  set armorSoundType(armorSoundType: ArmorSoundType);
187
192
  get armorSoundTypeSD(): ArmorSoundType;
188
193
  set armorSoundTypeSD(armorSoundTypeSD: ArmorSoundType);
189
194
  get armorSoundTypeHD(): ArmorSoundType;
190
195
  set armorSoundTypeHD(armorSoundTypeHD: ArmorSoundType);
196
+ get armorType(): ArmorType;
197
+ set armorType(armorType: ArmorType);
191
198
  get combatClassifications(): CombatClassifications;
192
199
  set combatClassifications(combatClassifications: CombatClassifications);
193
- get unitClassifications(): UnitClassifications;
194
- set unitClassifications(unitClassifications: UnitClassifications);
200
+ get classifications(): UnitClassifications;
201
+ set classifications(unitClassifications: UnitClassifications);
195
202
  get weapons(): TupleOf<UnitTypeWeapon, 2>;
196
203
  get firstWeapon(): UnitTypeWeapon;
197
204
  get secondWeapon(): UnitTypeWeapon;
@@ -225,6 +232,8 @@ export declare abstract class UnitType<Id extends UnitTypeId = UnitTypeId> exten
225
232
  set goldCost(goldCost: number);
226
233
  get healthRegenerationRate(): number;
227
234
  set healthRegenerationRate(healthRegenerationRate: number);
235
+ get level(): number;
236
+ set level(level: number);
228
237
  get manaRegenerationRate(): number;
229
238
  set manaRegenerationRate(manaRegenerationRate: number);
230
239
  get maximumHealth(): number;
@@ -27,6 +27,9 @@ local attackTypeToString = ____attack_2Dtype.attackTypeToString
27
27
  local stringToAttackType = ____attack_2Dtype.stringToAttackType
28
28
  local ____config = require("config")
29
29
  local WarscriptConfig = ____config.WarscriptConfig
30
+ local ____armor_2Dtype = require("engine.object-data.auxiliary.armor-type")
31
+ local armorTypeToString = ____armor_2Dtype.armorTypeToString
32
+ local stringToArmorType = ____armor_2Dtype.stringToArmorType
30
33
  local getOrCreateUnitTypeWeapons
31
34
  ____exports.UnitTypeWeapon = __TS__Class()
32
35
  local UnitTypeWeapon = ____exports.UnitTypeWeapon
@@ -936,6 +939,19 @@ __TS__SetDescriptor(
936
939
  },
937
940
  true
938
941
  )
942
+ __TS__SetDescriptor(
943
+ UnitType.prototype,
944
+ "selectionCircleHeight",
945
+ {
946
+ get = function(self)
947
+ return self:getNumberField("uslz")
948
+ end,
949
+ set = function(self, height)
950
+ self:setNumberField("uslz", height)
951
+ end
952
+ },
953
+ true
954
+ )
939
955
  __TS__SetDescriptor(
940
956
  UnitType.prototype,
941
957
  "selectionCircleScale",
@@ -1183,6 +1199,19 @@ __TS__SetDescriptor(
1183
1199
  },
1184
1200
  true
1185
1201
  )
1202
+ __TS__SetDescriptor(
1203
+ UnitType.prototype,
1204
+ "armor",
1205
+ {
1206
+ get = function(self)
1207
+ return self:getNumberField("udef")
1208
+ end,
1209
+ set = function(self, armor)
1210
+ self:setNumberField("udef", armor)
1211
+ end
1212
+ },
1213
+ true
1214
+ )
1186
1215
  __TS__SetDescriptor(
1187
1216
  UnitType.prototype,
1188
1217
  "armorSoundType",
@@ -1222,6 +1251,22 @@ __TS__SetDescriptor(
1222
1251
  },
1223
1252
  true
1224
1253
  )
1254
+ __TS__SetDescriptor(
1255
+ UnitType.prototype,
1256
+ "armorType",
1257
+ {
1258
+ get = function(self)
1259
+ return stringToArmorType(self:getStringField("udty"))
1260
+ end,
1261
+ set = function(self, armorType)
1262
+ self:setStringField(
1263
+ "udty",
1264
+ armorTypeToString(armorType)
1265
+ )
1266
+ end
1267
+ },
1268
+ true
1269
+ )
1225
1270
  __TS__SetDescriptor(
1226
1271
  UnitType.prototype,
1227
1272
  "combatClassifications",
@@ -1240,7 +1285,7 @@ __TS__SetDescriptor(
1240
1285
  )
1241
1286
  __TS__SetDescriptor(
1242
1287
  UnitType.prototype,
1243
- "unitClassifications",
1288
+ "classifications",
1244
1289
  {
1245
1290
  get = function(self)
1246
1291
  return stringArrayToUnitClassifications(self:getStringsField("utyp"))
@@ -1476,6 +1521,19 @@ __TS__SetDescriptor(
1476
1521
  },
1477
1522
  true
1478
1523
  )
1524
+ __TS__SetDescriptor(
1525
+ UnitType.prototype,
1526
+ "level",
1527
+ {
1528
+ get = function(self)
1529
+ return self:getNumberField("ulev")
1530
+ end,
1531
+ set = function(self, level)
1532
+ self:setNumberField("ulev", level)
1533
+ end
1534
+ },
1535
+ true
1536
+ )
1479
1537
  __TS__SetDescriptor(
1480
1538
  UnitType.prototype,
1481
1539
  "manaRegenerationRate",
@@ -12,7 +12,7 @@ import { ReadonlyNonEmptyLinkedSet } from "../../utility/linked-set";
12
12
  export declare abstract class AbilityField<ValueType extends number | string | boolean = number | string | boolean, NativeFieldType extends jabilityfield = jabilityfield> extends ObjectField<AbilityType, Ability, ValueType, NativeFieldType> {
13
13
  protected get instanceClass(): typeof Ability;
14
14
  protected getObjectDataEntryId(instance: Ability): AbilityTypeId;
15
- protected hasNativeFieldValue(instance: Ability): boolean;
15
+ protected hasNativeFieldValue(abilityTypeId: AbilityTypeId): boolean;
16
16
  static get valueChangeEvent(): ObjectFieldValueChangeEvent<ReadonlyObjectFieldType<AbilityField>>;
17
17
  }
18
18
  export declare class AbilityBooleanField extends AbilityField<boolean, jabilitybooleanfield> {
@@ -48,7 +48,7 @@ export declare class AbilityStringField extends AbilityField<string, jabilitystr
48
48
  export declare abstract class AbilityArrayField<ValueType extends number | string | boolean = number | string | boolean, NativeFieldType extends jabilityfield = jabilityfield> extends ObjectArrayField<AbilityType, Ability, ValueType, NativeFieldType> {
49
49
  protected get instanceClass(): typeof Ability;
50
50
  protected getObjectDataEntryId(instance: Ability): AbilityTypeId;
51
- protected hasNativeFieldValue(instance: Ability): boolean;
51
+ protected hasNativeFieldValue(abilityTypeId: AbilityTypeId): boolean;
52
52
  }
53
53
  export declare class AbilityStringArrayField extends AbilityArrayField<string, jabilitystringlevelfield> {
54
54
  protected get defaultValue(): string;
@@ -68,7 +68,7 @@ export declare abstract class AbilityLevelField<ValueType extends number | strin
68
68
  protected get instanceClass(): typeof Ability;
69
69
  protected getLevelCount(entry: AbilityType | Ability): number;
70
70
  protected getObjectDataEntryId(instance: Ability): AbilityTypeId;
71
- protected hasNativeFieldValue(instance: Ability): boolean;
71
+ protected hasNativeFieldValue(abilityTypeId: AbilityTypeId): boolean;
72
72
  static get valueChangeEvent(): ObjectLevelFieldValueChangeEvent<ReadonlyObjectLevelFieldType<AbilityLevelField>>;
73
73
  }
74
74
  export declare class AbilityBooleanLevelField extends AbilityLevelField<boolean, boolean, jabilityintegerlevelfield> {
@@ -7,6 +7,7 @@ local __TS__InstanceOf = ____lualib.__TS__InstanceOf
7
7
  local ____exports = {}
8
8
  local ____ability = require("engine.internal.ability")
9
9
  local Ability = ____ability.Ability
10
+ local abilityTypeHasField = ____ability.abilityTypeHasField
10
11
  local ____object_2Dfield = require("engine.object-field")
11
12
  local ObjectArrayField = ____object_2Dfield.ObjectArrayField
12
13
  local ObjectField = ____object_2Dfield.ObjectField
@@ -29,8 +30,8 @@ __TS__ClassExtends(AbilityField, ObjectField)
29
30
  function AbilityField.prototype.getObjectDataEntryId(self, instance)
30
31
  return instance.typeId
31
32
  end
32
- function AbilityField.prototype.hasNativeFieldValue(self, instance)
33
- return instance:hasField(self.nativeField)
33
+ function AbilityField.prototype.hasNativeFieldValue(self, abilityTypeId)
34
+ return abilityTypeHasField(abilityTypeId, self.nativeField)
34
35
  end
35
36
  __TS__SetDescriptor(
36
37
  AbilityField.prototype,
@@ -197,8 +198,8 @@ __TS__ClassExtends(AbilityArrayField, ObjectArrayField)
197
198
  function AbilityArrayField.prototype.getObjectDataEntryId(self, instance)
198
199
  return instance.typeId
199
200
  end
200
- function AbilityArrayField.prototype.hasNativeFieldValue(self, instance)
201
- return instance:hasField(self.nativeField)
201
+ function AbilityArrayField.prototype.hasNativeFieldValue(self, abilityTypeId)
202
+ return abilityTypeHasField(abilityTypeId, self.nativeField)
202
203
  end
203
204
  __TS__SetDescriptor(
204
205
  AbilityArrayField.prototype,
@@ -269,8 +270,8 @@ end
269
270
  function AbilityLevelField.prototype.getObjectDataEntryId(self, instance)
270
271
  return instance.typeId
271
272
  end
272
- function AbilityLevelField.prototype.hasNativeFieldValue(self, instance)
273
- return instance:hasField(self.nativeField)
273
+ function AbilityLevelField.prototype.hasNativeFieldValue(self, abilityTypeId)
274
+ return abilityTypeHasField(abilityTypeId, self.nativeField)
274
275
  end
275
276
  __TS__SetDescriptor(
276
277
  AbilityLevelField.prototype,
@@ -17,8 +17,8 @@ declare abstract class ObjectFieldBase<ObjectDataEntryType extends ObjectDataEnt
17
17
  readonly id: ObjectFieldId;
18
18
  protected abstract getNativeFieldById(id: number): NativeFieldType;
19
19
  protected abstract getObjectDataEntryId(instance: InstanceType): ObjectDataEntryIdType<ObjectDataEntryType>;
20
- protected abstract hasNativeFieldValue(instance: InstanceType): boolean;
21
- hasValue(instance: InstanceType): boolean;
20
+ protected abstract hasNativeFieldValue(objectDataEntryId: ObjectDataEntryIdType<ObjectDataEntryType>): boolean;
21
+ hasValue(objectDataEntryId: ObjectDataEntryIdType<ObjectDataEntryType>): boolean;
22
22
  constructor(id: number, isGlobal?: boolean);
23
23
  static create<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldConstructor<T>, id?: number, isGlobal?: boolean): T & symbol;
24
24
  static of<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldAbstractConstructor<T>, id: number): T | undefined;
@@ -58,9 +58,9 @@ end
58
58
  function ObjectFieldBase.prototype.supports(self, instance)
59
59
  return __TS__InstanceOf(instance, self.instanceClass)
60
60
  end
61
- function ObjectFieldBase.prototype.hasValue(self, instance)
61
+ function ObjectFieldBase.prototype.hasValue(self, objectDataEntryId)
62
62
  local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
63
- return self.isGlobal or defaultValueByObjectDataEntryId ~= nil and defaultValueByObjectDataEntryId[self:getObjectDataEntryId(instance)] ~= nil or self:hasNativeFieldValue(instance)
63
+ return self.isGlobal or defaultValueByObjectDataEntryId ~= nil and defaultValueByObjectDataEntryId[objectDataEntryId] ~= nil or self:hasNativeFieldValue(objectDataEntryId)
64
64
  end
65
65
  function ObjectFieldBase.create(self, id, isGlobal)
66
66
  return __TS__New(
@@ -215,8 +215,9 @@ function ObjectField.prototype.getActualValue(self, instance)
215
215
  end
216
216
  function ObjectField.prototype.setActualValue(self, instance, value)
217
217
  local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
218
+ local objectDataEntryId = self:getObjectDataEntryId(instance)
218
219
  if defaultValueByObjectDataEntryId ~= nil or self.isGlobal then
219
- local defaultValue = (defaultValueByObjectDataEntryId or emptyLuaMap())[self:getObjectDataEntryId(instance)]
220
+ local defaultValue = (defaultValueByObjectDataEntryId or emptyLuaMap())[objectDataEntryId]
220
221
  if defaultValue ~= nil or self.isGlobal then
221
222
  local ____self_valueByInstance_instance_3 = self.valueByInstance[instance]
222
223
  if ____self_valueByInstance_instance_3 == nil then
@@ -234,7 +235,7 @@ function ObjectField.prototype.setActualValue(self, instance, value)
234
235
  return true
235
236
  end
236
237
  end
237
- if not self:hasNativeFieldValue(instance) then
238
+ if not self:hasNativeFieldValue(objectDataEntryId) then
238
239
  return false
239
240
  end
240
241
  local previousValue = self:getNativeFieldValue(instance)
@@ -460,8 +461,9 @@ function ObjectLevelField.prototype.setValue(self, entry, levelOrValue, value)
460
461
  return true
461
462
  end
462
463
  local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
464
+ local objectDataEntryId = self:getObjectDataEntryId(entry)
463
465
  if defaultValueByObjectDataEntryId ~= nil or self.isGlobal then
464
- local defaultValueByLevel = (defaultValueByObjectDataEntryId or emptyLuaMap())[self:getObjectDataEntryId(entry)]
466
+ local defaultValueByLevel = (defaultValueByObjectDataEntryId or emptyLuaMap())[objectDataEntryId]
465
467
  if defaultValueByLevel ~= nil or self.isGlobal then
466
468
  local valueByLevel = self.valueByInstance[entry]
467
469
  if valueByLevel == nil then
@@ -490,7 +492,7 @@ function ObjectLevelField.prototype.setValue(self, entry, levelOrValue, value)
490
492
  return true
491
493
  end
492
494
  end
493
- if not self:hasNativeFieldValue(entry) then
495
+ if not self:hasNativeFieldValue(objectDataEntryId) then
494
496
  return false
495
497
  end
496
498
  local previousValue = self:getNativeFieldValue(entry, level)
@@ -1,4 +1,5 @@
1
1
  /** @noSelfInFile */
2
+ import { ReadonlyNonEmptyArray } from "../utility/types";
2
3
  export declare const randomAngle: () => number;
3
4
  export declare const randomInteger: {
4
5
  (upperBound?: number): number;
@@ -9,3 +10,11 @@ export declare const randomFloat: {
9
10
  (lowerBound: number, upperBound: number): number;
10
11
  };
11
12
  export declare const randomXY: (centerX: number, centerY: number, range: number) => LuaMultiReturn<[x: number, y: number]>;
13
+ export declare const randomElement: {
14
+ <T>(array: ReadonlyNonEmptyArray<T>): T;
15
+ <T>(array: ReadonlyArray<T>): T | undefined;
16
+ };
17
+ export declare const random: {
18
+ <T>(element: T, ...elements: T[]): T;
19
+ <T>(...elements: T[]): T | undefined;
20
+ };
package/engine/random.lua CHANGED
@@ -4,6 +4,7 @@ local MAXIMUM_INTEGER = ____math.MAXIMUM_INTEGER
4
4
  local PI = ____math.PI
5
5
  local getRandomInt = GetRandomInt
6
6
  local getRandomReal = GetRandomReal
7
+ local select = _G.select
7
8
  local cos = math.cos
8
9
  local sin = math.sin
9
10
  local sqrt = math.sqrt
@@ -15,4 +16,16 @@ ____exports.randomXY = function(centerX, centerY, range)
15
16
  local t = getRandomReal(0, 1) * 2 * PI
16
17
  return centerX + r * cos(t), centerY + r * sin(t)
17
18
  end
19
+ ____exports.randomElement = function(array)
20
+ return array[getRandomInt(1, #array)]
21
+ end
22
+ ____exports.random = function(...)
23
+ return (select(
24
+ getRandomInt(
25
+ 1,
26
+ select("#", ...)
27
+ ),
28
+ ...
29
+ ))
30
+ end
18
31
  return ____exports
@@ -23,7 +23,7 @@ declare const enum TextTagPropertyKey {
23
23
  Y = 107
24
24
  }
25
25
  export declare class TextTag extends AbstractDestroyable {
26
- private readonly [TextTagPropertyKey.HANDLE];
26
+ private [TextTagPropertyKey.HANDLE]?;
27
27
  private [TextTagPropertyKey.CONFIGURATION]?;
28
28
  private [TextTagPropertyKey.TEXT]?;
29
29
  private [TextTagPropertyKey.FONT_SIZE]?;
@@ -11,6 +11,12 @@ local ____timer = require("core.types.timer")
11
11
  local Timer = ____timer.Timer
12
12
  local ____destroyable = require("destroyable")
13
13
  local AbstractDestroyable = ____destroyable.AbstractDestroyable
14
+ local ____playerCamera = require("core.types.playerCamera")
15
+ local worldCoordinatesToFrame = ____playerCamera.worldCoordinatesToFrame
16
+ local ____get_2Dterrain_2Dz = require("engine.internal.misc.get-terrain-z")
17
+ local getTerrainZ = ____get_2Dterrain_2Dz.getTerrainZ
18
+ local ____player_2Dlocal_2Dhandle = require("engine.internal.misc.player-local-handle")
19
+ local PLAYER_LOCAL_HANDLE = ____player_2Dlocal_2Dhandle.PLAYER_LOCAL_HANDLE
14
20
  local createTextTag = CreateTextTag
15
21
  local destroyTextTag = DestroyTextTag
16
22
  local setTextTagText = SetTextTagText
@@ -24,6 +30,12 @@ local setTextTagPermanent = SetTextTagPermanent
24
30
  local setTextTagAge = SetTextTagAge
25
31
  local setTextTagLifespan = SetTextTagLifespan
26
32
  local setTextTagFadepoint = SetTextTagFadepoint
33
+ local isUnitHidden = IsUnitHidden
34
+ local isUnitLoaded = IsUnitLoaded
35
+ local isUnitVisible = IsUnitVisible
36
+ local getUnitFlyHeight = GetUnitFlyHeight
37
+ local getUnitX = GetUnitX
38
+ local getUnitY = GetUnitY
27
39
  local DEFAULT_FONT_SIZE = 0.024
28
40
  local function applyConfiguration(textTag, configuration)
29
41
  setTextTagFadepoint(textTag, configuration.fadepoint)
@@ -41,6 +53,33 @@ local function applyConfiguration(textTag, configuration)
41
53
  setTextTagVisibility(textTag, true)
42
54
  end
43
55
  local unitTextTags = setmetatable({}, {__mode = "k"})
56
+ local function ensureHandle(textTag)
57
+ local handle = textTag[101]
58
+ if handle == nil then
59
+ handle = createTextTag()
60
+ applyConfiguration(handle, textTag[102])
61
+ setTextTagPermanent(handle, true)
62
+ setTextTagText(handle, textTag[103] or "", textTag[104] or DEFAULT_FONT_SIZE)
63
+ local color = textTag[105]
64
+ if color ~= nil then
65
+ setTextTagColor(
66
+ handle,
67
+ color.r,
68
+ color.g,
69
+ color.b,
70
+ color.a
71
+ )
72
+ end
73
+ local unit = textTag[100]
74
+ if unit ~= nil then
75
+ setTextTagPosUnit(handle, unit.handle, textTag[102].offsetZ)
76
+ else
77
+ setTextTagPos(handle, textTag[106] or 0, textTag[107] or 0, 0)
78
+ end
79
+ textTag[101] = handle
80
+ end
81
+ return handle
82
+ end
44
83
  ____exports.TextTag = __TS__Class()
45
84
  local TextTag = ____exports.TextTag
46
85
  TextTag.name = "TextTag"
@@ -50,7 +89,11 @@ function TextTag.prototype.____constructor(self, handle)
50
89
  self[101] = handle
51
90
  end
52
91
  function TextTag.prototype.onDestroy(self)
53
- destroyTextTag(self[101])
92
+ local handle = self[101]
93
+ if handle ~= nil then
94
+ destroyTextTag(handle)
95
+ self[101] = nil
96
+ end
54
97
  unitTextTags[self] = nil
55
98
  return AbstractDestroyable.prototype.onDestroy(self)
56
99
  end
@@ -61,14 +104,11 @@ function TextTag.flash(self, configuration, text, x, y, z)
61
104
  applyConfiguration(textTag, configuration)
62
105
  end
63
106
  function TextTag.create(self, configuration, text, unit)
64
- local handle = createTextTag()
65
- setTextTagText(handle, text, DEFAULT_FONT_SIZE)
66
- setTextTagPosUnit(handle, unit.handle, configuration.offsetZ)
67
- applyConfiguration(handle, configuration)
68
- setTextTagPermanent(handle, true)
69
- local textTag = __TS__New(____exports.TextTag, handle)
107
+ local textTag = __TS__New(____exports.TextTag)
108
+ textTag[103] = text
70
109
  textTag[100] = unit
71
110
  textTag[102] = configuration
111
+ ensureHandle(textTag)
72
112
  unitTextTags[textTag] = true
73
113
  return textTag
74
114
  end
@@ -80,7 +120,11 @@ __TS__SetDescriptor(
80
120
  return self[103] or ""
81
121
  end,
82
122
  set = function(self, text)
83
- setTextTagText(self[101], text, self[104] or DEFAULT_FONT_SIZE)
123
+ setTextTagText(
124
+ ensureHandle(self),
125
+ text,
126
+ self[104] or DEFAULT_FONT_SIZE
127
+ )
84
128
  self[103] = text
85
129
  end
86
130
  },
@@ -94,7 +138,11 @@ __TS__SetDescriptor(
94
138
  return self[104] or DEFAULT_FONT_SIZE
95
139
  end,
96
140
  set = function(self, fontSize)
97
- setTextTagText(self[101], self[103] or "", DEFAULT_FONT_SIZE)
141
+ setTextTagText(
142
+ ensureHandle(self),
143
+ self[103] or "",
144
+ fontSize
145
+ )
98
146
  self[104] = fontSize
99
147
  end
100
148
  },
@@ -109,7 +157,7 @@ __TS__SetDescriptor(
109
157
  end,
110
158
  set = function(self, color)
111
159
  setTextTagColor(
112
- self[101],
160
+ ensureHandle(self),
113
161
  color.r,
114
162
  color.g,
115
163
  color.b,
@@ -129,7 +177,11 @@ __TS__SetDescriptor(
129
177
  end,
130
178
  set = function(self, unit)
131
179
  if unit ~= nil then
132
- setTextTagPosUnit(self[101], unit.handle, 0)
180
+ setTextTagPosUnit(
181
+ ensureHandle(self),
182
+ unit.handle,
183
+ 0
184
+ )
133
185
  self[106] = nil
134
186
  self[107] = nil
135
187
  unitTextTags[self] = true
@@ -137,7 +189,12 @@ __TS__SetDescriptor(
137
189
  local unit = self[100]
138
190
  local x = unit.x
139
191
  local y = unit.y
140
- setTextTagPos(self[101], x, y, 0)
192
+ setTextTagPos(
193
+ ensureHandle(self),
194
+ x,
195
+ y,
196
+ 0
197
+ )
141
198
  self[106] = x
142
199
  self[107] = y
143
200
  unitTextTags[self] = nil
@@ -160,14 +217,14 @@ __TS__SetDescriptor(
160
217
  return ____self__106_2 or 0
161
218
  end,
162
219
  set = function(self, x)
163
- local ____self__101_6 = self[101]
220
+ local ____ensureHandle_result_6 = ensureHandle(self)
164
221
  local ____x_7 = x
165
222
  local ____self__107_5 = self[107]
166
223
  if ____self__107_5 == nil then
167
224
  local ____opt_3 = self[100]
168
225
  ____self__107_5 = ____opt_3 and ____opt_3.y
169
226
  end
170
- setTextTagPos(____self__101_6, ____x_7, ____self__107_5 or 0, 0)
227
+ setTextTagPos(____ensureHandle_result_6, ____x_7, ____self__107_5 or 0, 0)
171
228
  self[106] = x
172
229
  self[100] = nil
173
230
  unitTextTags[self] = nil
@@ -188,13 +245,13 @@ __TS__SetDescriptor(
188
245
  return ____self__107_10 or 0
189
246
  end,
190
247
  set = function(self, y)
191
- local ____self__101_14 = self[101]
248
+ local ____ensureHandle_result_14 = ensureHandle(self)
192
249
  local ____self__106_13 = self[106]
193
250
  if ____self__106_13 == nil then
194
251
  local ____opt_11 = self[100]
195
252
  ____self__106_13 = ____opt_11 and ____opt_11.x
196
253
  end
197
- setTextTagPos(____self__101_14, ____self__106_13 or 0, y, 0)
254
+ setTextTagPos(____ensureHandle_result_14, ____self__106_13 or 0, y, 0)
198
255
  self[107] = y
199
256
  self[100] = nil
200
257
  unitTextTags[self] = nil
@@ -268,7 +325,24 @@ TextTag.SHADOW_STRIKE = __TS__ObjectAssign(
268
325
  )
269
326
  Timer.onPeriod[1 / 64]:addListener(function()
270
327
  for textTag in pairs(unitTextTags) do
271
- setTextTagPosUnit(textTag[101], textTag[100].handle, textTag[102].offsetZ)
328
+ local unit = textTag[100].handle
329
+ local x = getUnitX(unit)
330
+ local y = getUnitY(unit)
331
+ local ____, ____, isInView = worldCoordinatesToFrame(
332
+ x,
333
+ y,
334
+ getUnitFlyHeight(unit) + getTerrainZ(x, y)
335
+ )
336
+ if isInView and not isUnitHidden(unit) and not isUnitLoaded(unit) and isUnitVisible(unit, PLAYER_LOCAL_HANDLE) then
337
+ setTextTagPosUnit(
338
+ ensureHandle(textTag),
339
+ unit,
340
+ textTag[102].offsetZ
341
+ )
342
+ elseif textTag[101] ~= nil then
343
+ destroyTextTag(textTag[101])
344
+ textTag[101] = nil
345
+ end
272
346
  end
273
347
  end)
274
348
  return ____exports
package/objutil/buff.lua CHANGED
@@ -762,7 +762,7 @@ Unit.onDamaging:addListener(function(source, target, event)
762
762
  end
763
763
  end)
764
764
  Unit.itemPickedUpEvent:addListener(function(unit, item)
765
- if item.powerup and item:hasAbility(fourCC("APdi")) then
765
+ if item.isPowerUp and item:hasAbility(fourCC("APdi")) then
766
766
  end
767
767
  end)
768
768
  return ____exports
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "warscript",
4
- "version": "0.0.1-dev.6be8f21",
4
+ "version": "0.0.1-dev.6c4635c",
5
5
  "description": "A typescript library for Warcraft III using Warpack.",
6
6
  "keywords": [
7
7
  "warcraft",
@@ -24,7 +24,7 @@
24
24
  "@warscript/language-extensions": "^0.0.1",
25
25
  "@warscript/tstl-plugin": "^0.0.4",
26
26
  "lua-types": "^2.13.1",
27
- "warpack": "0.0.1-dev.fa5e065"
27
+ "warpack": "0.0.1-dev.251db08"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@typescript-eslint/eslint-plugin": "^8.13.0",
package/patch-lualib.lua CHANGED
@@ -3,7 +3,7 @@ local lualib = _G.require("lualib_bundle")
3
3
  local next = _G.next
4
4
  local ____type = _G.type
5
5
  lualib.__TS__ArrayIsArray = function(value)
6
- return ____type(value) == "table" and (value[1] ~= nil or ({next(value)}) == nil) and value.constructor == nil
6
+ return ____type(value) == "table" and (value[1] ~= nil or (next(value)) == nil) and value.constructor == nil
7
7
  end
8
8
  local __TS__SetDescriptor = lualib.__TS__SetDescriptor
9
9
  lualib.__TS__ObjectDefineProperty = function(target, key, desc)
@@ -5,6 +5,7 @@ export declare const joinToString: <T>(array: readonly T[], separator: string, t
5
5
  export declare const arrayOfNotNull: <T>(...elements: readonly (T | undefined | null)[]) => T[];
6
6
  export declare const array: <T, N extends number>(length: N, initialize: (index: number) => T) => TupleOf<T, N>;
7
7
  export declare const toLuaSet: <T extends AnyNotNil>(array: readonly T[]) => LuaSet<T>;
8
+ export declare const contains: <T>(array: readonly T[], element: T) => boolean;
8
9
  export declare const forEach: <T, Args extends any[]>(array: readonly T[], consumerOrKey: ((value: T, ...args: Args) => void) | KeysOfType<T, (this: T, ...args: Args) => void>, ...args: Args) => void;
9
10
  export declare const all: {
10
11
  <T>(array: readonly T[], transform: (value: T) => boolean): boolean;