warscript 0.0.1-dev.4cfb266 → 0.0.1-dev.4f51f48

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 (101) hide show
  1. package/attributes.d.ts +6 -0
  2. package/attributes.lua +17 -1
  3. package/core/types/frame.lua +24 -21
  4. package/core/types/player.d.ts +15 -0
  5. package/core/types/player.lua +56 -14
  6. package/core/types/playerCamera.d.ts +2 -0
  7. package/core/types/playerCamera.lua +123 -5
  8. package/core/types/tileCell.d.ts +11 -1
  9. package/core/types/tileCell.lua +97 -0
  10. package/core/types/timer.d.ts +3 -1
  11. package/core/types/timer.lua +27 -2
  12. package/decl/native.d.ts +6 -4
  13. package/engine/behavior.d.ts +5 -0
  14. package/engine/behavior.lua +106 -27
  15. package/engine/behaviour/ability/apply-buff.lua +1 -1
  16. package/engine/behaviour/ability/damage.d.ts +4 -2
  17. package/engine/behaviour/ability/damage.lua +24 -36
  18. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  19. package/engine/behaviour/ability/emulate-impact.lua +11 -3
  20. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  21. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  22. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  23. package/engine/behaviour/ability/restore-mana.lua +6 -6
  24. package/engine/behaviour/ability.lua +8 -17
  25. package/engine/behaviour/unit/stun-immunity.d.ts +7 -3
  26. package/engine/behaviour/unit/stun-immunity.lua +52 -27
  27. package/engine/behaviour/unit.d.ts +33 -1
  28. package/engine/behaviour/unit.lua +190 -4
  29. package/engine/buff.d.ts +12 -5
  30. package/engine/buff.lua +125 -87
  31. package/engine/internal/ability.d.ts +7 -1
  32. package/engine/internal/ability.lua +49 -9
  33. package/engine/internal/item/ability.lua +63 -11
  34. package/engine/internal/item+owner.lua +12 -6
  35. package/engine/internal/item.d.ts +16 -16
  36. package/engine/internal/item.lua +135 -49
  37. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  38. package/engine/internal/misc/frame-coordinates.lua +21 -0
  39. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  40. package/engine/internal/misc/get-terrain-z.lua +11 -0
  41. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  42. package/engine/internal/misc/player-local-handle.lua +5 -0
  43. package/engine/internal/unit/ability.d.ts +35 -0
  44. package/engine/internal/unit/ability.lua +98 -9
  45. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  46. package/engine/internal/unit/allowed-targets.lua +9 -1
  47. package/engine/internal/unit/fly-height.d.ts +7 -0
  48. package/engine/internal/unit/fly-height.lua +20 -0
  49. package/engine/internal/unit/main-selected.lua +12 -27
  50. package/engine/internal/unit/order.d.ts +20 -0
  51. package/engine/internal/unit/order.lua +136 -0
  52. package/engine/internal/unit/scale.d.ts +7 -0
  53. package/engine/internal/unit/scale.lua +20 -0
  54. package/engine/internal/unit+ability.lua +10 -1
  55. package/engine/internal/unit-missile-launch.lua +45 -14
  56. package/engine/internal/unit.d.ts +29 -18
  57. package/engine/internal/unit.lua +257 -140
  58. package/engine/local-client.d.ts +2 -0
  59. package/engine/local-client.lua +30 -0
  60. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  61. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  62. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  63. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  64. package/engine/object-data/entry/ability-type.lua +5 -4
  65. package/engine/object-data/entry/unit-type.d.ts +11 -2
  66. package/engine/object-data/entry/unit-type.lua +59 -1
  67. package/engine/object-field/ability.d.ts +3 -3
  68. package/engine/object-field/ability.lua +7 -6
  69. package/engine/object-field/unit.d.ts +24 -1
  70. package/engine/object-field/unit.lua +91 -0
  71. package/engine/object-field.d.ts +15 -6
  72. package/engine/object-field.lua +219 -124
  73. package/engine/random.d.ts +9 -0
  74. package/engine/random.lua +13 -0
  75. package/engine/standard/fields/unit.d.ts +6 -0
  76. package/engine/standard/fields/unit.lua +11 -0
  77. package/engine/synchronization.d.ts +11 -0
  78. package/engine/synchronization.lua +77 -0
  79. package/engine/text-tag.d.ts +36 -2
  80. package/engine/text-tag.lua +250 -10
  81. package/engine/unit.d.ts +3 -0
  82. package/engine/unit.lua +3 -0
  83. package/net/socket.lua +1 -1
  84. package/objutil/buff.lua +1 -1
  85. package/package.json +2 -2
  86. package/patch-lualib.lua +1 -1
  87. package/utility/arrays.d.ts +1 -0
  88. package/utility/arrays.lua +8 -0
  89. package/utility/callback-array.d.ts +17 -0
  90. package/utility/callback-array.lua +61 -0
  91. package/utility/functions.d.ts +7 -0
  92. package/utility/functions.lua +12 -0
  93. package/utility/linked-set.d.ts +1 -0
  94. package/utility/linked-set.lua +19 -1
  95. package/utility/lua-maps.d.ts +12 -2
  96. package/utility/lua-maps.lua +37 -2
  97. package/utility/lua-sets.d.ts +1 -0
  98. package/utility/lua-sets.lua +4 -0
  99. package/utility/types.d.ts +3 -0
  100. package/core/types/order.d.ts +0 -25
  101. package/core/types/order.lua +0 -55
@@ -5,9 +5,10 @@ import { ObjectDataEntry, ObjectDataEntryIdType, ObjectDataEntryLevelFieldValueS
5
5
  export type ObjectFieldId = number & {
6
6
  readonly __objectDataEntryFieldId: unique symbol;
7
7
  };
8
- export type ObjectFieldConstructor<T extends ObjectFieldBase<any, any, any, any>> = OmitConstructor<typeof ObjectFieldBase> & (new (id: number) => T);
8
+ export type ObjectFieldConstructor<T extends ObjectFieldBase<any, any, any, any>> = OmitConstructor<typeof ObjectFieldBase> & (new (id: number, isGlobal?: boolean) => T);
9
9
  export type ObjectFieldAbstractConstructor<T extends ObjectFieldBase<any, any, any, any>> = OmitConstructor<typeof ObjectFieldBase> & (abstract new (id: number) => T);
10
10
  declare abstract class ObjectFieldBase<ObjectDataEntryType extends ObjectDataEntry, InstanceType extends AnyNotNil, ValueType, NativeFieldType> {
11
+ readonly isGlobal: boolean;
11
12
  protected abstract readonly instanceClass: AbstractConstructor<InstanceType> | Function;
12
13
  supports(instance: AnyNotNil): instance is InstanceType & {
13
14
  readonly __oneSidedTypeGuard: unique symbol;
@@ -16,10 +17,10 @@ declare abstract class ObjectFieldBase<ObjectDataEntryType extends ObjectDataEnt
16
17
  readonly id: ObjectFieldId;
17
18
  protected abstract getNativeFieldById(id: number): NativeFieldType;
18
19
  protected abstract getObjectDataEntryId(instance: InstanceType): ObjectDataEntryIdType<ObjectDataEntryType>;
19
- protected abstract hasNativeFieldValue(instance: InstanceType): boolean;
20
- hasValue(instance: InstanceType): boolean;
21
- constructor(id: number);
22
- static create<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldConstructor<T>, id?: number): T & symbol;
20
+ protected abstract hasNativeFieldValue(objectDataEntryId: ObjectDataEntryIdType<ObjectDataEntryType>): boolean;
21
+ hasValue(objectDataEntryId: ObjectDataEntryIdType<ObjectDataEntryType>): boolean;
22
+ constructor(id: number, isGlobal?: boolean);
23
+ static create<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldConstructor<T>, id?: number, isGlobal?: boolean): T & symbol;
23
24
  static of<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldAbstractConstructor<T>, id: number): T | undefined;
24
25
  }
25
26
  export type ObjectFieldValueChangeEvent<T extends ObjectField<any, any, any, any> | ReadonlyObjectFieldType<ObjectField<any, any, any, any>>> = T extends ObjectField<any, infer InstanceType, infer ValueType, any> ? DispatchingEvent<[
@@ -35,7 +36,8 @@ export type ObjectFieldValueChangeEvent<T extends ObjectField<any, any, any, any
35
36
  ]> : never;
36
37
  export type ReadonlyObjectFieldType<T extends ObjectField<any, any, any, any>> = Omit<T, "setValue" | "removeValue" | "trySetValue">;
37
38
  type ReadonlyObjectFieldConstructor<T extends ObjectField> = OmitConstructor<typeof ObjectField> & (abstract new (...args: any[]) => ReadonlyObjectFieldType<T>);
38
- type ObjectFieldModifier<InstanceType extends AnyNotNil, ValueType extends number | string | boolean> = (instance: InstanceType, currentValue: ValueType, originalValue: ValueType) => ValueType;
39
+ export type ObjectFieldModifier<InstanceType extends AnyNotNil, ValueType extends number | string | boolean> = (instance: InstanceType, currentValue: ValueType, originalValue: ValueType) => ValueType;
40
+ export type ObjectLevelFieldModifier<InstanceType extends AnyNotNil, ValueType extends number | string | boolean> = (instance: InstanceType, level: number, currentValue: ValueType, originalValue: ValueType) => ValueType;
39
41
  export declare abstract class ObjectField<ObjectDataEntryType extends ObjectDataEntry = ObjectDataEntry, InstanceType extends AnyNotNil = AnyNotNil, ValueType extends number | string | boolean = number | string | boolean, NativeFieldType = unknown> extends ObjectFieldBase<ObjectDataEntryType, InstanceType, ValueType, NativeFieldType> {
40
42
  protected abstract readonly defaultValue: ValueType;
41
43
  protected abstract getNativeFieldValue(instance: InstanceType): ValueType;
@@ -79,13 +81,20 @@ export declare abstract class ObjectArrayField<ObjectDataEntryType extends Objec
79
81
  setValue(entry: ObjectDataEntryType | InstanceType, value: ValueType[]): boolean;
80
82
  }
81
83
  export declare abstract class ObjectLevelField<ObjectDataEntryType extends ObjectDataEntry = ObjectDataEntry, InstanceType extends AnyNotNil = AnyNotNil, ValueType extends number | string | boolean = number | string | boolean, InputValueType extends ValueType = never, NativeFieldType = unknown> extends ObjectFieldBase<ObjectDataEntryType, InstanceType, ValueType[], NativeFieldType> {
84
+ private originalValueByLevelByInstance?;
85
+ private modifiersByInstance?;
82
86
  protected abstract readonly defaultValue: ValueType;
83
87
  protected abstract getNativeFieldValue(instance: InstanceType, level: number): ValueType;
84
88
  protected abstract setNativeFieldValue(instance: InstanceType, level: number, value: ValueType): boolean;
85
89
  protected abstract getLevelCount(entry: ObjectDataEntryType | InstanceType): number;
86
90
  getValue<LevelType extends [number] | []>(entry: ObjectDataEntryType | InstanceType, ...[level]: LevelType): LevelType extends [number] ? ValueType : ValueType[];
87
91
  setValue(entry: ObjectDataEntryType | InstanceType, ...[levelOrValue, value]: [value: ObjectDataEntryLevelFieldValueSupplier<InputValueType, ValueType>] | [level: number, value: InputValueType]): boolean;
92
+ applyModifier(instance: InstanceType, modifier: ObjectLevelFieldModifier<InstanceType, ValueType>): void;
93
+ removeModifier(instance: InstanceType, modifier: ObjectLevelFieldModifier<InstanceType, ValueType>): boolean;
88
94
  trySetValue(entry: ObjectDataEntryType | InstanceType, levelOrValue: number | unknown, value?: unknown): boolean;
95
+ private getActualValue;
96
+ private setActualValue;
97
+ private calculateActualValue;
89
98
  private invokeValueChangeEvent;
90
99
  private invokeValueChangeEventRecursive;
91
100
  protected static getOrCreateValueChangeEvent<T extends ObjectLevelField, R extends ReadonlyObjectLevelFieldType<T>>(this: ReadonlyObjectLevelFieldConstructor<T>): ObjectLevelFieldValueChangeEvent<R>;
@@ -23,8 +23,12 @@ local ObjectDataEntryIdGenerator = ____object_2Ddata_2Dentry_2Did_2Dgenerator.Ob
23
23
  local ____linked_2Dset = require("utility.linked-set")
24
24
  local mutableLinkedSet = ____linked_2Dset.mutableLinkedSet
25
25
  local ____lua_2Dmaps = require("utility.lua-maps")
26
+ local emptyLuaMap = ____lua_2Dmaps.emptyLuaMap
26
27
  local getOrPut = ____lua_2Dmaps.getOrPut
28
+ local mutableLuaMap = ____lua_2Dmaps.mutableLuaMap
27
29
  local mutableWeakLuaMap = ____lua_2Dmaps.mutableWeakLuaMap
30
+ local ____arrays = require("utility.arrays")
31
+ local emptyArray = ____arrays.emptyArray
28
32
  local compiletimeDefaultValueByObjectDataEntryIdByObjectFieldId = {}
29
33
  local defaultValueByObjectDataEntryIdByObjectFieldId = postcompile(function() return compiletimeDefaultValueByObjectDataEntryIdByObjectFieldId end)
30
34
  local objectFieldById = {}
@@ -34,7 +38,11 @@ local idGenerator = __TS__New(
34
38
  )
35
39
  local ObjectFieldBase = __TS__Class()
36
40
  ObjectFieldBase.name = "ObjectFieldBase"
37
- function ObjectFieldBase.prototype.____constructor(self, id)
41
+ function ObjectFieldBase.prototype.____constructor(self, id, isGlobal)
42
+ if isGlobal == nil then
43
+ isGlobal = false
44
+ end
45
+ self.isGlobal = isGlobal
38
46
  self.valueByInstance = setmetatable({}, {__mode = "k"})
39
47
  if objectFieldById[id] ~= nil then
40
48
  error(
@@ -51,14 +59,15 @@ end
51
59
  function ObjectFieldBase.prototype.supports(self, instance)
52
60
  return __TS__InstanceOf(instance, self.instanceClass)
53
61
  end
54
- function ObjectFieldBase.prototype.hasValue(self, instance)
62
+ function ObjectFieldBase.prototype.hasValue(self, objectDataEntryId)
55
63
  local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
56
- return defaultValueByObjectDataEntryId ~= nil and defaultValueByObjectDataEntryId[self:getObjectDataEntryId(instance)] ~= nil or self:hasNativeFieldValue(instance)
64
+ return self.isGlobal or defaultValueByObjectDataEntryId ~= nil and defaultValueByObjectDataEntryId[objectDataEntryId] ~= nil or self:hasNativeFieldValue(objectDataEntryId)
57
65
  end
58
- function ObjectFieldBase.create(self, id)
66
+ function ObjectFieldBase.create(self, id, isGlobal)
59
67
  return __TS__New(
60
68
  self,
61
- id or idGenerator:next()
69
+ id or idGenerator:next(),
70
+ isGlobal
62
71
  )
63
72
  end
64
73
  function ObjectFieldBase.of(self, id)
@@ -142,7 +151,13 @@ function ObjectField.prototype.applyModifier(self, instance, modifier)
142
151
  originalValueByInstance = mutableWeakLuaMap()
143
152
  self.originalValueByInstance = originalValueByInstance
144
153
  end
145
- originalValueByInstance[instance] = self:getActualValue(instance)
154
+ local ____originalValueByInstance_1 = originalValueByInstance
155
+ local ____instance_2 = instance
156
+ local ____originalValueByInstance_instance_0 = originalValueByInstance[instance]
157
+ if ____originalValueByInstance_instance_0 == nil then
158
+ ____originalValueByInstance_instance_0 = self:getActualValue(instance)
159
+ end
160
+ ____originalValueByInstance_1[____instance_2] = ____originalValueByInstance_instance_0
146
161
  self:setActualValue(
147
162
  instance,
148
163
  self:calculateActualValue(instance)
@@ -185,60 +200,61 @@ function ObjectField.prototype.trySetValue(self, entry, value)
185
200
  end
186
201
  function ObjectField.prototype.getActualValue(self, instance)
187
202
  local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
188
- if defaultValueByObjectDataEntryId ~= nil then
189
- local defaultValue = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(instance)]
190
- if defaultValue ~= nil then
191
- local ____self_valueByInstance_instance_0 = self.valueByInstance[instance]
192
- if ____self_valueByInstance_instance_0 == nil then
193
- ____self_valueByInstance_instance_0 = defaultValue
203
+ if defaultValueByObjectDataEntryId ~= nil or self.isGlobal then
204
+ local defaultValue = (defaultValueByObjectDataEntryId or emptyLuaMap())[self:getObjectDataEntryId(instance)]
205
+ if defaultValue ~= nil or self.isGlobal then
206
+ local ____self_valueByInstance_instance_3 = self.valueByInstance[instance]
207
+ if ____self_valueByInstance_instance_3 == nil then
208
+ ____self_valueByInstance_instance_3 = defaultValue
194
209
  end
195
- return ____self_valueByInstance_instance_0
210
+ local ____self_valueByInstance_instance_3_4 = ____self_valueByInstance_instance_3
211
+ if ____self_valueByInstance_instance_3_4 == nil then
212
+ ____self_valueByInstance_instance_3_4 = self.defaultValue
213
+ end
214
+ return ____self_valueByInstance_instance_3_4
196
215
  end
197
216
  end
198
- local ____temp_1 = self:getNativeFieldValue(instance)
199
- if ____temp_1 == nil then
200
- ____temp_1 = self.defaultValue
217
+ local ____temp_5 = self:getNativeFieldValue(instance)
218
+ if ____temp_5 == nil then
219
+ ____temp_5 = self.defaultValue
201
220
  end
202
- return ____temp_1
221
+ return ____temp_5
203
222
  end
204
223
  function ObjectField.prototype.setActualValue(self, instance, value)
205
224
  local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
206
- if defaultValueByObjectDataEntryId ~= nil then
207
- local defaultValue = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(instance)]
208
- if defaultValue ~= nil then
209
- local ____self_valueByInstance_instance_2 = self.valueByInstance[instance]
210
- if ____self_valueByInstance_instance_2 == nil then
211
- ____self_valueByInstance_instance_2 = defaultValue
212
- end
213
- local ____self_valueByInstance_instance_2_3 = ____self_valueByInstance_instance_2
214
- if ____self_valueByInstance_instance_2_3 == nil then
215
- ____self_valueByInstance_instance_2_3 = self.defaultValue
225
+ local objectDataEntryId = self:getObjectDataEntryId(instance)
226
+ if defaultValueByObjectDataEntryId ~= nil or self.isGlobal then
227
+ local defaultValue = (defaultValueByObjectDataEntryId or emptyLuaMap())[objectDataEntryId]
228
+ if defaultValue ~= nil or self.isGlobal then
229
+ local ____self_valueByInstance_instance_6 = self.valueByInstance[instance]
230
+ if ____self_valueByInstance_instance_6 == nil then
231
+ ____self_valueByInstance_instance_6 = defaultValue
216
232
  end
217
- local previousValue = ____self_valueByInstance_instance_2_3
218
- if value ~= previousValue then
219
- self.valueByInstance[instance] = value
220
- self:invokeValueChangeEvent(instance, self, previousValue, value)
233
+ local ____self_valueByInstance_instance_6_7 = ____self_valueByInstance_instance_6
234
+ if ____self_valueByInstance_instance_6_7 == nil then
235
+ ____self_valueByInstance_instance_6_7 = self.defaultValue
221
236
  end
237
+ local previousValue = ____self_valueByInstance_instance_6_7
238
+ self.valueByInstance[instance] = value
239
+ self:invokeValueChangeEvent(instance, self, previousValue, value)
222
240
  return true
223
241
  end
224
242
  end
225
- if not self:hasNativeFieldValue(instance) then
243
+ if not self:hasNativeFieldValue(objectDataEntryId) then
226
244
  return false
227
245
  end
228
246
  local previousValue = self:getNativeFieldValue(instance)
229
- if value ~= previousValue then
230
- if not self:setNativeFieldValue(instance, value) then
231
- return false
232
- end
233
- self:invokeValueChangeEvent(instance, self, previousValue, value)
247
+ if value ~= previousValue and not self:setNativeFieldValue(instance, value) then
248
+ return false
234
249
  end
250
+ self:invokeValueChangeEvent(instance, self, previousValue, value)
235
251
  return true
236
252
  end
237
253
  function ObjectField.prototype.calculateActualValue(self, instance)
238
- local ____opt_4 = self.originalValueByInstance
239
- local originalValue = ____opt_4 and ____opt_4[instance]
240
- local ____opt_6 = self.modifiersByInstance
241
- local modifiers = ____opt_6 and ____opt_6[instance]
254
+ local ____opt_8 = self.originalValueByInstance
255
+ local originalValue = ____opt_8 and ____opt_8[instance]
256
+ local ____opt_10 = self.modifiersByInstance
257
+ local modifiers = ____opt_10 and ____opt_10[instance]
242
258
  if originalValue ~= nil then
243
259
  local value = originalValue
244
260
  if modifiers ~= nil then
@@ -303,37 +319,37 @@ function ObjectArrayField.prototype.getValue(self, entry, index)
303
319
  if defaultValueByObjectDataEntryId ~= nil then
304
320
  local value = defaultValueByObjectDataEntryId[entry.id]
305
321
  if value ~= nil then
306
- local ____temp_9
322
+ local ____temp_13
307
323
  if index == nil then
308
- ____temp_9 = value
324
+ ____temp_13 = value
309
325
  else
310
- local ____value_index_8 = value[index + 1]
311
- if ____value_index_8 == nil then
312
- ____value_index_8 = self.defaultValue
326
+ local ____value_index_12 = value[index + 1]
327
+ if ____value_index_12 == nil then
328
+ ____value_index_12 = self.defaultValue
313
329
  end
314
- ____temp_9 = ____value_index_8
330
+ ____temp_13 = ____value_index_12
315
331
  end
316
- return ____temp_9
332
+ return ____temp_13
317
333
  end
318
334
  end
319
335
  return index == nil and ({}) or self.defaultValue
320
336
  end
321
337
  local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
322
- if defaultValueByObjectDataEntryId ~= nil then
323
- local defaultValue = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(entry)]
324
- if defaultValue ~= nil then
325
- local value = self.valueByInstance[entry] or defaultValue
326
- local ____temp_11
338
+ if defaultValueByObjectDataEntryId ~= nil or self.isGlobal then
339
+ local defaultValue = (defaultValueByObjectDataEntryId or emptyLuaMap())[self:getObjectDataEntryId(entry)]
340
+ if defaultValue ~= nil or self.isGlobal then
341
+ local value = self.valueByInstance[entry] or defaultValue or emptyArray()
342
+ local ____temp_15
327
343
  if index == nil then
328
- ____temp_11 = value
344
+ ____temp_15 = value
329
345
  else
330
- local ____value_index_10 = value[index + 1]
331
- if ____value_index_10 == nil then
332
- ____value_index_10 = self.defaultValue
346
+ local ____value_index_14 = value[index + 1]
347
+ if ____value_index_14 == nil then
348
+ ____value_index_14 = self.defaultValue
333
349
  end
334
- ____temp_11 = ____value_index_10
350
+ ____temp_15 = ____value_index_14
335
351
  end
336
- return ____temp_11
352
+ return ____temp_15
337
353
  end
338
354
  end
339
355
  if index ~= nil then
@@ -378,36 +394,16 @@ function ObjectLevelField.prototype.getValue(self, entry, level)
378
394
  if defaultValueByObjectDataEntryId ~= nil then
379
395
  local valueByLevel = defaultValueByObjectDataEntryId[entry.id]
380
396
  if valueByLevel ~= nil then
381
- local ____valueByLevel_index_12 = valueByLevel[level + 1]
382
- if ____valueByLevel_index_12 == nil then
383
- ____valueByLevel_index_12 = self.defaultValue
397
+ local ____valueByLevel_index_16 = valueByLevel[level + 1]
398
+ if ____valueByLevel_index_16 == nil then
399
+ ____valueByLevel_index_16 = self.defaultValue
384
400
  end
385
- return ____valueByLevel_index_12
401
+ return ____valueByLevel_index_16
386
402
  end
387
403
  end
388
404
  return self.defaultValue
389
405
  end
390
- local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
391
- if defaultValueByObjectDataEntryId ~= nil then
392
- local defaultValueByLevel = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(entry)]
393
- if defaultValueByLevel ~= nil then
394
- local ____opt_13 = self.valueByInstance[entry]
395
- local ____temp_15 = ____opt_13 and ____opt_13[level + 1]
396
- if ____temp_15 == nil then
397
- ____temp_15 = defaultValueByLevel[level + 1]
398
- end
399
- local ____temp_15_16 = ____temp_15
400
- if ____temp_15_16 == nil then
401
- ____temp_15_16 = self.defaultValue
402
- end
403
- return ____temp_15_16
404
- end
405
- end
406
- local ____temp_17 = self:getNativeFieldValue(entry, level)
407
- if ____temp_17 == nil then
408
- ____temp_17 = self.defaultValue
409
- end
410
- return ____temp_17
406
+ return self:getActualValue(entry, level)
411
407
  end
412
408
  function ObjectLevelField.prototype.setValue(self, entry, levelOrValue, value)
413
409
  if value == nil then
@@ -447,54 +443,66 @@ function ObjectLevelField.prototype.setValue(self, entry, levelOrValue, value)
447
443
  valueByLevel[level + 1] = value
448
444
  return true
449
445
  end
450
- local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
451
- if defaultValueByObjectDataEntryId ~= nil then
452
- local defaultValueByLevel = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(entry)]
453
- if defaultValueByLevel ~= nil then
454
- local valueByLevel = self.valueByInstance[entry]
455
- if valueByLevel == nil then
456
- valueByLevel = {}
457
- self.valueByInstance[entry] = valueByLevel
458
- end
459
- local ____valueByLevel_index_18 = valueByLevel[level + 1]
460
- if ____valueByLevel_index_18 == nil then
461
- ____valueByLevel_index_18 = defaultValueByLevel[level + 1]
446
+ local modifiersByInstance = self.modifiersByInstance
447
+ if modifiersByInstance ~= nil then
448
+ local modifiers = modifiersByInstance[entry]
449
+ if modifiers ~= nil and modifiers.size ~= 0 then
450
+ local originalValueByLevelByInstance = self.originalValueByLevelByInstance
451
+ if originalValueByLevelByInstance == nil then
452
+ originalValueByLevelByInstance = mutableWeakLuaMap()
453
+ self.originalValueByLevelByInstance = originalValueByLevelByInstance
462
454
  end
463
- local ____valueByLevel_index_18_19 = ____valueByLevel_index_18
464
- if ____valueByLevel_index_18_19 == nil then
465
- ____valueByLevel_index_18_19 = self.defaultValue
455
+ getOrPut(originalValueByLevelByInstance, entry, mutableLuaMap)[level] = value
456
+ value = self:calculateActualValue(entry, level)
457
+ end
458
+ end
459
+ return self:setActualValue(entry, level, value)
460
+ end
461
+ function ObjectLevelField.prototype.applyModifier(self, instance, modifier)
462
+ local modifiersByInstance = self.modifiersByInstance
463
+ if modifiersByInstance == nil then
464
+ modifiersByInstance = mutableWeakLuaMap()
465
+ self.modifiersByInstance = modifiersByInstance
466
+ end
467
+ if getOrPut(modifiersByInstance, instance, mutableLinkedSet):add(modifier) then
468
+ local originalValueByLevelByInstance = self.originalValueByLevelByInstance
469
+ if originalValueByLevelByInstance == nil then
470
+ originalValueByLevelByInstance = mutableWeakLuaMap()
471
+ self.originalValueByLevelByInstance = originalValueByLevelByInstance
472
+ end
473
+ local originalValueByLevel = getOrPut(originalValueByLevelByInstance, instance, mutableLuaMap)
474
+ local levelCount = self:getLevelCount(instance)
475
+ for level = 0, levelCount - 1 do
476
+ local ____originalValueByLevel_level_17 = originalValueByLevel[level]
477
+ if ____originalValueByLevel_level_17 == nil then
478
+ ____originalValueByLevel_level_17 = self:getActualValue(instance, level)
466
479
  end
467
- local previousValue = ____valueByLevel_index_18_19
468
- if value ~= previousValue then
469
- valueByLevel[level + 1] = value
470
- self:invokeValueChangeEvent(
471
- entry,
472
- self,
480
+ originalValueByLevel[level] = ____originalValueByLevel_level_17
481
+ self:setActualValue(
482
+ instance,
483
+ level,
484
+ self:calculateActualValue(instance, level)
485
+ )
486
+ end
487
+ end
488
+ end
489
+ function ObjectLevelField.prototype.removeModifier(self, instance, modifier)
490
+ local modifiersByInstance = self.modifiersByInstance
491
+ if modifiersByInstance ~= nil then
492
+ local modifiers = modifiersByInstance[instance]
493
+ if modifiers ~= nil and modifiers:remove(modifier) then
494
+ local levelCount = self:getLevelCount(instance)
495
+ for level = 0, levelCount - 1 do
496
+ self:setActualValue(
497
+ instance,
473
498
  level,
474
- previousValue,
475
- value
499
+ self:calculateActualValue(instance, level)
476
500
  )
477
501
  end
478
502
  return true
479
503
  end
480
504
  end
481
- if not self:hasNativeFieldValue(entry) then
482
- return false
483
- end
484
- local previousValue = self:getNativeFieldValue(entry, level)
485
- if value ~= previousValue then
486
- if not self:setNativeFieldValue(entry, level, value) then
487
- return false
488
- end
489
- self:invokeValueChangeEvent(
490
- entry,
491
- self,
492
- level,
493
- previousValue,
494
- value
495
- )
496
- end
497
- return true
505
+ return false
498
506
  end
499
507
  function ObjectLevelField.prototype.trySetValue(self, entry, levelOrValue, value)
500
508
  if value ~= nil then
@@ -511,6 +519,93 @@ function ObjectLevelField.prototype.trySetValue(self, entry, levelOrValue, value
511
519
  end
512
520
  return self:setValue(entry, levelOrValue)
513
521
  end
522
+ function ObjectLevelField.prototype.getActualValue(self, instance, level)
523
+ local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
524
+ if defaultValueByObjectDataEntryId ~= nil or self.isGlobal then
525
+ local defaultValueByLevel = (defaultValueByObjectDataEntryId or emptyLuaMap())[self:getObjectDataEntryId(instance)]
526
+ if defaultValueByLevel ~= nil or self.isGlobal then
527
+ local ____opt_18 = self.valueByInstance[instance]
528
+ local ____temp_20 = ____opt_18 and ____opt_18[level + 1]
529
+ if ____temp_20 == nil then
530
+ ____temp_20 = (defaultValueByLevel or emptyArray())[level + 1]
531
+ end
532
+ local ____temp_20_21 = ____temp_20
533
+ if ____temp_20_21 == nil then
534
+ ____temp_20_21 = self.defaultValue
535
+ end
536
+ return ____temp_20_21
537
+ end
538
+ end
539
+ local ____temp_22 = self:getNativeFieldValue(instance, level)
540
+ if ____temp_22 == nil then
541
+ ____temp_22 = self.defaultValue
542
+ end
543
+ return ____temp_22
544
+ end
545
+ function ObjectLevelField.prototype.setActualValue(self, instance, level, value)
546
+ local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
547
+ local objectDataEntryId = self:getObjectDataEntryId(instance)
548
+ if defaultValueByObjectDataEntryId ~= nil or self.isGlobal then
549
+ local defaultValueByLevel = (defaultValueByObjectDataEntryId or emptyLuaMap())[objectDataEntryId]
550
+ if defaultValueByLevel ~= nil or self.isGlobal then
551
+ local valueByLevel = self.valueByInstance[instance]
552
+ if valueByLevel == nil then
553
+ valueByLevel = {}
554
+ self.valueByInstance[instance] = valueByLevel
555
+ end
556
+ local ____valueByLevel_index_23 = valueByLevel[level + 1]
557
+ if ____valueByLevel_index_23 == nil then
558
+ ____valueByLevel_index_23 = (defaultValueByLevel or emptyArray())[level + 1]
559
+ end
560
+ local ____valueByLevel_index_23_24 = ____valueByLevel_index_23
561
+ if ____valueByLevel_index_23_24 == nil then
562
+ ____valueByLevel_index_23_24 = self.defaultValue
563
+ end
564
+ local previousValue = ____valueByLevel_index_23_24
565
+ valueByLevel[level + 1] = value
566
+ self:invokeValueChangeEvent(
567
+ instance,
568
+ self,
569
+ level,
570
+ previousValue,
571
+ value
572
+ )
573
+ return true
574
+ end
575
+ end
576
+ if not self:hasNativeFieldValue(objectDataEntryId) then
577
+ return false
578
+ end
579
+ local previousValue = self:getNativeFieldValue(instance, level)
580
+ if value ~= previousValue and not self:setNativeFieldValue(instance, level, value) then
581
+ return false
582
+ end
583
+ self:invokeValueChangeEvent(
584
+ instance,
585
+ self,
586
+ level,
587
+ previousValue,
588
+ value
589
+ )
590
+ return true
591
+ end
592
+ function ObjectLevelField.prototype.calculateActualValue(self, instance, level)
593
+ local ____opt_27 = self.originalValueByLevelByInstance
594
+ local ____opt_25 = ____opt_27 and ____opt_27[instance]
595
+ local originalValue = ____opt_25 and ____opt_25[level]
596
+ local ____opt_29 = self.modifiersByInstance
597
+ local modifiers = ____opt_29 and ____opt_29[instance]
598
+ if originalValue ~= nil then
599
+ local value = originalValue
600
+ if modifiers ~= nil then
601
+ for modifier in pairs(modifiers) do
602
+ value = modifier(instance, level, value, originalValue)
603
+ end
604
+ end
605
+ return value
606
+ end
607
+ return self.defaultValue
608
+ end
514
609
  function ObjectLevelField.prototype.invokeValueChangeEvent(self, ...)
515
610
  self:invokeValueChangeEventRecursive(
516
611
  getClass(self),
@@ -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
@@ -0,0 +1,6 @@
1
+ /** @noSelfInFile */
2
+ import { UnitClassificationsField, UnitFlyHeightField, UnitPropulsionWindowField, UnitScalingValueField } from "../../object-field/unit";
3
+ export declare const PROPULSION_WINDOW_UNIT_FLOAT_FIELD: UnitPropulsionWindowField & symbol;
4
+ export declare const UNIT_CLASSIFICATIONS_FIELD: UnitClassificationsField & symbol;
5
+ export declare const FLY_HEIGHT_UNIT_FLOAT_FIELD: UnitFlyHeightField & symbol;
6
+ export declare const SCALING_VALUE_UNIT_FLOAT_FIELD: UnitScalingValueField & symbol;
@@ -0,0 +1,11 @@
1
+ local ____exports = {}
2
+ local ____unit = require("engine.object-field.unit")
3
+ local UnitClassificationsField = ____unit.UnitClassificationsField
4
+ local UnitFlyHeightField = ____unit.UnitFlyHeightField
5
+ local UnitPropulsionWindowField = ____unit.UnitPropulsionWindowField
6
+ local UnitScalingValueField = ____unit.UnitScalingValueField
7
+ ____exports.PROPULSION_WINDOW_UNIT_FLOAT_FIELD = UnitPropulsionWindowField:create(fourCC("urpw"))
8
+ ____exports.UNIT_CLASSIFICATIONS_FIELD = UnitClassificationsField:create(fourCC("utyp"))
9
+ ____exports.FLY_HEIGHT_UNIT_FLOAT_FIELD = UnitFlyHeightField:create(fourCC("ufyh"))
10
+ ____exports.SCALING_VALUE_UNIT_FLOAT_FIELD = UnitScalingValueField:create(fourCC("usca"))
11
+ return ____exports
@@ -0,0 +1,11 @@
1
+ /** @noSelfInFile */
2
+ import { Player } from "../core/types/player";
3
+ import { Event } from "../event";
4
+ export declare const synchronizer: <T, K extends number>(getSyncId: (object: T) => K, getObject: (syncId: K) => T | undefined) => ((player: Player, object: T | undefined) => Promise<T | undefined>);
5
+ export declare class ObjectBus<T, K extends number> {
6
+ private readonly getSyncId;
7
+ readonly event: Event<[Player, T | undefined]>;
8
+ private readonly syncSlider;
9
+ constructor(getSyncId: (object: T) => K, getObject: (syncId: K) => T | undefined);
10
+ send(object: T | undefined): void;
11
+ }