warscript 0.0.1-dev.d690591 → 0.0.1-dev.d7e0522

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.
package/attributes.d.ts CHANGED
@@ -1,8 +1,12 @@
1
1
  /** @noSelfInFile */
2
+ declare const marker: {};
2
3
  export type Attribute<T> = {
3
4
  readonly __attribute: unique symbol;
4
5
  readonly __type: T;
6
+ readonly __marker: typeof marker;
5
7
  } & symbol;
8
+ export declare const attribute: <T>() => Attribute<T>;
9
+ export declare const isAttribute: (value: unknown) => value is Attribute<unknown>;
6
10
  export declare namespace Attribute {
7
11
  const create: <T>() => Attribute<T>;
8
12
  }
@@ -10,3 +14,4 @@ export declare class AttributesHolder {
10
14
  readonly get: (<T>(attribute: Attribute<T>) => T | undefined) & LuaExtension<"TableGetMethod">;
11
15
  readonly set: (<T>(attribute: Attribute<T>, value: T | undefined) => void) & LuaExtension<"TableSetMethod">;
12
16
  }
17
+ export {};
package/attributes.lua CHANGED
@@ -1,11 +1,18 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local ____exports = {}
4
+ local marker = {}
5
+ ____exports.attribute = function()
6
+ return {__marker = marker}
7
+ end
8
+ ____exports.isAttribute = function(value)
9
+ return type(value) == "table" and rawget(value, "__marker") == marker
10
+ end
4
11
  ____exports.Attribute = {}
5
12
  local Attribute = ____exports.Attribute
6
13
  do
7
14
  Attribute.create = function()
8
- return {}
15
+ return {__marker = marker}
9
16
  end
10
17
  end
11
18
  ____exports.AttributesHolder = __TS__Class()
@@ -6,6 +6,7 @@ export type Order = {
6
6
  id: number;
7
7
  startX: number;
8
8
  startY: number;
9
+ issueTime: number;
9
10
  } & ({
10
11
  type: "immediate";
11
12
  } | {
@@ -3,16 +3,25 @@ local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
3
3
  local ____exports = {}
4
4
  local ____unit = require("core.types.unit")
5
5
  local Unit = ____unit.Unit
6
+ local ____game = require("core.game")
7
+ local elapsedTime = ____game.elapsedTime
6
8
  local getUnitCurrentOrder = GetUnitCurrentOrder
7
9
  local orders = setmetatable({}, {__mode = "k"})
8
10
  Unit.onImmediateOrder:addListener(function(unit, orderId)
9
- orders[unit] = {id = orderId, startX = unit.x, startY = unit.y, type = "immediate"}
11
+ orders[unit] = {
12
+ id = orderId,
13
+ startX = unit.x,
14
+ startY = unit.y,
15
+ issueTime = elapsedTime(),
16
+ type = "immediate"
17
+ }
10
18
  end)
11
19
  Unit.onPointOrder:addListener(function(unit, orderId, x, y)
12
20
  orders[unit] = {
13
21
  id = orderId,
14
22
  startX = unit.x,
15
23
  startY = unit.y,
24
+ issueTime = elapsedTime(),
16
25
  type = "point",
17
26
  targetX = x,
18
27
  targetY = y
@@ -23,6 +32,7 @@ Unit.onTargetOrder:addListener(function(unit, orderId, target)
23
32
  id = orderId,
24
33
  startX = unit.x,
25
34
  startY = unit.y,
35
+ issueTime = elapsedTime(),
26
36
  type = "target",
27
37
  target = target
28
38
  }
@@ -6,23 +6,36 @@ import "../internal/unit+ability";
6
6
  import "../internal/unit-missile-launch";
7
7
  import { Item } from "../internal/item";
8
8
  import type { AbilityBehavior } from "./ability";
9
+ import { Event } from "../../event";
10
+ import { Destructor } from "../../destroyable";
11
+ import type { Widget } from "../../core/types/widget";
9
12
  export type UnitBehaviorConstructor<Args extends any[]> = new (unit: Unit, ...args: Args) => UnitBehavior;
10
13
  export declare abstract class UnitBehavior<PeriodicActionParameters extends any[] = any[]> extends Behavior<Unit, PeriodicActionParameters> {
11
14
  constructor(unit: Unit);
15
+ protected onDestroy(): Destructor;
12
16
  readonly sourceAbilityBehavior?: AbilityBehavior;
13
17
  get unit(): Unit;
18
+ registerInRangeUnitEvent<T extends string, Args extends any[]>(this: UnitBehavior<PeriodicActionParameters> & Record<T, (this: this, unit: Unit, ...args: Args) => unknown>, event: Event<[Unit, ...Args]>, range: number, listener: T): void;
19
+ onImmediateOrder(orderId: number): void;
20
+ onTargetOrder(orderId: number, target: Widget): void;
21
+ onPointOrder(orderId: number, x: number, y: number): void;
14
22
  onAutoAttackStart(target: Unit): void;
15
23
  onAutoAttackFinish(target: Unit): void;
24
+ onTargetingAutoAttackStart(source: Unit): void;
25
+ onTargetingAutoAttackFinish(source: Unit): void;
16
26
  onDamageDealing(target: Unit, event: DamagingEvent): void;
17
27
  onDamageDealt(target: Unit, event: DamageEvent): void;
18
28
  onDamageReceiving(source: Unit | undefined, event: DamagingEvent): void;
19
29
  onDamageReceived(source: Unit | undefined, event: DamageEvent): void;
20
30
  onAbilityGained(ability: Ability): void;
21
31
  onAbilityLost(ability: Ability): void;
32
+ onAbilityChannelingStart(ability: Ability): void;
33
+ onAbilityChannelingFinish(ability: Ability): void;
22
34
  onItemDropped(item: Item): void;
23
35
  onItemPickedUp(item: Item): void;
24
36
  onItemUsed(item: Item): void;
25
37
  onItemStacked(item: Item): void;
38
+ onItemChargesChanged(item: Item): void;
26
39
  onKill(target: Unit): void;
27
40
  onDeath(source: Unit | undefined): void;
28
41
  }
@@ -1,6 +1,7 @@
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
4
5
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
6
  local ____exports = {}
6
7
  local ____behavior = require("engine.behavior")
@@ -9,6 +10,17 @@ local ____unit = require("engine.internal.unit")
9
10
  local Unit = ____unit.Unit
10
11
  require("engine.internal.unit+ability")
11
12
  require("engine.internal.unit-missile-launch")
13
+ local ____linked_2Dset = require("utility.linked-set")
14
+ local LinkedSet = ____linked_2Dset.LinkedSet
15
+ local ____lua_2Dmaps = require("utility.lua-maps")
16
+ local getOrPut = ____lua_2Dmaps.getOrPut
17
+ local mutableLuaMap = ____lua_2Dmaps.mutableLuaMap
18
+ local ____lua_2Dsets = require("utility.lua-sets")
19
+ local mutableLuaSet = ____lua_2Dsets.mutableLuaSet
20
+ local behaviorsByEvent = {}
21
+ local rangeByBehaviorByEvent = {}
22
+ local listenerByBehaviorByEvent = {}
23
+ local eventsByBehavior = {}
12
24
  ____exports.UnitBehavior = __TS__Class()
13
25
  local UnitBehavior = ____exports.UnitBehavior
14
26
  UnitBehavior.name = "UnitBehavior"
@@ -16,10 +28,66 @@ __TS__ClassExtends(UnitBehavior, Behavior)
16
28
  function UnitBehavior.prototype.____constructor(self, unit)
17
29
  Behavior.prototype.____constructor(self, unit)
18
30
  end
31
+ function UnitBehavior.prototype.onDestroy(self)
32
+ local events = eventsByBehavior[self]
33
+ if events ~= nil then
34
+ for event in pairs(events) do
35
+ local ____opt_0 = behaviorsByEvent[event]
36
+ if ____opt_0 ~= nil then
37
+ ____opt_0:remove(self)
38
+ end
39
+ local ____opt_2 = rangeByBehaviorByEvent[event]
40
+ if ____opt_2 ~= nil then
41
+ ____opt_2[self] = nil
42
+ end
43
+ local ____opt_4 = listenerByBehaviorByEvent[event]
44
+ if ____opt_4 ~= nil then
45
+ ____opt_4[self] = nil
46
+ end
47
+ end
48
+ eventsByBehavior[self] = nil
49
+ end
50
+ return Behavior.prototype.onDestroy(self)
51
+ end
52
+ function UnitBehavior.prototype.registerInRangeUnitEvent(self, event, range, listener)
53
+ local rangeByBehavior = getOrPut(rangeByBehaviorByEvent, event, mutableLuaMap)
54
+ rangeByBehavior[self] = range
55
+ local listenerByBehavior = getOrPut(listenerByBehaviorByEvent, event, mutableLuaMap)
56
+ listenerByBehavior[self] = listener
57
+ getOrPut(eventsByBehavior, self, mutableLuaSet)[event] = true
58
+ local behaviors = behaviorsByEvent[event]
59
+ if behaviors == nil then
60
+ event:addListener(function(unit, ...)
61
+ local behaviors = behaviorsByEvent[event]
62
+ if behaviors ~= nil then
63
+ for behavior in pairs(behaviors) do
64
+ local range = rangeByBehavior[behavior]
65
+ if range ~= nil and unit:getCollisionDistanceTo(behavior.unit) <= range then
66
+ local ____self_6 = behavior
67
+ ____self_6[listenerByBehavior[behavior]](____self_6, unit, ...)
68
+ end
69
+ end
70
+ end
71
+ end)
72
+ behaviors = __TS__New(LinkedSet)
73
+ behaviorsByEvent[event] = behaviors
74
+ end
75
+ behaviors:add(self)
76
+ end
77
+ function UnitBehavior.prototype.onImmediateOrder(self, orderId)
78
+ end
79
+ function UnitBehavior.prototype.onTargetOrder(self, orderId, target)
80
+ end
81
+ function UnitBehavior.prototype.onPointOrder(self, orderId, x, y)
82
+ end
19
83
  function UnitBehavior.prototype.onAutoAttackStart(self, target)
20
84
  end
21
85
  function UnitBehavior.prototype.onAutoAttackFinish(self, target)
22
86
  end
87
+ function UnitBehavior.prototype.onTargetingAutoAttackStart(self, source)
88
+ end
89
+ function UnitBehavior.prototype.onTargetingAutoAttackFinish(self, source)
90
+ end
23
91
  function UnitBehavior.prototype.onDamageDealing(self, target, event)
24
92
  end
25
93
  function UnitBehavior.prototype.onDamageDealt(self, target, event)
@@ -32,6 +100,10 @@ function UnitBehavior.prototype.onAbilityGained(self, ability)
32
100
  end
33
101
  function UnitBehavior.prototype.onAbilityLost(self, ability)
34
102
  end
103
+ function UnitBehavior.prototype.onAbilityChannelingStart(self, ability)
104
+ end
105
+ function UnitBehavior.prototype.onAbilityChannelingFinish(self, ability)
106
+ end
35
107
  function UnitBehavior.prototype.onItemDropped(self, item)
36
108
  end
37
109
  function UnitBehavior.prototype.onItemPickedUp(self, item)
@@ -40,6 +112,8 @@ function UnitBehavior.prototype.onItemUsed(self, item)
40
112
  end
41
113
  function UnitBehavior.prototype.onItemStacked(self, item)
42
114
  end
115
+ function UnitBehavior.prototype.onItemChargesChanged(self, item)
116
+ end
43
117
  function UnitBehavior.prototype.onKill(self, target)
44
118
  end
45
119
  function UnitBehavior.prototype.onDeath(self, source)
@@ -53,11 +127,28 @@ __TS__SetDescriptor(
53
127
  true
54
128
  );
55
129
  (function(self)
130
+ Unit.onImmediateOrder:addListener(function(source, orderId)
131
+ ____exports.UnitBehavior:forAll(source, "onImmediateOrder", orderId)
132
+ end)
133
+ Unit.onTargetOrder:addListener(function(source, orderId, target)
134
+ ____exports.UnitBehavior:forAll(source, "onTargetOrder", orderId, target)
135
+ end)
136
+ Unit.onPointOrder:addListener(function(source, orderId, x, y)
137
+ ____exports.UnitBehavior:forAll(
138
+ source,
139
+ "onPointOrder",
140
+ orderId,
141
+ x,
142
+ y
143
+ )
144
+ end)
56
145
  Unit.autoAttackStartEvent:addListener(function(source, target)
57
146
  ____exports.UnitBehavior:forAll(source, "onAutoAttackStart", target)
147
+ ____exports.UnitBehavior:forAll(target, "onTargetingAutoAttackStart", source)
58
148
  end)
59
149
  Unit.autoAttackFinishEvent:addListener(function(source, target)
60
150
  ____exports.UnitBehavior:forAll(source, "onAutoAttackFinish", target)
151
+ ____exports.UnitBehavior:forAll(target, "onTargetingAutoAttackFinish", source)
61
152
  end)
62
153
  Unit.onDamaging:addListener(function(source, target, event)
63
154
  if source ~= nil then
@@ -71,11 +162,17 @@ __TS__SetDescriptor(
71
162
  end
72
163
  ____exports.UnitBehavior:forAll(target, "onDamageReceived", source, event)
73
164
  end)
74
- Unit.abilityGainedEvent:addListener(function(source, target)
75
- ____exports.UnitBehavior:forAll(source, "onAbilityGained", target)
165
+ Unit.abilityGainedEvent:addListener(function(source, ability)
166
+ ____exports.UnitBehavior:forAll(source, "onAbilityGained", ability)
167
+ end)
168
+ Unit.abilityLostEvent:addListener(function(source, ability)
169
+ ____exports.UnitBehavior:forAll(source, "onAbilityLost", ability)
76
170
  end)
77
- Unit.abilityLostEvent:addListener(function(source, target)
78
- ____exports.UnitBehavior:forAll(source, "onAbilityLost", target)
171
+ Unit.abilityChannelingStartEvent:addListener(function(source, ability)
172
+ ____exports.UnitBehavior:forAll(source, "onAbilityChannelingStart", ability)
173
+ end)
174
+ Unit.abilityChannelingFinishEvent:addListener(function(source, ability)
175
+ ____exports.UnitBehavior:forAll(source, "onAbilityChannelingFinish", ability)
79
176
  end)
80
177
  Unit.deathEvent:addListener(function(target, source)
81
178
  if source ~= nil then
@@ -95,6 +192,9 @@ __TS__SetDescriptor(
95
192
  Unit.itemStackedEvent:addListener(function(unit, item)
96
193
  ____exports.UnitBehavior:forAll(unit, "onItemStacked", item)
97
194
  end)
195
+ Unit.itemChargesChangedEvent:addListener(function(unit, item)
196
+ ____exports.UnitBehavior:forAll(unit, "onItemChargesChanged", item)
197
+ end)
98
198
  end)(UnitBehavior)
99
199
  Unit.destroyEvent:addListener(function(unit)
100
200
  ____exports.UnitBehavior:forAll(unit, "destroy")
@@ -58,6 +58,8 @@ export declare class UnitAbility extends Ability {
58
58
  constructor(handle: jability, typeId: number, owner: Unit);
59
59
  incrementHideCounter(): void;
60
60
  decrementHideCounter(): void;
61
+ incrementDisableCounter(): void;
62
+ decrementDisableCounter(): void;
61
63
  get level(): number;
62
64
  set level(v: number);
63
65
  get cooldownRemaining(): number;
@@ -38,6 +38,7 @@ local getHandleId = GetHandleId
38
38
  local getItemBooleanField = BlzGetItemBooleanField
39
39
  local setItemBooleanField = BlzSetItemBooleanField
40
40
  local unitHideAbility = BlzUnitHideAbility
41
+ local unitDisableAbility = BlzUnitDisableAbility
41
42
  local match = string.match
42
43
  local ____type = _G.type
43
44
  local ____tostring = _G.tostring
@@ -402,6 +403,12 @@ end
402
403
  function UnitAbility.prototype.decrementHideCounter(self)
403
404
  unitHideAbility(self.u, self.typeId, false)
404
405
  end
406
+ function UnitAbility.prototype.incrementDisableCounter(self)
407
+ unitDisableAbility(self.u, self.typeId, true, false)
408
+ end
409
+ function UnitAbility.prototype.decrementDisableCounter(self)
410
+ unitDisableAbility(self.u, self.typeId, false, false)
411
+ end
405
412
  function UnitAbility.prototype.interruptCast(self)
406
413
  self.owner:interruptCast(self.typeId)
407
414
  end
@@ -55,22 +55,24 @@ local COOLDOWN_STARTER_ITEM_TYPE_ID = compiletime(function()
55
55
  itemType.activelyUsed = true
56
56
  return itemType.id
57
57
  end)
58
- local dummy = assert(CreateUnit(
58
+ ---
59
+ -- @internal For use by internal systems only.
60
+ ____exports.itemAbilityDummy = assert(CreateUnit(
59
61
  Player.neutralVictim.handle,
60
62
  dummyUnitId,
61
63
  0,
62
64
  0,
63
65
  270
64
66
  ))
65
- local cooldownStarterItem = UnitAddItemById(dummy, COOLDOWN_STARTER_ITEM_TYPE_ID)
67
+ local cooldownStarterItem = UnitAddItemById(____exports.itemAbilityDummy, COOLDOWN_STARTER_ITEM_TYPE_ID)
66
68
  local cooldownStarterAbility = BlzGetItemAbility(cooldownStarterItem, COOLDOWN_STARTER_ABILITY_TYPE_ID)
67
- ShowUnit(dummy, false)
69
+ ShowUnit(____exports.itemAbilityDummy, false)
68
70
  local function startItemCooldownInternal(handle, cooldown)
69
71
  local cooldownGroup = getItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP)
70
72
  setItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP, COOLDOWN_STARTER_ABILITY_TYPE_ID)
71
73
  setAbilityRealLevelField(cooldownStarterAbility, ABILITY_RLF_COOLDOWN, 0, cooldown)
72
- unitResetCooldown(dummy)
73
- unitUseItem(dummy, cooldownStarterItem)
74
+ unitResetCooldown(____exports.itemAbilityDummy)
75
+ unitUseItem(____exports.itemAbilityDummy, cooldownStarterItem)
74
76
  Timer:run(restoreCooldownGroup, handle, cooldownGroup)
75
77
  end
76
78
  restoreCooldownGroup = function(handle, cooldownGroup)
@@ -85,7 +87,7 @@ ____exports.startItemCooldown = function(handle, owner, cooldown)
85
87
  end
86
88
  ---
87
89
  -- @internal For use by internal systems only.
88
- ____exports.abilityActionDummy = dummy
90
+ ____exports.abilityActionDummy = ____exports.itemAbilityDummy
89
91
  ---
90
92
  -- @internal For use by internal systems only.
91
93
  ____exports.doAbilityAction = function(handle, action, ...)
@@ -104,11 +106,11 @@ ____exports.doAbilityAction = function(handle, action, ...)
104
106
  end
105
107
  x = getItemX(handle)
106
108
  y = getItemY(handle)
107
- unitAddItem(dummy, handle)
109
+ unitAddItem(____exports.itemAbilityDummy, handle)
108
110
  end
109
111
  local result = action(handle, ...)
110
112
  if not isOwned then
111
- unitRemoveItem(dummy, handle)
113
+ unitRemoveItem(____exports.itemAbilityDummy, handle)
112
114
  setItemPosition(handle, x, y)
113
115
  if isPowerup then
114
116
  setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, true)
@@ -139,9 +141,9 @@ ____exports.doAbilityActionForceDummy = function(handle, owner, action, ...)
139
141
  isPowerup = true
140
142
  end
141
143
  unitRemoveItem(owner, handle)
142
- unitAddItem(dummy, handle)
144
+ unitAddItem(____exports.itemAbilityDummy, handle)
143
145
  local result = action(handle, ...)
144
- unitRemoveItem(dummy, handle)
146
+ unitRemoveItem(____exports.itemAbilityDummy, handle)
145
147
  unitAddItemToSlot(owner, handle, slot)
146
148
  if isPowerup then
147
149
  setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, true)
@@ -7,7 +7,6 @@ import { ItemAbility } from "./ability";
7
7
  import { AbilityTypeId } from "../object-data/entry/ability-type";
8
8
  import type { ItemTypeId } from "../object-data/entry/item-type";
9
9
  type DefenseType = 0 | 1 | 2 | 3 | 4 | 5;
10
- export declare const addAndGetAbility: (handle: jitem, abilityTypeId: AbilityTypeId) => jability | null;
11
10
  declare const enum ItemPropertyKey {
12
11
  ABILITIES = 100,
13
12
  LUA_INDEX_BY_ABILITY_TYPE_ID = 101
@@ -74,6 +73,7 @@ export declare class Item extends Handle<jitem> {
74
73
  set position(v: Vec2);
75
74
  set charges(v: number);
76
75
  get charges(): number;
76
+ consumeCharge(): boolean;
77
77
  addAbility(abilityTypeId: AbilityTypeId): ItemAbility | undefined;
78
78
  removeAbility(abilityTypeId: AbilityTypeId): boolean;
79
79
  hasAbility(abilityTypeId: AbilityTypeId): boolean;
@@ -83,5 +83,6 @@ export declare class Item extends Handle<jitem> {
83
83
  static getInRect(rect: ReadonlyRect): Item[];
84
84
  static get onCreate(): Event<[Item]>;
85
85
  static get destroyEvent(): Event<[Item]>;
86
+ static readonly chargesChangedEvent: Event<[Item]>;
86
87
  }
87
88
  export {};
@@ -1,26 +1,33 @@
1
1
  local ____lualib = require("lualib_bundle")
2
+ local __TS__New = ____lualib.__TS__New
2
3
  local __TS__Class = ____lualib.__TS__Class
3
4
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
5
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
6
  local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
6
7
  local __TS__Delete = ____lualib.__TS__Delete
7
8
  local ____exports = {}
9
+ local invoke
8
10
  local ____handle = require("core.types.handle")
9
11
  local Handle = ____handle.Handle
10
12
  local ____color = require("core.types.color")
11
13
  local Color = ____color.Color
14
+ local ____event = require("event")
15
+ local Event = ____event.Event
12
16
  local ____rect = require("core.types.rect")
13
17
  local Rect = ____rect.Rect
14
18
  local ____ability = require("engine.internal.ability")
15
19
  local ItemAbility = ____ability.ItemAbility
16
20
  local ____ability = require("engine.internal.item.ability")
17
21
  local doAbilityAction = ____ability.doAbilityAction
22
+ local doAbilityActionForceDummy = ____ability.doAbilityActionForceDummy
23
+ local itemAbilityDummy = ____ability.itemAbilityDummy
18
24
  local ____dummy_2Ditem = require("engine.internal.object-data.dummy-item")
19
25
  local DUMMY_ITEM_ID = ____dummy_2Ditem.DUMMY_ITEM_ID
20
26
  local ____add_2Ditem_2Dto_2Dslot = require("engine.internal.unit.add-item-to-slot")
21
27
  local SLOT_FILLER_ITEM_TYPE_ID = ____add_2Ditem_2Dto_2Dslot.SLOT_FILLER_ITEM_TYPE_ID
22
28
  local ____vec2 = require("math.vec2")
23
29
  local distance = ____vec2.distance
30
+ local itemChargesChangeEvent = __TS__New(Event)
24
31
  local itemAddAbility = BlzItemAddAbility
25
32
  local itemRemoveAbility = BlzItemRemoveAbility
26
33
  local getItemAbility = BlzGetItemAbility
@@ -36,10 +43,24 @@ local getEnumItem = GetEnumItem
36
43
  local getItemTypeId = GetItemTypeId
37
44
  local getItemX = GetItemX
38
45
  local getItemY = GetItemY
46
+ local getItemCharges = GetItemCharges
47
+ local setItemCharges = SetItemCharges
48
+ local unitRemoveAbility = UnitRemoveAbility
49
+ local unitUseItem = UnitUseItem
50
+ _G.SetItemCharges = function(whichItem, charges)
51
+ setItemCharges(whichItem, charges)
52
+ invoke(
53
+ itemChargesChangeEvent,
54
+ ____exports.Item:of(whichItem)
55
+ )
56
+ end
39
57
  local getItemIntegerField = BlzGetItemIntegerField
40
58
  local setItemBooleanField = BlzSetItemBooleanField
41
59
  local getItemBooleanField = BlzGetItemBooleanField
60
+ invoke = Event.invoke
42
61
  local enumRect = Rect:create(0, 0, 0, 0).handle
62
+ ---
63
+ -- @internal For use by internal systems only.
43
64
  ____exports.addAndGetAbility = function(handle, abilityTypeId)
44
65
  if itemAddAbility(handle, abilityTypeId) then
45
66
  return getItemAbility(handle, abilityTypeId)
@@ -65,6 +86,23 @@ local function getItemAbilities(handle, item)
65
86
  end
66
87
  return abilities
67
88
  end
89
+ local function consumeCharge(handle)
90
+ do
91
+ local i = 0
92
+ local ability = getItemAbilityByIndex(handle, i)
93
+ while ability ~= nil do
94
+ unitRemoveAbility(
95
+ itemAbilityDummy,
96
+ getAbilityId(ability)
97
+ )
98
+ do
99
+ i = i + 1
100
+ ability = getItemAbilityByIndex(handle, i)
101
+ end
102
+ end
103
+ end
104
+ unitUseItem(itemAbilityDummy, handle)
105
+ end
68
106
  local targetCollection
69
107
  local targetCollectionNextIndex
70
108
  local centerX
@@ -116,6 +154,32 @@ end
116
154
  function Item.create(self, id, x, y, skinId)
117
155
  return self:of(BlzCreateItemWithSkin(id, x, y, skinId or id))
118
156
  end
157
+ function Item.prototype.consumeCharge(self)
158
+ local handle = self.handle
159
+ local charges = getItemCharges(handle)
160
+ if charges >= 2 then
161
+ setItemCharges(handle, charges - 1)
162
+ invoke(itemChargesChangeEvent, self)
163
+ return true
164
+ end
165
+ if charges == 1 then
166
+ if getItemBooleanField(handle, ITEM_BF_PERISHABLE) then
167
+ self:destroy()
168
+ return true
169
+ end
170
+ if not getItemBooleanField(handle, ITEM_BF_ACTIVELY_USED) then
171
+ setItemCharges(handle, 0)
172
+ invoke(itemChargesChangeEvent, self)
173
+ return true
174
+ end
175
+ local ____doAbilityActionForceDummy_2 = doAbilityActionForceDummy
176
+ local ____opt_0 = self.owner
177
+ ____doAbilityActionForceDummy_2(handle, ____opt_0 and ____opt_0.handle, consumeCharge)
178
+ invoke(itemChargesChangeEvent, self)
179
+ return true
180
+ end
181
+ return false
182
+ end
119
183
  function Item.prototype.addAbility(self, abilityTypeId)
120
184
  local nativeAbility = doAbilityAction(self.handle, ____exports.addAndGetAbility, abilityTypeId)
121
185
  if nativeAbility ~= nil then
@@ -301,7 +365,7 @@ __TS__SetDescriptor(
301
365
  "perishable",
302
366
  {
303
367
  get = function(self)
304
- return BlzGetItemBooleanField(self.handle, ITEM_BF_PERISHABLE)
368
+ return getItemBooleanField(self.handle, ITEM_BF_PERISHABLE)
305
369
  end,
306
370
  set = function(self, v)
307
371
  BlzSetItemBooleanField(self.handle, ITEM_BF_PERISHABLE, v)
@@ -557,10 +621,11 @@ __TS__SetDescriptor(
557
621
  "charges",
558
622
  {
559
623
  get = function(self)
560
- return GetItemCharges(self.handle)
624
+ return getItemCharges(self.handle)
561
625
  end,
562
626
  set = function(self, v)
563
- SetItemCharges(self.handle, v)
627
+ setItemCharges(self.handle, v)
628
+ invoke(itemChargesChangeEvent, self)
564
629
  end
565
630
  },
566
631
  true
@@ -587,6 +652,7 @@ __TS__ObjectDefineProperty(
587
652
  return self.onDestroyEvent
588
653
  end}
589
654
  )
655
+ Item.chargesChangedEvent = itemChargesChangeEvent
590
656
  local getManipulatedItem = GetManipulatedItem
591
657
  local trigger = CreateTrigger()
592
658
  TriggerRegisterAnyUnitEventBJ(trigger, EVENT_PLAYER_UNIT_PICKUP_ITEM)
@@ -2,7 +2,7 @@
2
2
  import { CombatClassifications } from "../../object-data/auxiliary/combat-classification";
3
3
  declare module "../unit" {
4
4
  interface Unit {
5
- isAllowedTarget(this: Unit, source: Unit, allowedTargetCombatClassifications: CombatClassifications): boolean;
5
+ isAllowedTarget(this: Unit, source: Unit, allowedTargetCombatClassifications?: CombatClassifications): boolean;
6
6
  }
7
7
  }
8
8
  declare module "../unit" {
@@ -5,7 +5,15 @@ local initializeFilterTargetState = ____combat_2Dclassification.initializeFilter
5
5
  local ____unit = require("engine.internal.unit")
6
6
  local Unit = ____unit.Unit
7
7
  Unit.prototype.isAllowedTarget = function(self, source, allowedTargetCombatClassifications)
8
- initializeFilterTargetState(source, allowedTargetCombatClassifications)
8
+ if allowedTargetCombatClassifications ~= nil then
9
+ initializeFilterTargetState(source, allowedTargetCombatClassifications)
10
+ return filterTarget(self)
11
+ end
12
+ initializeFilterTargetState(source, source.firstWeapon.allowedTargetCombatClassifications)
13
+ if filterTarget(self) then
14
+ return true
15
+ end
16
+ initializeFilterTargetState(source, source.secondWeapon.allowedTargetCombatClassifications)
9
17
  return filterTarget(self)
10
18
  end
11
19
  Unit.getAllowedTargetsInRange = function(source, allowedTargetCombatClassifications, x, y, range)
@@ -44,7 +44,7 @@ local function timerCallback(source, target)
44
44
  Event.invoke(autoAttackFinishEvent, source, target)
45
45
  end
46
46
  Unit.autoAttackStartEvent:addListener(function(source, target)
47
- local attackPoint = source.weapons[1].impactDelay
47
+ local attackPoint = (source:chooseWeapon(target) or source.firstWeapon).impactDelay
48
48
  local timer = Timer:simple(attackPoint, timerCallback, source, target)
49
49
  eventTimerByUnit[source] = timer
50
50
  end)
@@ -14,6 +14,7 @@ import { CombatClassification, CombatClassifications } from "../object-data/auxi
14
14
  import { MovementType } from "../object-data/auxiliary/movement-type";
15
15
  import { UnitAttribute } from "../object-data/auxiliary/unit-attribute";
16
16
  import { AttackType } from "../object-data/auxiliary/attack-type";
17
+ import { AttributesHolder } from "../../attributes";
17
18
  export type UnitClassification = junittype;
18
19
  export declare namespace UnitClassification {
19
20
  const STRUCTURE: junittype;
@@ -22,6 +23,7 @@ export declare namespace UnitClassification {
22
23
  const GROUND: junittype;
23
24
  const SUMMONED: junittype;
24
25
  const MECHANICAL: junittype;
26
+ const WORKER: junittype;
25
27
  const ANCIENT: junittype;
26
28
  const SUICIDAL: junittype;
27
29
  const TAUREN: junittype;
@@ -39,7 +41,7 @@ type AbilityDispatcherTable<T extends any[] = []> = {
39
41
  readonly [id: number]: Event<[Unit, Ability, ...T]>;
40
42
  };
41
43
  type AbilityEventDispatcher<T extends any[] = []> = Event<[Unit, Ability, ...T]> & AbilityDispatcherTable<T>;
42
- export interface DamagingEvent {
44
+ export interface DamagingEvent extends AttributesHolder {
43
45
  amount: number;
44
46
  attackType: AttackType;
45
47
  damageType: jdamagetype;
@@ -48,8 +50,9 @@ export interface DamagingEvent {
48
50
  readonly isAttack: boolean;
49
51
  readonly originalAmount: number;
50
52
  readonly originalMetadata: unknown;
53
+ preventRetaliation(this: DamagingEvent): void;
51
54
  }
52
- export type DamageEvent = DamagingEvent & {
55
+ export type DamageEvent = Omit<DamagingEvent, "preventRetaliation"> & {
53
56
  preventDeath<P extends any[]>(this: DamageEvent, callback: (this: void, ...parameters: P) => any, ...parameters: P): void;
54
57
  };
55
58
  export type AttackDamageEvent = DamagingEvent & {
@@ -81,6 +84,8 @@ export declare class UnitWeapon {
81
84
  set cooldown(cooldown: number);
82
85
  get damage(): [minimumDamage: number, maximumDamage: number];
83
86
  set damage([minimumDamage, maximumDamage]: [number, number]);
87
+ get allowedTargetCombatClassifications(): CombatClassifications;
88
+ set allowedTargetCombatClassifications(allowedTargetCombatClassifications: CombatClassifications);
84
89
  get damageBase(): number;
85
90
  set damageBase(damageBase: number);
86
91
  get damageDiceCount(): number;
@@ -162,6 +167,7 @@ export declare class Unit extends Handle<junit> {
162
167
  get weapons(): [UnitWeapon, UnitWeapon];
163
168
  get firstWeapon(): UnitWeapon;
164
169
  get secondWeapon(): UnitWeapon;
170
+ chooseWeapon(target: Unit): UnitWeapon | undefined;
165
171
  get level(): number;
166
172
  set level(v: number);
167
173
  get xp(): number;
@@ -294,6 +300,7 @@ export declare class Unit extends Handle<junit> {
294
300
  get onUnitInRange(): Record<number, Event<[Unit]>>;
295
301
  get onManaEqual(): Record<number, Event<[Unit, number]>>;
296
302
  get manaEvent(): Record<Operator, Record<number, Event<[Unit]>>>;
303
+ get targetAcquiredEvent(): Event;
297
304
  get onSelect(): Event;
298
305
  get onDeselect(): Event;
299
306
  get onImmediateOrder(): Event<[number]>;
@@ -347,6 +354,7 @@ export declare class Unit extends Handle<junit> {
347
354
  static itemPickedUpEvent: UnitTriggerEvent<[Item]>;
348
355
  static itemUsedEvent: UnitTriggerEvent<[Item]>;
349
356
  static itemStackedEvent: UnitTriggerEvent<[Item]>;
357
+ static get itemChargesChangedEvent(): Event<[unit: Unit, item: Item]>;
350
358
  static get itemUseOrderEvent(): Event<[unit: Unit, item: Item]>;
351
359
  static get itemMoveOrderEvent(): Event<[
352
360
  unit: Unit,
@@ -58,13 +58,12 @@ local attackTypeToNative = ____attack_2Dtype.attackTypeToNative
58
58
  local nativeToAttackType = ____attack_2Dtype.nativeToAttackType
59
59
  local ____damage_2Dmetadata_2Dby_2Dtarget = require("engine.internal.misc.damage-metadata-by-target")
60
60
  local damageMetadataByTarget = ____damage_2Dmetadata_2Dby_2Dtarget.damageMetadataByTarget
61
+ local ____attributes = require("attributes")
62
+ local isAttribute = ____attributes.isAttribute
61
63
  local match = string.match
62
64
  local ____tostring = _G.tostring
63
65
  local setUnitAnimation = SetUnitAnimation
64
- local setUnitAnimationWithRarity = SetUnitAnimationWithRarity
65
66
  local setUnitAnimationByIndex = SetUnitAnimationByIndex
66
- local resetUnitAnimation = ResetUnitAnimation
67
- local queueUnitAnimation = QueueUnitAnimation
68
67
  local getUnitIntegerField = BlzGetUnitIntegerField
69
68
  local getUnitRealField = BlzGetUnitRealField
70
69
  local getHeroStr = GetHeroStr
@@ -140,6 +139,7 @@ do
140
139
  UnitClassification.GROUND = UNIT_TYPE_GROUND
141
140
  UnitClassification.SUMMONED = UNIT_TYPE_SUMMONED
142
141
  UnitClassification.MECHANICAL = UNIT_TYPE_MECHANICAL
142
+ UnitClassification.WORKER = UNIT_TYPE_PEON
143
143
  UnitClassification.ANCIENT = UNIT_TYPE_ANCIENT
144
144
  UnitClassification.SUICIDAL = UNIT_TYPE_SAPPER
145
145
  UnitClassification.TAUREN = UNIT_TYPE_TAUREN
@@ -347,6 +347,9 @@ local function dispatchAbility(event)
347
347
  }
348
348
  )
349
349
  end
350
+ local function damagingEventPreventRetaliation(self)
351
+ self[0] = true
352
+ end
350
353
  local function damageEventPreventDeath(self, callback, ...)
351
354
  if self[0] ~= nil then
352
355
  return
@@ -443,6 +446,19 @@ __TS__SetDescriptor(
443
446
  },
444
447
  true
445
448
  )
449
+ __TS__SetDescriptor(
450
+ UnitWeapon.prototype,
451
+ "allowedTargetCombatClassifications",
452
+ {
453
+ get = function(self)
454
+ return BlzGetUnitWeaponIntegerField(self.unit.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, self.index)
455
+ end,
456
+ set = function(self, allowedTargetCombatClassifications)
457
+ BlzSetUnitWeaponIntegerField(self.unit.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, self.index, allowedTargetCombatClassifications)
458
+ end
459
+ },
460
+ true
461
+ )
446
462
  __TS__SetDescriptor(
447
463
  UnitWeapon.prototype,
448
464
  "damageBase",
@@ -801,16 +817,25 @@ function Unit.prototype.playAnimation(self, animation, rarity)
801
817
  if type(animation) == "number" then
802
818
  setUnitAnimationByIndex(self.handle, animation)
803
819
  elseif rarity then
804
- setUnitAnimationWithRarity(self.handle, animation, rarity)
820
+ SetUnitAnimationWithRarity(self.handle, animation, rarity)
805
821
  else
806
822
  setUnitAnimation(self.handle, animation)
807
823
  end
808
824
  end
809
825
  function Unit.prototype.resetAnimation(self)
810
- resetUnitAnimation(self.handle)
826
+ ResetUnitAnimation(self.handle)
811
827
  end
812
828
  function Unit.prototype.queueAnimation(self, animation)
813
- queueUnitAnimation(self.handle, animation)
829
+ QueueUnitAnimation(self.handle, animation)
830
+ end
831
+ function Unit.prototype.chooseWeapon(self, target)
832
+ if target:isAllowedTarget(self, self.firstWeapon.allowedTargetCombatClassifications) then
833
+ return self.firstWeapon
834
+ end
835
+ if target:isAllowedTarget(target, self.secondWeapon.allowedTargetCombatClassifications) then
836
+ return self.secondWeapon
837
+ end
838
+ return nil
814
839
  end
815
840
  function Unit.prototype.delayHealthChecks(self)
816
841
  self[103] = (self[103] or 0) + 1
@@ -2048,6 +2073,14 @@ __TS__SetDescriptor(
2048
2073
  end},
2049
2074
  true
2050
2075
  )
2076
+ __TS__SetDescriptor(
2077
+ Unit.prototype,
2078
+ "targetAcquiredEvent",
2079
+ {get = function(self)
2080
+ return self:getEvent(EVENT_UNIT_ACQUIRED_TARGET)
2081
+ end},
2082
+ true
2083
+ )
2051
2084
  __TS__SetDescriptor(
2052
2085
  Unit.prototype,
2053
2086
  "onSelect",
@@ -2420,7 +2453,8 @@ Unit.onDamaging = (function()
2420
2453
  metadata = metadata,
2421
2454
  isAttack = BlzGetEventIsAttack(),
2422
2455
  originalAmount = GetEventDamage(),
2423
- originalMetadata = metadata
2456
+ originalMetadata = metadata,
2457
+ preventRetaliation = damagingEventPreventRetaliation
2424
2458
  }
2425
2459
  if data.isAttack and source then
2426
2460
  local weapon = BlzGetUnitWeaponBooleanField(source.handle, UNIT_WEAPON_BF_ATTACKS_ENABLED, 1) and (BlzGetUnitWeaponBooleanField(source.handle, UNIT_WEAPON_BF_ATTACKS_ENABLED, 0) and -1 or 1) or 0
@@ -2449,6 +2483,20 @@ Unit.onDamaging = (function()
2449
2483
  }
2450
2484
  )
2451
2485
  )
2486
+ if data[0] and source then
2487
+ local sourceOwner = source.owner.handle
2488
+ data[1] = sourceOwner
2489
+ local targetOwner = target.owner.handle
2490
+ data[2] = targetOwner
2491
+ if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2492
+ SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2493
+ data[3] = true
2494
+ end
2495
+ if not GetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE) then
2496
+ SetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE, true)
2497
+ data[4] = true
2498
+ end
2499
+ end
2452
2500
  damagingEventByTarget[target] = data
2453
2501
  return
2454
2502
  end
@@ -2526,12 +2574,32 @@ Unit.onDamage = __TS__New(
2526
2574
  originalMetadata = damagingEvent and damagingEvent.originalMetadata,
2527
2575
  preventDeath = damageEventPreventDeath
2528
2576
  }
2577
+ if damagingEvent then
2578
+ for key, value in pairs(damagingEvent) do
2579
+ if isAttribute(key) then
2580
+ data[key] = value
2581
+ end
2582
+ end
2583
+ local sourceOwner = damagingEvent[1]
2584
+ if sourceOwner then
2585
+ local targetOwner = damagingEvent[2]
2586
+ if damagingEvent[3] then
2587
+ SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, false)
2588
+ end
2589
+ if damagingEvent[4] then
2590
+ SetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE, false)
2591
+ end
2592
+ end
2593
+ end
2529
2594
  local evData = setmetatable(
2530
2595
  {},
2531
2596
  {
2532
2597
  __index = data,
2533
2598
  __newindex = function(self, key, value)
2534
- damageSetters[key](value)
2599
+ local damageSetter = damageSetters[key]
2600
+ if damageSetter ~= nil then
2601
+ damageSetter(value)
2602
+ end
2535
2603
  data[key] = value
2536
2604
  end
2537
2605
  }
@@ -2614,6 +2682,21 @@ Unit.itemStackedEvent = __TS__New(
2614
2682
  EVENT_PLAYER_UNIT_STACK_ITEM,
2615
2683
  function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2616
2684
  )
2685
+ __TS__ObjectDefineProperty(
2686
+ Unit,
2687
+ "itemChargesChangedEvent",
2688
+ {get = function(self)
2689
+ local event = __TS__New(Event)
2690
+ Item.chargesChangedEvent:addListener(function(item)
2691
+ local unit = item.owner
2692
+ if unit ~= nil then
2693
+ invoke(event, unit, item)
2694
+ end
2695
+ end)
2696
+ rawset(self, "itemChargesChangedEvent", event)
2697
+ return event
2698
+ end}
2699
+ )
2617
2700
  __TS__ObjectDefineProperty(
2618
2701
  Unit,
2619
2702
  "itemUseOrderEvent",
@@ -0,0 +1,8 @@
1
+ /** @noSelfInFile */
2
+ import { AbilityType, AbilityTypeId } from "../ability-type";
3
+ import { ObjectDataEntryLevelFieldValueSupplier } from "../../entry";
4
+ export declare class PermanentInvisibilityAbilityType extends AbilityType {
5
+ static readonly BASE_ID: AbilityTypeId;
6
+ get shouldAutoAcquireAttackTargets(): boolean[];
7
+ set shouldAutoAcquireAttackTargets(shouldAutoAcquireAttackTargets: ObjectDataEntryLevelFieldValueSupplier<boolean>);
8
+ }
@@ -0,0 +1,26 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__Class = ____lualib.__TS__Class
3
+ local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
+ local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
+ local ____exports = {}
6
+ local ____ability_2Dtype = require("engine.object-data.entry.ability-type")
7
+ local AbilityType = ____ability_2Dtype.AbilityType
8
+ ____exports.PermanentInvisibilityAbilityType = __TS__Class()
9
+ local PermanentInvisibilityAbilityType = ____exports.PermanentInvisibilityAbilityType
10
+ PermanentInvisibilityAbilityType.name = "PermanentInvisibilityAbilityType"
11
+ __TS__ClassExtends(PermanentInvisibilityAbilityType, AbilityType)
12
+ PermanentInvisibilityAbilityType.BASE_ID = fourCC("Apiv")
13
+ __TS__SetDescriptor(
14
+ PermanentInvisibilityAbilityType.prototype,
15
+ "shouldAutoAcquireAttackTargets",
16
+ {
17
+ get = function(self)
18
+ return self:getBooleanLevelField("Gho1")
19
+ end,
20
+ set = function(self, shouldAutoAcquireAttackTargets)
21
+ self:setBooleanLevelField("Gho1", shouldAutoAcquireAttackTargets)
22
+ end
23
+ },
24
+ true
25
+ )
26
+ return ____exports
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "warscript",
4
- "version": "0.0.1-dev.d690591",
4
+ "version": "0.0.1-dev.d7e0522",
5
5
  "description": "A typescript library for Warcraft III using Warpack.",
6
6
  "keywords": [
7
7
  "warcraft",