warscript 0.0.1-dev.29b3feb → 0.0.1-dev.2ae9956

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 (67) hide show
  1. package/core/types/effect.d.ts +13 -3
  2. package/core/types/effect.lua +116 -17
  3. package/core/util.d.ts +1 -1
  4. package/core/util.lua +6 -0
  5. package/engine/behaviour/ability/always-enabled.d.ts +7 -0
  6. package/engine/behaviour/ability/always-enabled.lua +31 -0
  7. package/engine/behaviour/ability/apply-buff.d.ts +5 -0
  8. package/engine/behaviour/ability/apply-buff.lua +32 -0
  9. package/engine/behaviour/ability/emulate-impact.d.ts +6 -0
  10. package/engine/behaviour/ability/emulate-impact.lua +28 -0
  11. package/engine/behaviour/ability/instant-impact.d.ts +2 -2
  12. package/engine/behaviour/ability/instant-impact.lua +4 -19
  13. package/engine/behaviour/ability/on-command-impact.d.ts +8 -0
  14. package/engine/behaviour/ability/on-command-impact.lua +25 -0
  15. package/engine/behaviour/ability/remove-buffs.d.ts +16 -0
  16. package/engine/behaviour/ability/remove-buffs.lua +28 -0
  17. package/engine/behaviour/ability.d.ts +15 -3
  18. package/engine/behaviour/ability.lua +93 -34
  19. package/engine/buff.d.ts +11 -1
  20. package/engine/buff.lua +50 -19
  21. package/engine/internal/ability.d.ts +13 -2
  22. package/engine/internal/ability.lua +77 -4
  23. package/engine/internal/item/ability.lua +106 -0
  24. package/engine/internal/item.d.ts +2 -2
  25. package/engine/internal/item.lua +56 -25
  26. package/engine/internal/misc/ability-disable-counter.d.ts +2 -0
  27. package/engine/internal/misc/ability-disable-counter.lua +13 -0
  28. package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
  29. package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
  30. package/engine/internal/object-data/evasion-probability.d.ts +2 -0
  31. package/engine/internal/object-data/evasion-probability.lua +16 -0
  32. package/engine/internal/unit/ability.d.ts +10 -1
  33. package/engine/internal/unit/ability.lua +36 -14
  34. package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
  35. package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
  36. package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
  37. package/engine/internal/unit/add-item-to-slot.lua +52 -0
  38. package/engine/internal/unit/bonus.d.ts +2 -0
  39. package/engine/internal/unit/bonus.lua +17 -0
  40. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  41. package/engine/internal/unit/ignore-events-items.lua +5 -0
  42. package/engine/internal/unit/item.lua +6 -12
  43. package/engine/internal/unit/main-selected.d.ts +6 -0
  44. package/engine/internal/unit/main-selected.lua +12 -1
  45. package/engine/internal/unit.d.ts +3 -1
  46. package/engine/internal/unit.lua +65 -26
  47. package/engine/internal/utility.lua +12 -0
  48. package/engine/lightning.d.ts +8 -2
  49. package/engine/lightning.lua +27 -2
  50. package/engine/object-data/auxiliary/sound-preset-name.d.ts +5 -1
  51. package/engine/object-data/entry/ability-type.lua +8 -12
  52. package/engine/object-data/entry/item-type.d.ts +2 -0
  53. package/engine/object-data/entry/item-type.lua +13 -0
  54. package/engine/object-data/utility/object-data-entry-id-generator.lua +7 -0
  55. package/engine/object-field/ability.d.ts +9 -3
  56. package/engine/object-field/ability.lua +3 -0
  57. package/engine/object-field.d.ts +2 -2
  58. package/engine/object-field.lua +4 -0
  59. package/engine/standard/fields/ability.d.ts +2 -0
  60. package/engine/standard/fields/ability.lua +2 -0
  61. package/engine/unit.d.ts +1 -0
  62. package/engine/unit.lua +1 -0
  63. package/package.json +2 -2
  64. package/utility/arrays.d.ts +8 -1
  65. package/utility/arrays.lua +34 -3
  66. package/utility/lazy.d.ts +2 -0
  67. package/utility/lazy.lua +14 -0
@@ -133,6 +133,7 @@ export declare class Unit extends Handle<junit> {
133
133
  get isAlive(): boolean;
134
134
  get isDead(): boolean;
135
135
  get isIllusion(): boolean;
136
+ get isStunned(): boolean;
136
137
  get combatClassifications(): CombatClassifications;
137
138
  set combatClassifications(combatClassifications: CombatClassifications);
138
139
  hasCombatClassification(combatClassification: CombatClassification): boolean;
@@ -332,7 +333,8 @@ export declare class Unit extends Handle<junit> {
332
333
  static itemPickedUpEvent: UnitTriggerEvent<[Item]>;
333
334
  static itemUsedEvent: UnitTriggerEvent<[Item]>;
334
335
  static itemStackedEvent: UnitTriggerEvent<[Item]>;
335
- static get itemMovedEvent(): Event<[
336
+ static get itemUseOrderEvent(): Event<[unit: Unit, item: Item]>;
337
+ static get itemMoveOrderEvent(): Event<[
336
338
  unit: Unit,
337
339
  item: Item,
338
340
  slotFrom: 0 | 1 | 2 | 3 | 4 | 5,
@@ -51,6 +51,8 @@ local ____arrays = require("utility.arrays")
51
51
  local forEach = ____arrays.forEach
52
52
  local ____math = require("math")
53
53
  local min = ____math.min
54
+ local ____ignore_2Devents_2Ditems = require("engine.internal.unit.ignore-events-items")
55
+ local ignoreEventsItems = ____ignore_2Devents_2Ditems.ignoreEventsItems
54
56
  local match = string.match
55
57
  local ____tostring = _G.tostring
56
58
  local setUnitAnimation = SetUnitAnimation
@@ -75,6 +77,7 @@ local setUnitScale = SetUnitScale
75
77
  local setUnitPosition = SetUnitPosition
76
78
  local setUnitTimeScale = SetUnitTimeScale
77
79
  local getHandleId = GetHandleId
80
+ local getUnitCurrentOrder = GetUnitCurrentOrder
78
81
  local createUnit = CreateUnit
79
82
  local killUnit = KillUnit
80
83
  local setUnitExploded = SetUnitExploded
@@ -562,17 +565,6 @@ local function retrieveAbility(unit, ability, abilityId)
562
565
  ____exports.Unit:of(unit)
563
566
  )
564
567
  end
565
- if not unitAddAbility(unit, abilityId) then
566
- if getUnitAbility(unit, abilityId) == ability then
567
- return UnitAbility:of(
568
- ability,
569
- abilityId,
570
- ____exports.Unit:of(unit)
571
- )
572
- end
573
- else
574
- unitRemoveAbility(unit, abilityId)
575
- end
576
568
  for i = 0, unitInventorySize(unit) - 1 do
577
569
  local item = unitItemInSlot(unit, i)
578
570
  if getItemAbility(item, abilityId) == ability then
@@ -940,8 +932,15 @@ function Unit.prototype.interruptAttack(self)
940
932
  unitInterruptAttack(self.handle)
941
933
  end
942
934
  function Unit.prototype.interruptCast(self, abilityId)
943
- unitDisableAbility(self.handle, abilityId, true, false)
944
- unitDisableAbility(self.handle, abilityId, false, false)
935
+ local handle = self.handle
936
+ unitDisableAbility(handle, abilityId, true, false)
937
+ Timer:run(
938
+ unitDisableAbility,
939
+ handle,
940
+ abilityId,
941
+ false,
942
+ false
943
+ )
945
944
  end
946
945
  function Unit.prototype.getDistanceTo(self, target)
947
946
  local handle = self.handle
@@ -1206,6 +1205,14 @@ __TS__SetDescriptor(
1206
1205
  end},
1207
1206
  true
1208
1207
  )
1208
+ __TS__SetDescriptor(
1209
+ Unit.prototype,
1210
+ "isStunned",
1211
+ {get = function(self)
1212
+ return getUnitCurrentOrder(self.handle) == orderId("stunned")
1213
+ end},
1214
+ true
1215
+ )
1209
1216
  __TS__SetDescriptor(
1210
1217
  Unit.prototype,
1211
1218
  "combatClassifications",
@@ -2326,10 +2333,12 @@ Unit.onImmediateOrder = dispatchId(__TS__New(
2326
2333
  ____exports.UnitTriggerEvent,
2327
2334
  EVENT_PLAYER_UNIT_ISSUED_ORDER,
2328
2335
  function()
2329
- local unit = ____exports.Unit:of(getOrderedUnit())
2330
- local issuedOrderId = getIssuedOrderId()
2331
- if unit ~= nil and unit.state == 1 then
2332
- return unit, issuedOrderId
2336
+ local handle = getOrderedUnit()
2337
+ if handle ~= nil and getUnitTypeId(handle) ~= dummyUnitId then
2338
+ local unit = ____exports.Unit:of(handle)
2339
+ if unit.state == 1 then
2340
+ return unit, getIssuedOrderId()
2341
+ end
2333
2342
  end
2334
2343
  return IgnoreEvent
2335
2344
  end
@@ -2520,8 +2529,9 @@ Unit.itemDroppedEvent = __TS__New(
2520
2529
  EVENT_PLAYER_UNIT_DROP_ITEM,
2521
2530
  function()
2522
2531
  local unit = getTriggerUnit()
2523
- if getUnitTypeId(unit) ~= dummyUnitId then
2524
- return ____exports.Unit:of(unit), Item:of(getManipulatedItem())
2532
+ local item = getManipulatedItem()
2533
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2534
+ return ____exports.Unit:of(unit), Item:of(item)
2525
2535
  end
2526
2536
  return IgnoreEvent
2527
2537
  end
@@ -2531,8 +2541,9 @@ Unit.itemPickedUpEvent = __TS__New(
2531
2541
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2532
2542
  function()
2533
2543
  local unit = getTriggerUnit()
2534
- if getUnitTypeId(unit) ~= dummyUnitId then
2535
- return ____exports.Unit:of(unit), Item:of(getManipulatedItem())
2544
+ local item = getManipulatedItem()
2545
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2546
+ return ____exports.Unit:of(unit), Item:of(item)
2536
2547
  end
2537
2548
  return IgnoreEvent
2538
2549
  end
@@ -2540,7 +2551,14 @@ Unit.itemPickedUpEvent = __TS__New(
2540
2551
  Unit.itemUsedEvent = __TS__New(
2541
2552
  ____exports.UnitTriggerEvent,
2542
2553
  EVENT_PLAYER_UNIT_USE_ITEM,
2543
- function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2554
+ function()
2555
+ local unit = getTriggerUnit()
2556
+ local item = getManipulatedItem()
2557
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2558
+ return ____exports.Unit:of(unit), Item:of(item)
2559
+ end
2560
+ return IgnoreEvent
2561
+ end
2544
2562
  )
2545
2563
  Unit.itemStackedEvent = __TS__New(
2546
2564
  ____exports.UnitTriggerEvent,
@@ -2549,11 +2567,32 @@ Unit.itemStackedEvent = __TS__New(
2549
2567
  )
2550
2568
  __TS__ObjectDefineProperty(
2551
2569
  Unit,
2552
- "itemMovedEvent",
2570
+ "itemUseOrderEvent",
2571
+ {get = function(self)
2572
+ local event = __TS__New(Event)
2573
+ for order = orderId("useslot0"), orderId("useslot5") do
2574
+ local slot = order - orderId("useslot0")
2575
+ local function listener(unit)
2576
+ local item = unit.items[slot + 1]
2577
+ if item ~= nil then
2578
+ invoke(event, unit, item)
2579
+ end
2580
+ end
2581
+ self.onImmediateOrder[order]:addListener(listener)
2582
+ self.onTargetOrder[order]:addListener(listener)
2583
+ self.onPointOrder[order]:addListener(listener)
2584
+ end
2585
+ rawset(self, "itemUseOrderEvent", event)
2586
+ return event
2587
+ end}
2588
+ )
2589
+ __TS__ObjectDefineProperty(
2590
+ Unit,
2591
+ "itemMoveOrderEvent",
2553
2592
  {get = function(self)
2554
2593
  local event = __TS__New(Event)
2555
- for order = orderId("moveslot1"), orderId("moveslot5") do
2556
- local slotTo = order - orderId("moveslot1")
2594
+ for order = orderId("moveslot0"), orderId("moveslot5") do
2595
+ local slotTo = order - orderId("moveslot0")
2557
2596
  self.onTargetOrder[order]:addListener(function(unit, item)
2558
2597
  local slotFrom = unit.items:findSlot(item)
2559
2598
  if slotFrom ~= nil then
@@ -2567,7 +2606,7 @@ __TS__ObjectDefineProperty(
2567
2606
  end
2568
2607
  end)
2569
2608
  end
2570
- rawset(self, "itemMovedEvent", event)
2609
+ rawset(self, "itemMoveOrderEvent", event)
2571
2610
  return event
2572
2611
  end}
2573
2612
  )
@@ -1,6 +1,8 @@
1
1
  local ____exports = {}
2
2
  local getUnitAbility = BlzGetUnitAbility
3
3
  local unitAddAbility = UnitAddAbility
4
+ local unitInventorySize = UnitInventorySize
5
+ local unitItemInSlot = UnitItemInSlot
4
6
  local unitMakeAbilityPermanent = UnitMakeAbilityPermanent
5
7
  ---
6
8
  -- @internal For use by internal systems only.
@@ -10,4 +12,14 @@ ____exports.addInternalAbility = function(unit, abilityTypeId)
10
12
  end
11
13
  return getUnitAbility(unit, abilityTypeId)
12
14
  end
15
+ ---
16
+ -- @internal For use by internal systems only.
17
+ ____exports.findUnitItemSlot = function(unit, item)
18
+ for slot = 0, unitInventorySize(unit) - 1 do
19
+ if item == unitItemInSlot(unit, slot) then
20
+ return slot
21
+ end
22
+ end
23
+ return nil
24
+ end
13
25
  return ____exports
@@ -12,7 +12,8 @@ declare const enum LightningPropertyKey {
12
12
  TARGET_X = 106,
13
13
  TARGET_Y = 107,
14
14
  TARGET_Z = 108,
15
- DURATION = 109
15
+ DURATION = 109,
16
+ FADING = 110
16
17
  }
17
18
  export type LightningConstructor<T extends Lightning> = typeof Lightning & (new (handle: jlightning, typeId: LightningTypeId) => T);
18
19
  export declare class Lightning extends Handle<jlightning> {
@@ -27,6 +28,7 @@ export declare class Lightning extends Handle<jlightning> {
27
28
  private [LightningPropertyKey.TARGET_Y]?;
28
29
  private [LightningPropertyKey.TARGET_Z]?;
29
30
  private [LightningPropertyKey.DURATION]?;
31
+ private [LightningPropertyKey.FADING]?;
30
32
  constructor(handle: jlightning, typeId: LightningTypeId);
31
33
  protected onDestroy(): HandleDestructor;
32
34
  static create<T extends Lightning>(this: LightningConstructor<T>, typeId: LightningTypeId, ...parameters: [
@@ -46,6 +48,10 @@ export declare class Lightning extends Handle<jlightning> {
46
48
  target: Unit
47
49
  ]
48
50
  ]): T;
49
- static flash(...parameters: [...parameters: Parameters<(typeof Lightning)["create"]>, duration: number]): void;
51
+ static flash(...parameters: [
52
+ ...parameters: Parameters<(typeof Lightning)["create"]>,
53
+ duration: number,
54
+ fading?: boolean
55
+ ]): void;
50
56
  }
51
57
  export {};
@@ -27,6 +27,11 @@ local getUnitZ = BlzGetUnitZ
27
27
  local getUnitFlyHeight = GetUnitFlyHeight
28
28
  local getLocationZ = GetLocationZ
29
29
  local moveLocation = MoveLocation
30
+ local getLightningColorA = GetLightningColorA
31
+ local getLightningColorR = GetLightningColorR
32
+ local getLightningColorG = GetLightningColorG
33
+ local getLightningColorB = GetLightningColorB
34
+ local setLightningColor = SetLightningColor
30
35
  local location = Location(0, 0)
31
36
  local unitToUnitLightnings = setmetatable({}, {__mode = "k"})
32
37
  local unitToPointLightnings = setmetatable({}, {__mode = "k"})
@@ -225,9 +230,19 @@ function Lightning.create(self, typeId, checkVisibility, sourceXOrSourceUnit, so
225
230
  return lightning
226
231
  end
227
232
  function Lightning.flash(self, ...)
228
- local parametersToForwardCount = select("#", ...) - 1
233
+ local parameterOrDuration, durationOrFading = select(-2, ...)
234
+ local hasFading = ____type(durationOrFading) ~= "number"
235
+ local parametersToForwardCount = select("#", ...) - (hasFading and 2 or 1)
229
236
  local lightning = forwardByN[parametersToForwardCount](____exports.Lightning.create, self, ...)
230
- local duration = select(-1, ...)
237
+ local duration
238
+ if hasFading then
239
+ duration = parameterOrDuration
240
+ if durationOrFading then
241
+ lightning[110] = true
242
+ end
243
+ else
244
+ duration = durationOrFading
245
+ end
231
246
  lightning[109] = duration
232
247
  temporaryLightningsCount = temporaryLightningsCount + 1
233
248
  temporaryLightnings[temporaryLightningsCount] = lightning
@@ -295,6 +310,16 @@ Timer.onPeriod[UPDATE_PERIOD]:addListener(function()
295
310
  temporaryLightnings[temporaryLightningsCount] = nil
296
311
  temporaryLightningsCount = temporaryLightningsCount - 1
297
312
  else
313
+ if lightning[110] then
314
+ local handle = lightning.handle
315
+ setLightningColor(
316
+ handle,
317
+ getLightningColorR(handle),
318
+ getLightningColorG(handle),
319
+ getLightningColorB(handle),
320
+ getLightningColorA(handle) * (1 - UPDATE_PERIOD / duration)
321
+ )
322
+ end
298
323
  lightning[109] = duration - UPDATE_PERIOD
299
324
  i = i + 1
300
325
  end
@@ -4,5 +4,9 @@ export declare const enum SoundPresetName {
4
4
  ABOMINATION_PISSED = "AbominationPissed",
5
5
  ABOMINATION_READY = "AbominationReady",
6
6
  ABOMINATION_WAR_CRY = "AbominationWarcry",
7
- AXE_MEDIUM_CHOP_WOOD = "AxeMediumChopWood"
7
+ AXE_MEDIUM_CHOP_WOOD = "AxeMediumChopWood",
8
+ IMPALE = "Impale",
9
+ IMPALE_HIT = "ImpaleHit",
10
+ IMPALE_LAND = "ImpaleLand",
11
+ IMPALE_CAST = "ImpaleCast"
8
12
  }
@@ -1,7 +1,6 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
- local __TS__New = ____lualib.__TS__New
5
4
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
6
5
  local ____exports = {}
7
6
  local ____unit = require("engine.internal.unit")
@@ -31,7 +30,7 @@ local ____entry = require("engine.object-data.entry")
31
30
  local extractObjectDataEntryLevelFieldValue = ____entry.extractObjectDataEntryLevelFieldValue
32
31
  local ObjectDataEntry = ____entry.ObjectDataEntry
33
32
  local ____object_2Ddata_2Dentry_2Did_2Dgenerator = require("engine.object-data.utility.object-data-entry-id-generator")
34
- local ObjectDataEntryIdGenerator = ____object_2Ddata_2Dentry_2Did_2Dgenerator.ObjectDataEntryIdGenerator
33
+ local abilityTypeIdGenerator = ____object_2Ddata_2Dentry_2Did_2Dgenerator.abilityTypeIdGenerator
35
34
  local ____upgrade = require("engine.object-data.entry.upgrade")
36
35
  local Upgrade = ____upgrade.Upgrade
37
36
  local castAnimationFQNByAbilityTypeId = {}
@@ -53,10 +52,7 @@ end
53
52
  function AbilityType.getObjectData(self, map)
54
53
  return map.objects.ability
55
54
  end
56
- AbilityType.idGenerator = __TS__New(
57
- ObjectDataEntryIdGenerator,
58
- fourCC("A000")
59
- )
55
+ AbilityType.idGenerator = abilityTypeIdGenerator
60
56
  __TS__SetDescriptor(
61
57
  AbilityType.prototype,
62
58
  "channelingAnimation",
@@ -999,7 +995,7 @@ local function handleAbilityCastingStartEvent(caster, ability)
999
995
  end
1000
996
  casterCastingEffectsByCaster[caster] = effects
1001
997
  end
1002
- local function handleAbilityStopEvent(caster)
998
+ local function handleAbilityStopCastingEvent(caster)
1003
999
  local effects = casterCastingEffectsByCaster[caster]
1004
1000
  if effects ~= nil then
1005
1001
  for i = 1, #effects do
@@ -1010,8 +1006,8 @@ local function handleAbilityStopEvent(caster)
1010
1006
  end
1011
1007
  for abilityTypeId in pairs(casterCastingEffectModelPathsByAbilityTypeId) do
1012
1008
  Unit.abilityCastingStartEvent[abilityTypeId]:addListener(4, handleAbilityCastingStartEvent)
1013
- Unit.abilityChannelingStartEvent[abilityTypeId]:addListener(4, handleAbilityStopEvent)
1014
- Unit.abilityStopEvent[abilityTypeId]:addListener(4, handleAbilityStopEvent)
1009
+ Unit.abilityChannelingStartEvent[abilityTypeId]:addListener(4, handleAbilityStopCastingEvent)
1010
+ Unit.abilityStopEvent[abilityTypeId]:addListener(4, handleAbilityStopCastingEvent)
1015
1011
  end
1016
1012
  local casterChannelingEffectModelPathsByAbilityTypeId = postcompile(function()
1017
1013
  return mapValues(
@@ -1042,7 +1038,7 @@ local function handleAbilityChannelingStartEvent(caster, ability)
1042
1038
  end
1043
1039
  casterChannelingEffectsByCaster[caster] = effects
1044
1040
  end
1045
- local function handleAbilityStopEventV2(caster)
1041
+ local function handleAbilityStopChannelingEvent(caster)
1046
1042
  local effects = casterChannelingEffectsByCaster[caster]
1047
1043
  if effects ~= nil then
1048
1044
  for i = 1, #effects do
@@ -1053,7 +1049,7 @@ local function handleAbilityStopEventV2(caster)
1053
1049
  end
1054
1050
  for abilityTypeId in pairs(casterChannelingEffectModelPathsByAbilityTypeId) do
1055
1051
  Unit.abilityChannelingStartEvent[abilityTypeId]:addListener(4, handleAbilityChannelingStartEvent)
1056
- Unit.abilityChannelingFinishEvent[abilityTypeId]:addListener(4, handleAbilityStopEventV2)
1057
- Unit.abilityStopEvent[abilityTypeId]:addListener(4, handleAbilityStopEventV2)
1052
+ Unit.abilityChannelingFinishEvent[abilityTypeId]:addListener(4, handleAbilityStopChannelingEvent)
1053
+ Unit.abilityStopEvent[abilityTypeId]:addListener(4, handleAbilityStopChannelingEvent)
1058
1054
  end
1059
1055
  return ____exports
@@ -45,6 +45,8 @@ export declare class ItemType extends ObjectDataEntry<ItemTypeId> {
45
45
  set tooltipText(tooltipText: string);
46
46
  get tooltipExtendedText(): string;
47
47
  set tooltipExtendedText(tooltipText: string);
48
+ get cooldownGroupId(): number;
49
+ set cooldownGroupId(cooldownGroupId: number);
48
50
  get goldCost(): number;
49
51
  set goldCost(goldCost: number);
50
52
  get lumberCost(): number;
@@ -256,6 +256,19 @@ __TS__SetDescriptor(
256
256
  },
257
257
  true
258
258
  )
259
+ __TS__SetDescriptor(
260
+ ItemType.prototype,
261
+ "cooldownGroupId",
262
+ {
263
+ get = function(self)
264
+ return self:getObjectDataEntryIdField("icid")
265
+ end,
266
+ set = function(self, cooldownGroupId)
267
+ self:setObjectDataEntryIdField("icid", cooldownGroupId)
268
+ end
269
+ },
270
+ true
271
+ )
259
272
  __TS__SetDescriptor(
260
273
  ItemType.prototype,
261
274
  "goldCost",
@@ -1,5 +1,6 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
+ local __TS__New = ____lualib.__TS__New
3
4
  local ____exports = {}
4
5
  local ____preconditions = require("utility.preconditions")
5
6
  local checkNotNull = ____preconditions.checkNotNull
@@ -60,4 +61,10 @@ function ObjectDataEntryIdGenerator.prototype.next(self)
60
61
  self.id = id
61
62
  return id
62
63
  end
64
+ ---
65
+ -- @internal For use by internal systems only.
66
+ ____exports.abilityTypeIdGenerator = __TS__New(
67
+ ____exports.ObjectDataEntryIdGenerator,
68
+ fourCC("A000")
69
+ )
63
70
  return ____exports
@@ -45,9 +45,10 @@ export declare class AbilityStringField extends AbilityField<string, jabilitystr
45
45
  protected setNativeFieldValue(instance: Ability, value: string): boolean;
46
46
  static get valueChangeEvent(): ObjectFieldValueChangeEvent<AbilityStringField>;
47
47
  }
48
- export declare abstract class AbilityArrayField<ValueType extends number | string | boolean = number | string | boolean, NativeFieldType = unknown> extends ObjectArrayField<AbilityType, Ability, ValueType, NativeFieldType> {
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
52
  }
52
53
  export declare class AbilityStringArrayField extends AbilityArrayField<string, jabilitystringlevelfield> {
53
54
  protected get defaultValue(): string;
@@ -130,5 +131,10 @@ export declare class AbilityCombatClassificationsLevelField extends AbilityLevel
130
131
  protected getNativeFieldValue(instance: Ability, level: number): CombatClassifications;
131
132
  protected setNativeFieldValue(instance: Ability, level: number, value: CombatClassifications): boolean;
132
133
  }
133
- export type AbilityDependentValue<ValueType extends boolean | number | string> = ValueType | AbilityField<ValueType> | AbilityLevelField<ValueType> | ((ability: Ability) => ValueType);
134
- export declare const resolveCurrentAbilityDependentValue: <ValueType extends boolean | number | string>(ability: Ability, value: AbilityDependentValue<ValueType>) => ValueType;
134
+ export type ReadonlySubscribableAbilityDependentValue<ValueType extends boolean | number | string> = ValueType | ReadonlyObjectFieldType<AbilityField<ValueType>> | ReadonlyObjectLevelFieldType<AbilityLevelField<ValueType>>;
135
+ export type SubscribableAbilityDependentValue<ValueType extends boolean | number | string> = ValueType | AbilityField<ValueType> | AbilityLevelField<ValueType>;
136
+ export type AbilityDependentValue<ValueType extends boolean | number | string> = SubscribableAbilityDependentValue<ValueType> | ((ability: Ability) => ValueType);
137
+ export declare const resolveCurrentAbilityDependentValue: {
138
+ <ValueType extends boolean | number | string>(ability: Ability, value: AbilityDependentValue<ValueType>): ValueType;
139
+ <ValueType extends boolean | number | string>(ability: Ability, value?: AbilityDependentValue<ValueType>): ValueType | undefined;
140
+ };
@@ -197,6 +197,9 @@ __TS__ClassExtends(AbilityArrayField, ObjectArrayField)
197
197
  function AbilityArrayField.prototype.getObjectDataEntryId(self, instance)
198
198
  return instance.typeId
199
199
  end
200
+ function AbilityArrayField.prototype.hasNativeFieldValue(self, instance)
201
+ return instance:hasField(self.nativeField)
202
+ end
200
203
  __TS__SetDescriptor(
201
204
  AbilityArrayField.prototype,
202
205
  "instanceClass",
@@ -16,6 +16,8 @@ declare abstract class ObjectFieldBase<ObjectDataEntryType extends ObjectDataEnt
16
16
  readonly id: ObjectFieldId;
17
17
  protected abstract getNativeFieldById(id: number): NativeFieldType;
18
18
  protected abstract getObjectDataEntryId(instance: InstanceType): ObjectDataEntryIdType<ObjectDataEntryType>;
19
+ protected abstract hasNativeFieldValue(instance: InstanceType): boolean;
20
+ hasValue(instance: InstanceType): boolean;
19
21
  constructor(id: number);
20
22
  static create<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldConstructor<T>, id?: number): T & symbol;
21
23
  static of<T extends ObjectFieldBase<any, any, any, any>>(this: ObjectFieldAbstractConstructor<T>, id: number): T | undefined;
@@ -35,7 +37,6 @@ export type ReadonlyObjectFieldType<T extends ObjectField<any, any, any, any>> =
35
37
  type ReadonlyObjectFieldConstructor<T extends ObjectField> = OmitConstructor<typeof ObjectField> & (abstract new (...args: any[]) => ReadonlyObjectFieldType<T>);
36
38
  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> {
37
39
  protected abstract readonly defaultValue: ValueType;
38
- protected abstract hasNativeFieldValue(instance: InstanceType): boolean;
39
40
  protected abstract getNativeFieldValue(instance: InstanceType): ValueType;
40
41
  protected abstract setNativeFieldValue(instance: InstanceType, value: ValueType): boolean;
41
42
  getValue(entry: ObjectDataEntryType | InstanceType): ValueType;
@@ -71,7 +72,6 @@ export declare abstract class ObjectArrayField<ObjectDataEntryType extends Objec
71
72
  }
72
73
  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> {
73
74
  protected abstract readonly defaultValue: ValueType;
74
- protected abstract hasNativeFieldValue(instance: InstanceType): boolean;
75
75
  protected abstract getNativeFieldValue(instance: InstanceType, level: number): ValueType;
76
76
  protected abstract setNativeFieldValue(instance: InstanceType, level: number, value: ValueType): boolean;
77
77
  protected abstract getLevelCount(entry: ObjectDataEntryType | InstanceType): number;
@@ -46,6 +46,10 @@ end
46
46
  function ObjectFieldBase.prototype.supports(self, instance)
47
47
  return __TS__InstanceOf(instance, self.instanceClass)
48
48
  end
49
+ function ObjectFieldBase.prototype.hasValue(self, instance)
50
+ local defaultValueByObjectDataEntryId = defaultValueByObjectDataEntryIdByObjectFieldId[self.id]
51
+ return defaultValueByObjectDataEntryId ~= nil and defaultValueByObjectDataEntryId[self:getObjectDataEntryId(instance)] ~= nil or self:hasNativeFieldValue(instance)
52
+ end
49
53
  function ObjectFieldBase.create(self, id)
50
54
  return __TS__New(
51
55
  self,
@@ -687,6 +687,8 @@ export declare const DISABLE_OTHER_ABILITIES_ABILITY_BOOLEAN_LEVEL_FIELD: Abilit
687
687
  export declare const ALLOW_BOUNTY_ABILITY_BOOLEAN_LEVEL_FIELD: AbilityBooleanLevelField & symbol;
688
688
  export declare const ICON_NORMAL_ABILITY_STRING_LEVEL_FIELD: AbilityStringLevelField & symbol;
689
689
  export declare const CASTER_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD: AbilityStringArrayField & symbol;
690
+ export declare const CASTER_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD: AbilityStringField & symbol;
691
+ export declare const CASTER_EFFECT_SECOND_ATTACHMENT_POINT_STRING_FIELD: AbilityStringField & symbol;
690
692
  export declare const TARGET_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD: AbilityStringArrayField & symbol;
691
693
  export declare const TARGET_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD: AbilityStringField & symbol;
692
694
  export declare const TARGET_EFFECT_SECOND_ATTACHMENT_POINT_STRING_FIELD: AbilityStringField & symbol;
@@ -698,6 +698,8 @@ ____exports.DISABLE_OTHER_ABILITIES_ABILITY_BOOLEAN_LEVEL_FIELD = AbilityBoolean
698
698
  ____exports.ALLOW_BOUNTY_ABILITY_BOOLEAN_LEVEL_FIELD = AbilityBooleanLevelField:create(fourCC("Ntm4"))
699
699
  ____exports.ICON_NORMAL_ABILITY_STRING_LEVEL_FIELD = AbilityStringLevelField:create(fourCC("aart"))
700
700
  ____exports.CASTER_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = AbilityStringArrayField:create(fourCC("acat"))
701
+ ____exports.CASTER_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD = AbilityStringField:create(fourCC("acap"))
702
+ ____exports.CASTER_EFFECT_SECOND_ATTACHMENT_POINT_STRING_FIELD = AbilityStringField:create(fourCC("aca1"))
701
703
  ____exports.TARGET_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = AbilityStringArrayField:create(fourCC("atat"))
702
704
  ____exports.TARGET_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD = AbilityStringField:create(fourCC("ata0"))
703
705
  ____exports.TARGET_EFFECT_SECOND_ATTACHMENT_POINT_STRING_FIELD = AbilityStringField:create(fourCC("ata1"))
package/engine/unit.d.ts CHANGED
@@ -17,6 +17,7 @@ import "./internal/unit/ghost-counter";
17
17
  import "./internal/unit/invulnerability-counter";
18
18
  import "./internal/unit/detach-missiles";
19
19
  import "./internal/unit/main-selected";
20
+ import "./internal/unit/add-item-to-slot-init";
20
21
  import "./internal/unit/band-aids/ancestral-spirit-cannibalize";
21
22
  export { Unit, DamagingEvent, DamageEvent } from "./internal/unit";
22
23
  export * from "./internal/unit+damage";
package/engine/unit.lua CHANGED
@@ -17,6 +17,7 @@ require("engine.internal.unit.ghost-counter")
17
17
  require("engine.internal.unit.invulnerability-counter")
18
18
  require("engine.internal.unit.detach-missiles")
19
19
  require("engine.internal.unit.main-selected")
20
+ require("engine.internal.unit.add-item-to-slot-init")
20
21
  require("engine.internal.unit.band-aids.ancestral-spirit-cannibalize")
21
22
  do
22
23
  local ____unit = require("engine.internal.unit")
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.29b3feb",
4
+ "version": "0.0.1-dev.2ae9956",
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.880fc91"
27
+ "warpack": "0.0.1-dev.1830aad"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@typescript-eslint/eslint-plugin": "^8.13.0",
@@ -32,7 +32,10 @@ export declare const flatMapToLuaSet: {
32
32
  };
33
33
  export declare const mapIndexed: <T, R>(array: readonly T[], transform: (index: number, value: T) => R) => R[];
34
34
  export declare const associate: <T, K extends AnyNotNil, V>(array: readonly T[], keySelector: (value: T) => K, valueSelector: (value: T) => V) => LuaMap<K, V>;
35
- export declare const associateBy: <K extends AnyNotNil, V>(array: readonly V[], keySelector: (value: V) => K) => LuaMap<K, V>;
35
+ export declare const associateBy: {
36
+ <K extends AnyNotNil, V>(array: readonly V[], keySelector: (value: V) => K): LuaMap<K, V>;
37
+ <K extends KeysOfType<V, AnyNotNil>, V>(array: readonly V[], keySelector: K): LuaMap<V[K] extends AnyNotNil ? V[K] : never, V>;
38
+ };
36
39
  export declare const associateByIndexed: <K extends AnyNotNil, V>(array: readonly V[], keySelector: (index: number, value: V) => K) => LuaMap<K, V>;
37
40
  export declare const associateWith: <K extends AnyNotNil, V>(array: readonly K[], valueSelector: (value: K) => V) => LuaMap<K, V>;
38
41
  export declare const associateWithIndexed: <K extends AnyNotNil, V>(array: readonly K[], valueSelector: (index: number, value: K) => V) => LuaMap<K, V>;
@@ -41,6 +44,10 @@ export declare const average: (array: readonly number[]) => number;
41
44
  export declare const sum: (array: readonly number[]) => number;
42
45
  export declare const product: (array: readonly number[]) => number;
43
46
  export declare const max: (array: readonly number[]) => number;
47
+ export declare const maxBy: {
48
+ <T, Args extends any[]>(array: readonly T[], selector: (value: T, ...args: Args) => number, ...args: Args): T | undefined;
49
+ <T, K extends KeysOfType<T, number>>(array: readonly T[], key: K): T | undefined;
50
+ };
44
51
  export declare const intersperse: <T>(array: readonly T[], delimiter: T) => T[];
45
52
  export declare const zip: <T, R, V>(array: readonly T[], otherArray: readonly R[], transform: (value: T, otherValue: R) => V) => V[];
46
53
  export declare const chunked: <T>(array: readonly T[], size: number) => T[][];
@@ -178,9 +178,16 @@ ____exports.associate = function(array, keySelector, valueSelector)
178
178
  end
179
179
  ____exports.associateBy = function(array, keySelector)
180
180
  local result = {}
181
- for i = 1, #array do
182
- local value = array[i]
183
- result[keySelector(value)] = value
181
+ if type(keySelector) == "function" then
182
+ for i = 1, #array do
183
+ local value = array[i]
184
+ result[keySelector(value)] = value
185
+ end
186
+ else
187
+ for i = 1, #array do
188
+ local value = array[i]
189
+ result[value[keySelector]] = value
190
+ end
184
191
  end
185
192
  return result
186
193
  end
@@ -251,6 +258,30 @@ ____exports.max = function(array)
251
258
  end
252
259
  return mathMax(table.unpack(array))
253
260
  end
261
+ ____exports.maxBy = function(array, selector, ...)
262
+ local result = nil
263
+ local maxValue = -math.huge
264
+ if type(selector) == "function" then
265
+ for i = 1, #array do
266
+ local element = array[i]
267
+ local value = selector(element, ...)
268
+ if value > maxValue then
269
+ result = element
270
+ maxValue = value
271
+ end
272
+ end
273
+ else
274
+ for i = 1, #array do
275
+ local element = array[i]
276
+ local value = element[selector]
277
+ if value > maxValue then
278
+ result = element
279
+ maxValue = value
280
+ end
281
+ end
282
+ end
283
+ return result
284
+ end
254
285
  ____exports.intersperse = function(array, delimiter)
255
286
  local result = {}
256
287
  local length = #array
@@ -0,0 +1,2 @@
1
+ /** @noSelfInFile */
2
+ export declare const lazyRecord: <K extends keyof any, V>(initializer: (key: K) => V) => Readonly<Record<K, V>>;
@@ -0,0 +1,14 @@
1
+ local ____exports = {}
2
+ local rawset = _G.rawset
3
+ local setmetatable = _G.setmetatable
4
+ ____exports.lazyRecord = function(initializer)
5
+ return setmetatable(
6
+ {},
7
+ {__index = function(self, key)
8
+ local value = initializer(key)
9
+ rawset(self, key, value)
10
+ return value
11
+ end}
12
+ )
13
+ end
14
+ return ____exports