warscript 0.0.1-dev.f5421e8 → 0.0.1-dev.f9166a3

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 (66) hide show
  1. package/attributes.d.ts +5 -0
  2. package/attributes.lua +8 -1
  3. package/core/types/order.d.ts +1 -0
  4. package/core/types/order.lua +11 -1
  5. package/core/types/sound.lua +5 -0
  6. package/decl/native.d.ts +840 -786
  7. package/engine/behaviour/ability/damage.d.ts +6 -3
  8. package/engine/behaviour/ability/damage.lua +24 -36
  9. package/engine/behaviour/ability/emulate-impact.lua +16 -2
  10. package/engine/behaviour/ability.lua +1 -1
  11. package/engine/behaviour/unit.d.ts +15 -0
  12. package/engine/behaviour/unit.lua +114 -4
  13. package/engine/internal/ability.d.ts +4 -0
  14. package/engine/internal/ability.lua +17 -0
  15. package/engine/internal/item/ability.lua +12 -10
  16. package/engine/internal/item.d.ts +5 -2
  17. package/engine/internal/item.lua +75 -3
  18. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  19. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  20. package/engine/internal/unit/ability.d.ts +5 -0
  21. package/engine/internal/unit/ability.lua +14 -0
  22. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  23. package/engine/internal/unit/allowed-targets.lua +9 -1
  24. package/engine/internal/unit+damage.d.ts +2 -11
  25. package/engine/internal/unit+damage.lua +10 -14
  26. package/engine/internal/unit+spellSteal.lua +1 -2
  27. package/engine/internal/unit-missile-launch.lua +1 -1
  28. package/engine/internal/unit.d.ts +20 -3
  29. package/engine/internal/unit.lua +163 -37
  30. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  31. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  32. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  33. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  34. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  35. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  36. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  37. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  38. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  39. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  40. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  41. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  42. package/engine/object-data/entry/ability-type.lua +7 -0
  43. package/engine/object-data/entry/buff-type/applicable.lua +5 -0
  44. package/engine/object-data/entry/buff-type.d.ts +5 -11
  45. package/engine/object-data/entry/buff-type.lua +11 -27
  46. package/engine/object-data/entry/unit-type.d.ts +2 -2
  47. package/engine/object-data/entry/unit-type.lua +94 -84
  48. package/engine/object-field/ability.d.ts +1 -1
  49. package/engine/object-field/unit.d.ts +46 -3
  50. package/engine/object-field/unit.lua +173 -7
  51. package/engine/object-field.d.ts +12 -3
  52. package/engine/object-field.lua +164 -78
  53. package/engine/standard/entries/buff-type.d.ts +3 -0
  54. package/engine/standard/entries/buff-type.lua +3 -0
  55. package/objutil/buff.lua +1 -2
  56. package/package.json +2 -2
  57. package/utility/arrays.d.ts +1 -0
  58. package/utility/arrays.lua +3 -0
  59. package/utility/functions.d.ts +1 -0
  60. package/utility/functions.lua +1 -0
  61. package/utility/linked-set.d.ts +1 -0
  62. package/utility/linked-set.lua +3 -0
  63. package/utility/lua-maps.d.ts +3 -0
  64. package/utility/lua-maps.lua +16 -0
  65. package/utility/lua-sets.d.ts +1 -0
  66. package/utility/lua-sets.lua +3 -0
@@ -2,11 +2,22 @@ local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
4
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
+ local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
5
6
  local ____exports = {}
6
7
  local ____unit = require("engine.internal.unit")
7
8
  local Unit = ____unit.Unit
8
9
  local ____object_2Dfield = require("engine.object-field")
9
10
  local ObjectField = ____object_2Dfield.ObjectField
11
+ local ObjectLevelField = ____object_2Dfield.ObjectLevelField
12
+ local ____linked_2Dset = require("utility.linked-set")
13
+ local nonEmptyLinkedSetOf = ____linked_2Dset.nonEmptyLinkedSetOf
14
+ local convertUnitBooleanField = ConvertUnitBooleanField
15
+ local convertUnitIntegerField = ConvertUnitIntegerField
16
+ local convertUnitRealField = ConvertUnitRealField
17
+ local convertUnitStringField = ConvertUnitStringField
18
+ local convertUnitWeaponIntegerField = ConvertUnitWeaponIntegerField
19
+ local getUnitWeaponIntegerField = BlzGetUnitWeaponIntegerField
20
+ local setUnitWeaponIntegerField = BlzSetUnitWeaponIntegerField
10
21
  ____exports.UnitField = __TS__Class()
11
22
  local UnitField = ____exports.UnitField
12
23
  UnitField.name = "UnitField"
@@ -14,6 +25,9 @@ __TS__ClassExtends(UnitField, ObjectField)
14
25
  function UnitField.prototype.getObjectDataEntryId(self, instance)
15
26
  return instance.typeId
16
27
  end
28
+ function UnitField.prototype.hasNativeFieldValue(self)
29
+ return true
30
+ end
17
31
  __TS__SetDescriptor(
18
32
  UnitField.prototype,
19
33
  "instanceClass",
@@ -22,22 +36,79 @@ __TS__SetDescriptor(
22
36
  end},
23
37
  true
24
38
  )
39
+ ____exports.UnitBooleanField = __TS__Class()
40
+ local UnitBooleanField = ____exports.UnitBooleanField
41
+ UnitBooleanField.name = "UnitBooleanField"
42
+ __TS__ClassExtends(UnitBooleanField, ____exports.UnitField)
43
+ function UnitBooleanField.prototype.getNativeFieldById(self, id)
44
+ return convertUnitBooleanField(id)
45
+ end
46
+ function UnitBooleanField.prototype.getNativeFieldValue(self, instance)
47
+ return instance:getField(self.nativeField)
48
+ end
49
+ function UnitBooleanField.prototype.setNativeFieldValue(self, instance, value)
50
+ return instance:setField(self.nativeField, value)
51
+ end
52
+ __TS__SetDescriptor(
53
+ UnitBooleanField.prototype,
54
+ "defaultValue",
55
+ {get = function(self)
56
+ return false
57
+ end},
58
+ true
59
+ )
60
+ ____exports.UnitFloatField = __TS__Class()
61
+ local UnitFloatField = ____exports.UnitFloatField
62
+ UnitFloatField.name = "UnitFloatField"
63
+ __TS__ClassExtends(UnitFloatField, ____exports.UnitField)
64
+ function UnitFloatField.prototype.getNativeFieldById(self, id)
65
+ return convertUnitRealField(id)
66
+ end
67
+ function UnitFloatField.prototype.getNativeFieldValue(self, instance)
68
+ return instance:getField(self.nativeField)
69
+ end
70
+ function UnitFloatField.prototype.setNativeFieldValue(self, instance, value)
71
+ return instance:setField(self.nativeField, value)
72
+ end
73
+ __TS__SetDescriptor(
74
+ UnitFloatField.prototype,
75
+ "defaultValue",
76
+ {get = function(self)
77
+ return 0
78
+ end},
79
+ true
80
+ )
81
+ ____exports.UnitIntegerField = __TS__Class()
82
+ local UnitIntegerField = ____exports.UnitIntegerField
83
+ UnitIntegerField.name = "UnitIntegerField"
84
+ __TS__ClassExtends(UnitIntegerField, ____exports.UnitField)
85
+ function UnitIntegerField.prototype.getNativeFieldById(self, id)
86
+ return convertUnitIntegerField(id)
87
+ end
88
+ function UnitIntegerField.prototype.getNativeFieldValue(self, instance)
89
+ return instance:getField(self.nativeField)
90
+ end
91
+ function UnitIntegerField.prototype.setNativeFieldValue(self, instance, value)
92
+ return instance:setField(self.nativeField, value)
93
+ end
94
+ __TS__SetDescriptor(
95
+ UnitIntegerField.prototype,
96
+ "defaultValue",
97
+ {get = function(self)
98
+ return 0
99
+ end},
100
+ true
101
+ )
25
102
  ____exports.UnitStringField = __TS__Class()
26
103
  local UnitStringField = ____exports.UnitStringField
27
104
  UnitStringField.name = "UnitStringField"
28
105
  __TS__ClassExtends(UnitStringField, ____exports.UnitField)
29
106
  function UnitStringField.prototype.getNativeFieldById(self, id)
30
- return ConvertUnitStringField(id)
31
- end
32
- function UnitStringField.prototype.hasNativeFieldValue(self)
33
- return true
107
+ return convertUnitStringField(id)
34
108
  end
35
109
  function UnitStringField.prototype.getNativeFieldValue(self, instance)
36
110
  return instance:getField(self.nativeField)
37
111
  end
38
- function UnitStringField.prototype.getObjectDataEntryId(self, instance)
39
- return instance.typeId
40
- end
41
112
  function UnitStringField.prototype.setNativeFieldValue(self, instance, value)
42
113
  return instance:setField(self.nativeField, value)
43
114
  end
@@ -49,4 +120,99 @@ __TS__SetDescriptor(
49
120
  end},
50
121
  true
51
122
  )
123
+ ____exports.UnitWeaponField = __TS__Class()
124
+ local UnitWeaponField = ____exports.UnitWeaponField
125
+ UnitWeaponField.name = "UnitWeaponField"
126
+ __TS__ClassExtends(UnitWeaponField, ObjectLevelField)
127
+ function UnitWeaponField.prototype.getLevelCount(self)
128
+ return 2
129
+ end
130
+ function UnitWeaponField.prototype.getObjectDataEntryId(self, instance)
131
+ return instance.typeId
132
+ end
133
+ function UnitWeaponField.prototype.hasNativeFieldValue(self)
134
+ return true
135
+ end
136
+ __TS__SetDescriptor(
137
+ UnitWeaponField.prototype,
138
+ "instanceClass",
139
+ {get = function(self)
140
+ return Unit
141
+ end},
142
+ true
143
+ )
144
+ __TS__ObjectDefineProperty(
145
+ UnitWeaponField,
146
+ "valueChangeEvent",
147
+ {get = function(self)
148
+ return self:getOrCreateValueChangeEvent()
149
+ end}
150
+ )
151
+ ____exports.UnitNumberWeaponField = __TS__Class()
152
+ local UnitNumberWeaponField = ____exports.UnitNumberWeaponField
153
+ UnitNumberWeaponField.name = "UnitNumberWeaponField"
154
+ __TS__ClassExtends(UnitNumberWeaponField, ____exports.UnitWeaponField)
155
+ __TS__SetDescriptor(
156
+ UnitNumberWeaponField.prototype,
157
+ "defaultValue",
158
+ {get = function(self)
159
+ return 0
160
+ end},
161
+ true
162
+ )
163
+ __TS__ObjectDefineProperty(
164
+ UnitNumberWeaponField,
165
+ "valueChangeEvent",
166
+ {get = function(self)
167
+ return self:getOrCreateValueChangeEvent()
168
+ end}
169
+ )
170
+ ____exports.UnitEnumWeaponField = __TS__Class()
171
+ local UnitEnumWeaponField = ____exports.UnitEnumWeaponField
172
+ UnitEnumWeaponField.name = "UnitEnumWeaponField"
173
+ __TS__ClassExtends(UnitEnumWeaponField, ____exports.UnitWeaponField)
174
+ function UnitEnumWeaponField.prototype.getNativeFieldById(self, id)
175
+ return convertUnitWeaponIntegerField(id)
176
+ end
177
+ function UnitEnumWeaponField.prototype.getNativeFieldValue(self, instance, index)
178
+ local value = getUnitWeaponIntegerField(instance.handle, self.nativeField, index)
179
+ if self.values:contains(value) then
180
+ return value
181
+ end
182
+ return self.values:first()
183
+ end
184
+ function UnitEnumWeaponField.prototype.setNativeFieldValue(self, instance, index, value)
185
+ return setUnitWeaponIntegerField(instance.handle, self.nativeField, index, value)
186
+ end
187
+ __TS__SetDescriptor(
188
+ UnitEnumWeaponField.prototype,
189
+ "defaultValue",
190
+ {get = function(self)
191
+ return self.values:first()
192
+ end},
193
+ true
194
+ )
195
+ __TS__ObjectDefineProperty(
196
+ UnitEnumWeaponField,
197
+ "valueChangeEvent",
198
+ {get = function(self)
199
+ return self:getOrCreateValueChangeEvent()
200
+ end}
201
+ )
202
+ ____exports.UnitAttackTypeWeaponField = __TS__Class()
203
+ local UnitAttackTypeWeaponField = ____exports.UnitAttackTypeWeaponField
204
+ UnitAttackTypeWeaponField.name = "UnitAttackTypeWeaponField"
205
+ __TS__ClassExtends(UnitAttackTypeWeaponField, ____exports.UnitEnumWeaponField)
206
+ function UnitAttackTypeWeaponField.prototype.____constructor(self, ...)
207
+ UnitAttackTypeWeaponField.____super.prototype.____constructor(self, ...)
208
+ self.values = nonEmptyLinkedSetOf(
209
+ 1,
210
+ 2,
211
+ 3,
212
+ 0,
213
+ 5,
214
+ 4,
215
+ 6
216
+ )
217
+ end
52
218
  return ____exports
@@ -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;
@@ -18,7 +19,7 @@ declare abstract class ObjectFieldBase<ObjectDataEntryType extends ObjectDataEnt
18
19
  protected abstract getObjectDataEntryId(instance: InstanceType): ObjectDataEntryIdType<ObjectDataEntryType>;
19
20
  protected abstract hasNativeFieldValue(instance: InstanceType): boolean;
20
21
  hasValue(instance: InstanceType): boolean;
21
- constructor(id: number);
22
+ constructor(id: number, isGlobal?: boolean);
22
23
  static create<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldConstructor<T>, id?: number): T & symbol;
23
24
  static of<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldAbstractConstructor<T>, id: number): T | undefined;
24
25
  }
@@ -35,14 +36,22 @@ 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>);
39
+ type ObjectFieldModifier<InstanceType extends AnyNotNil, ValueType extends number | string | boolean> = (instance: InstanceType, currentValue: ValueType, originalValue: ValueType) => ValueType;
38
40
  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> {
39
41
  protected abstract readonly defaultValue: ValueType;
40
42
  protected abstract getNativeFieldValue(instance: InstanceType): ValueType;
41
43
  protected abstract setNativeFieldValue(instance: InstanceType, value: ValueType): boolean;
42
- getValue(entry: ObjectDataEntryType | InstanceType): ValueType;
44
+ private originalValueByInstance?;
45
+ private modifiersByInstance?;
46
+ getValue(entry: ObjectDataEntryType | InstanceType, includeModifiers?: boolean): ValueType;
43
47
  setValue(entry: ObjectDataEntryType | InstanceType, value: ValueType): boolean;
48
+ applyModifier(instance: InstanceType, modifier: ObjectFieldModifier<InstanceType, ValueType>): void;
49
+ removeModifier(instance: InstanceType, modifier: ObjectFieldModifier<InstanceType, ValueType>): boolean;
44
50
  removeValue(entry: ObjectDataEntryType): boolean;
45
51
  trySetValue(entry: ObjectDataEntryType | InstanceType, value: unknown): boolean;
52
+ private getActualValue;
53
+ private setActualValue;
54
+ private calculateActualValue;
46
55
  private invokeValueChangeEvent;
47
56
  private invokeValueChangeEventRecursive;
48
57
  protected static getOrCreateValueChangeEvent<T extends ObjectField, R extends ReadonlyObjectFieldType<T>>(this: ReadonlyObjectFieldConstructor<T>): ObjectFieldValueChangeEvent<R>;
@@ -20,6 +20,11 @@ local extractObjectDataEntryLevelFieldValue = ____entry.extractObjectDataEntryLe
20
20
  local ObjectDataEntry = ____entry.ObjectDataEntry
21
21
  local ____object_2Ddata_2Dentry_2Did_2Dgenerator = require("engine.object-data.utility.object-data-entry-id-generator")
22
22
  local ObjectDataEntryIdGenerator = ____object_2Ddata_2Dentry_2Did_2Dgenerator.ObjectDataEntryIdGenerator
23
+ local ____linked_2Dset = require("utility.linked-set")
24
+ local mutableLinkedSet = ____linked_2Dset.mutableLinkedSet
25
+ local ____lua_2Dmaps = require("utility.lua-maps")
26
+ local getOrPut = ____lua_2Dmaps.getOrPut
27
+ local mutableWeakLuaMap = ____lua_2Dmaps.mutableWeakLuaMap
23
28
  local compiletimeDefaultValueByObjectDataEntryIdByObjectFieldId = {}
24
29
  local defaultValueByObjectDataEntryIdByObjectFieldId = postcompile(function() return compiletimeDefaultValueByObjectDataEntryIdByObjectFieldId end)
25
30
  local objectFieldById = {}
@@ -29,7 +34,11 @@ local idGenerator = __TS__New(
29
34
  )
30
35
  local ObjectFieldBase = __TS__Class()
31
36
  ObjectFieldBase.name = "ObjectFieldBase"
32
- function ObjectFieldBase.prototype.____constructor(self, id)
37
+ function ObjectFieldBase.prototype.____constructor(self, id, isGlobal)
38
+ if isGlobal == nil then
39
+ isGlobal = true
40
+ end
41
+ self.isGlobal = isGlobal
33
42
  self.valueByInstance = setmetatable({}, {__mode = "k"})
34
43
  if objectFieldById[id] ~= nil then
35
44
  error(
@@ -48,7 +57,7 @@ function ObjectFieldBase.prototype.supports(self, instance)
48
57
  end
49
58
  function ObjectFieldBase.prototype.hasValue(self, instance)
50
59
  local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
51
- return defaultValueByObjectDataEntryId ~= nil and defaultValueByObjectDataEntryId[self:getObjectDataEntryId(instance)] ~= nil or self:hasNativeFieldValue(instance)
60
+ return self.isGlobal or defaultValueByObjectDataEntryId ~= nil and defaultValueByObjectDataEntryId[self:getObjectDataEntryId(instance)] ~= nil or self:hasNativeFieldValue(instance)
52
61
  end
53
62
  function ObjectFieldBase.create(self, id)
54
63
  return __TS__New(
@@ -75,7 +84,7 @@ ____exports.ObjectField = __TS__Class()
75
84
  local ObjectField = ____exports.ObjectField
76
85
  ObjectField.name = "ObjectField"
77
86
  __TS__ClassExtends(ObjectField, ObjectFieldBase)
78
- function ObjectField.prototype.getValue(self, entry)
87
+ function ObjectField.prototype.getValue(self, entry, includeModifiers)
79
88
  if __TS__InstanceOf(entry, ObjectDataEntry) then
80
89
  local defaultValueByObjectDataEntryId = (warpack.compiletime and compiletimeDefaultValueByObjectDataEntryIdByObjectFieldId or defaultValueByObjectDataEntryIdByObjectFieldId)[self.id]
81
90
  if defaultValueByObjectDataEntryId ~= nil then
@@ -86,22 +95,16 @@ function ObjectField.prototype.getValue(self, entry)
86
95
  end
87
96
  return self.defaultValue
88
97
  end
89
- local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
90
- if defaultValueByObjectDataEntryId ~= nil then
91
- local defaultValue = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(entry)]
92
- if defaultValue ~= nil then
93
- local ____self_valueByInstance_entry_0 = self.valueByInstance[entry]
94
- if ____self_valueByInstance_entry_0 == nil then
95
- ____self_valueByInstance_entry_0 = defaultValue
98
+ if includeModifiers == false then
99
+ local originalValueByInstance = self.originalValueByInstance
100
+ if originalValueByInstance ~= nil then
101
+ local originalValue = originalValueByInstance[entry]
102
+ if originalValue ~= nil then
103
+ return originalValue
96
104
  end
97
- return ____self_valueByInstance_entry_0
98
105
  end
99
106
  end
100
- local ____temp_1 = self:getNativeFieldValue(entry)
101
- if ____temp_1 == nil then
102
- ____temp_1 = self.defaultValue
103
- end
104
- return ____temp_1
107
+ return self:getActualValue(entry)
105
108
  end
106
109
  function ObjectField.prototype.setValue(self, entry, value)
107
110
  if __TS__InstanceOf(entry, ObjectDataEntry) then
@@ -116,37 +119,53 @@ function ObjectField.prototype.setValue(self, entry, value)
116
119
  defaultValueByObjectDataEntryId[entry.id] = value
117
120
  return true
118
121
  end
119
- local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
120
- if defaultValueByObjectDataEntryId ~= nil then
121
- local defaultValue = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(entry)]
122
- if defaultValue ~= nil then
123
- local ____self_valueByInstance_entry_2 = self.valueByInstance[entry]
124
- if ____self_valueByInstance_entry_2 == nil then
125
- ____self_valueByInstance_entry_2 = defaultValue
126
- end
127
- local ____self_valueByInstance_entry_2_3 = ____self_valueByInstance_entry_2
128
- if ____self_valueByInstance_entry_2_3 == nil then
129
- ____self_valueByInstance_entry_2_3 = self.defaultValue
130
- end
131
- local previousValue = ____self_valueByInstance_entry_2_3
132
- if value ~= previousValue then
133
- self.valueByInstance[entry] = value
134
- self:invokeValueChangeEvent(entry, self, previousValue, value)
122
+ local modifiersByInstance = self.modifiersByInstance
123
+ if modifiersByInstance ~= nil then
124
+ local modifiers = modifiersByInstance[entry]
125
+ if modifiers ~= nil and modifiers.size ~= 0 then
126
+ local originalValueByInstance = self.originalValueByInstance
127
+ if originalValueByInstance == nil then
128
+ originalValueByInstance = mutableWeakLuaMap()
129
+ self.originalValueByInstance = originalValueByInstance
135
130
  end
136
- return true
131
+ originalValueByInstance[entry] = value
132
+ value = self:calculateActualValue(entry)
137
133
  end
138
134
  end
139
- if not self:hasNativeFieldValue(entry) then
140
- return false
135
+ return self:setActualValue(entry, value)
136
+ end
137
+ function ObjectField.prototype.applyModifier(self, instance, modifier)
138
+ local modifiersByInstance = self.modifiersByInstance
139
+ if modifiersByInstance == nil then
140
+ modifiersByInstance = mutableWeakLuaMap()
141
+ self.modifiersByInstance = modifiersByInstance
142
+ end
143
+ if getOrPut(modifiersByInstance, instance, mutableLinkedSet):add(modifier) then
144
+ local originalValueByInstance = self.originalValueByInstance
145
+ if originalValueByInstance == nil then
146
+ originalValueByInstance = mutableWeakLuaMap()
147
+ self.originalValueByInstance = originalValueByInstance
148
+ end
149
+ originalValueByInstance[instance] = self:getActualValue(instance)
150
+ self:setActualValue(
151
+ instance,
152
+ self:calculateActualValue(instance)
153
+ )
141
154
  end
142
- local previousValue = self:getNativeFieldValue(entry)
143
- if value ~= previousValue then
144
- if not self:setNativeFieldValue(entry, value) then
145
- return false
155
+ end
156
+ function ObjectField.prototype.removeModifier(self, instance, modifier)
157
+ local modifiersByInstance = self.modifiersByInstance
158
+ if modifiersByInstance ~= nil then
159
+ local modifiers = modifiersByInstance[instance]
160
+ if modifiers ~= nil and modifiers:remove(modifier) then
161
+ self:setActualValue(
162
+ instance,
163
+ self:calculateActualValue(instance)
164
+ )
165
+ return true
146
166
  end
147
- self:invokeValueChangeEvent(entry, self, previousValue, value)
148
167
  end
149
- return true
168
+ return false
150
169
  end
151
170
  function ObjectField.prototype.removeValue(self, entry)
152
171
  if not warpack.compiletime then
@@ -168,6 +187,73 @@ function ObjectField.prototype.trySetValue(self, entry, value)
168
187
  end
169
188
  return self:setValue(entry, value)
170
189
  end
190
+ function ObjectField.prototype.getActualValue(self, instance)
191
+ local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
192
+ if defaultValueByObjectDataEntryId ~= nil then
193
+ local defaultValue = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(instance)]
194
+ if defaultValue ~= nil then
195
+ local ____self_valueByInstance_instance_0 = self.valueByInstance[instance]
196
+ if ____self_valueByInstance_instance_0 == nil then
197
+ ____self_valueByInstance_instance_0 = defaultValue
198
+ end
199
+ return ____self_valueByInstance_instance_0
200
+ end
201
+ end
202
+ local ____temp_1 = self:getNativeFieldValue(instance)
203
+ if ____temp_1 == nil then
204
+ ____temp_1 = self.defaultValue
205
+ end
206
+ return ____temp_1
207
+ end
208
+ function ObjectField.prototype.setActualValue(self, instance, value)
209
+ local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
210
+ if defaultValueByObjectDataEntryId ~= nil then
211
+ local defaultValue = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(instance)]
212
+ if defaultValue ~= nil then
213
+ local ____self_valueByInstance_instance_2 = self.valueByInstance[instance]
214
+ if ____self_valueByInstance_instance_2 == nil then
215
+ ____self_valueByInstance_instance_2 = defaultValue
216
+ end
217
+ local ____self_valueByInstance_instance_2_3 = ____self_valueByInstance_instance_2
218
+ if ____self_valueByInstance_instance_2_3 == nil then
219
+ ____self_valueByInstance_instance_2_3 = self.defaultValue
220
+ end
221
+ local previousValue = ____self_valueByInstance_instance_2_3
222
+ if value ~= previousValue then
223
+ self.valueByInstance[instance] = value
224
+ self:invokeValueChangeEvent(instance, self, previousValue, value)
225
+ end
226
+ return true
227
+ end
228
+ end
229
+ if not self:hasNativeFieldValue(instance) then
230
+ return false
231
+ end
232
+ local previousValue = self:getNativeFieldValue(instance)
233
+ if value ~= previousValue then
234
+ if not self:setNativeFieldValue(instance, value) then
235
+ return false
236
+ end
237
+ self:invokeValueChangeEvent(instance, self, previousValue, value)
238
+ end
239
+ return true
240
+ end
241
+ function ObjectField.prototype.calculateActualValue(self, instance)
242
+ local ____opt_4 = self.originalValueByInstance
243
+ local originalValue = ____opt_4 and ____opt_4[instance]
244
+ local ____opt_6 = self.modifiersByInstance
245
+ local modifiers = ____opt_6 and ____opt_6[instance]
246
+ if originalValue ~= nil then
247
+ local value = originalValue
248
+ if modifiers ~= nil then
249
+ for modifier in pairs(modifiers) do
250
+ value = modifier(instance, value, originalValue)
251
+ end
252
+ end
253
+ return value
254
+ end
255
+ return self.defaultValue
256
+ end
171
257
  function ObjectField.prototype.invokeValueChangeEvent(self, ...)
172
258
  self:invokeValueChangeEventRecursive(
173
259
  getClass(self),
@@ -221,17 +307,17 @@ function ObjectArrayField.prototype.getValue(self, entry, index)
221
307
  if defaultValueByObjectDataEntryId ~= nil then
222
308
  local value = defaultValueByObjectDataEntryId[entry.id]
223
309
  if value ~= nil then
224
- local ____temp_5
310
+ local ____temp_9
225
311
  if index == nil then
226
- ____temp_5 = value
312
+ ____temp_9 = value
227
313
  else
228
- local ____value_index_4 = value[index + 1]
229
- if ____value_index_4 == nil then
230
- ____value_index_4 = self.defaultValue
314
+ local ____value_index_8 = value[index + 1]
315
+ if ____value_index_8 == nil then
316
+ ____value_index_8 = self.defaultValue
231
317
  end
232
- ____temp_5 = ____value_index_4
318
+ ____temp_9 = ____value_index_8
233
319
  end
234
- return ____temp_5
320
+ return ____temp_9
235
321
  end
236
322
  end
237
323
  return index == nil and ({}) or self.defaultValue
@@ -241,17 +327,17 @@ function ObjectArrayField.prototype.getValue(self, entry, index)
241
327
  local defaultValue = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(entry)]
242
328
  if defaultValue ~= nil then
243
329
  local value = self.valueByInstance[entry] or defaultValue
244
- local ____temp_7
330
+ local ____temp_11
245
331
  if index == nil then
246
- ____temp_7 = value
332
+ ____temp_11 = value
247
333
  else
248
- local ____value_index_6 = value[index + 1]
249
- if ____value_index_6 == nil then
250
- ____value_index_6 = self.defaultValue
334
+ local ____value_index_10 = value[index + 1]
335
+ if ____value_index_10 == nil then
336
+ ____value_index_10 = self.defaultValue
251
337
  end
252
- ____temp_7 = ____value_index_6
338
+ ____temp_11 = ____value_index_10
253
339
  end
254
- return ____temp_7
340
+ return ____temp_11
255
341
  end
256
342
  end
257
343
  if index ~= nil then
@@ -296,11 +382,11 @@ function ObjectLevelField.prototype.getValue(self, entry, level)
296
382
  if defaultValueByObjectDataEntryId ~= nil then
297
383
  local valueByLevel = defaultValueByObjectDataEntryId[entry.id]
298
384
  if valueByLevel ~= nil then
299
- local ____valueByLevel_index_8 = valueByLevel[level + 1]
300
- if ____valueByLevel_index_8 == nil then
301
- ____valueByLevel_index_8 = self.defaultValue
385
+ local ____valueByLevel_index_12 = valueByLevel[level + 1]
386
+ if ____valueByLevel_index_12 == nil then
387
+ ____valueByLevel_index_12 = self.defaultValue
302
388
  end
303
- return ____valueByLevel_index_8
389
+ return ____valueByLevel_index_12
304
390
  end
305
391
  end
306
392
  return self.defaultValue
@@ -309,23 +395,23 @@ function ObjectLevelField.prototype.getValue(self, entry, level)
309
395
  if defaultValueByObjectDataEntryId ~= nil then
310
396
  local defaultValueByLevel = defaultValueByObjectDataEntryId[self:getObjectDataEntryId(entry)]
311
397
  if defaultValueByLevel ~= nil then
312
- local ____opt_9 = self.valueByInstance[entry]
313
- local ____temp_11 = ____opt_9 and ____opt_9[level + 1]
314
- if ____temp_11 == nil then
315
- ____temp_11 = defaultValueByLevel[level + 1]
398
+ local ____opt_13 = self.valueByInstance[entry]
399
+ local ____temp_15 = ____opt_13 and ____opt_13[level + 1]
400
+ if ____temp_15 == nil then
401
+ ____temp_15 = defaultValueByLevel[level + 1]
316
402
  end
317
- local ____temp_11_12 = ____temp_11
318
- if ____temp_11_12 == nil then
319
- ____temp_11_12 = self.defaultValue
403
+ local ____temp_15_16 = ____temp_15
404
+ if ____temp_15_16 == nil then
405
+ ____temp_15_16 = self.defaultValue
320
406
  end
321
- return ____temp_11_12
407
+ return ____temp_15_16
322
408
  end
323
409
  end
324
- local ____temp_13 = self:getNativeFieldValue(entry, level)
325
- if ____temp_13 == nil then
326
- ____temp_13 = self.defaultValue
410
+ local ____temp_17 = self:getNativeFieldValue(entry, level)
411
+ if ____temp_17 == nil then
412
+ ____temp_17 = self.defaultValue
327
413
  end
328
- return ____temp_13
414
+ return ____temp_17
329
415
  end
330
416
  function ObjectLevelField.prototype.setValue(self, entry, levelOrValue, value)
331
417
  if value == nil then
@@ -374,15 +460,15 @@ function ObjectLevelField.prototype.setValue(self, entry, levelOrValue, value)
374
460
  valueByLevel = {}
375
461
  self.valueByInstance[entry] = valueByLevel
376
462
  end
377
- local ____valueByLevel_index_14 = valueByLevel[level + 1]
378
- if ____valueByLevel_index_14 == nil then
379
- ____valueByLevel_index_14 = defaultValueByLevel[level + 1]
463
+ local ____valueByLevel_index_18 = valueByLevel[level + 1]
464
+ if ____valueByLevel_index_18 == nil then
465
+ ____valueByLevel_index_18 = defaultValueByLevel[level + 1]
380
466
  end
381
- local ____valueByLevel_index_14_15 = ____valueByLevel_index_14
382
- if ____valueByLevel_index_14_15 == nil then
383
- ____valueByLevel_index_14_15 = self.defaultValue
467
+ local ____valueByLevel_index_18_19 = ____valueByLevel_index_18
468
+ if ____valueByLevel_index_18_19 == nil then
469
+ ____valueByLevel_index_18_19 = self.defaultValue
384
470
  end
385
- local previousValue = ____valueByLevel_index_14_15
471
+ local previousValue = ____valueByLevel_index_18_19
386
472
  if value ~= previousValue then
387
473
  valueByLevel[level + 1] = value
388
474
  self:invokeValueChangeEvent(
@@ -0,0 +1,3 @@
1
+ /** @noSelfInFile */
2
+ import { StandardBuffTypeId } from "../../object-data/entry/buff-type";
3
+ export declare const CHEMICAL_RAGE_BUFF_TYPE_ID: StandardBuffTypeId;
@@ -0,0 +1,3 @@
1
+ local ____exports = {}
2
+ ____exports.CHEMICAL_RAGE_BUFF_TYPE_ID = fourCC("BNcr")
3
+ return ____exports
package/objutil/buff.lua CHANGED
@@ -20,7 +20,6 @@ local AbilityDefinitionInnerFire = ____ability.AbilityDefinitionInnerFire
20
20
  local AbilityDefinitionSearingArrows = ____ability.AbilityDefinitionSearingArrows
21
21
  local AbilityDefinitionSlowPoison = ____ability.AbilityDefinitionSlowPoison
22
22
  local ____unit = require("core.types.unit")
23
- local AttackType = ____unit.AttackType
24
23
  local DamageType = ____unit.DamageType
25
24
  local Unit = ____unit.Unit
26
25
  local ____dummy = require("core.dummy")
@@ -756,7 +755,7 @@ for ____, pointDispelAbilityId in ipairs(pointDispelAbilityIds) do
756
755
  end)
757
756
  end
758
757
  Unit.onDamaging:addListener(function(source, target, event)
759
- if event.amount == 0 and event.attackType == AttackType.SPELL and event.damageType == DamageType.NORMAL and not event.isAttack then
758
+ if event.amount == 0 and event.attackType == 0 and event.damageType == DamageType.NORMAL and not event.isAttack then
760
759
  Timer:run(function()
761
760
  checkBuffs(target, true, source)
762
761
  end)
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.f5421e8",
4
+ "version": "0.0.1-dev.f9166a3",
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.8e8a660"
27
+ "warpack": "0.0.1-dev.fa5e065"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@typescript-eslint/eslint-plugin": "^8.13.0",
@@ -22,6 +22,7 @@ export declare const mapToLuaSet: {
22
22
  <T, R extends AnyNotNil>(array: readonly T[], transform: (value: T) => R): LuaSet<R>;
23
23
  <T, K extends KeysOfType<T, AnyNotNil>>(array: readonly T[], key: K): LuaSet<T[K] extends AnyNotNil ? T[K] : never>;
24
24
  };
25
+ export declare const flatten: <T>(array: readonly (readonly T[])[]) => T[];
25
26
  export declare const flatMap: {
26
27
  <T, R>(array: readonly T[], transform: (value: T) => readonly R[]): R[];
27
28
  <T, K extends KeysOfType<T, readonly any[]>>(array: readonly T[], key: K): (T[K] extends readonly (infer R)[] ? R : never)[];