warscript 0.0.1-dev.c60b168 → 0.0.1-dev.c677d41
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 +1 -0
- package/attributes.lua +9 -0
- package/core/types/frame.lua +14 -9
- package/core/types/handle.lua +1 -1
- package/core/types/player.d.ts +16 -0
- package/core/types/player.lua +57 -14
- package/core/types/playerCamera.lua +44 -0
- package/core/types/tileCell.d.ts +11 -1
- package/core/types/tileCell.lua +97 -0
- package/core/types/timer.d.ts +3 -2
- package/core/types/timer.lua +8 -2
- package/decl/native.d.ts +2 -2
- package/destroyable.d.ts +1 -0
- package/destroyable.lua +9 -0
- package/engine/behavior.d.ts +10 -2
- package/engine/behavior.lua +157 -76
- package/engine/behaviour/ability/apply-buff.lua +4 -4
- package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
- package/engine/behaviour/ability/remove-buffs.lua +21 -0
- package/engine/behaviour/ability.d.ts +2 -1
- package/engine/behaviour/ability.lua +2 -1
- package/engine/behaviour/unit/stun-immunity.d.ts +9 -5
- package/engine/behaviour/unit/stun-immunity.lua +17 -7
- package/engine/behaviour/unit.d.ts +9 -3
- package/engine/behaviour/unit.lua +106 -24
- package/engine/buff.d.ts +19 -4
- package/engine/buff.lua +122 -41
- package/engine/internal/ability.lua +6 -5
- package/engine/internal/item.d.ts +13 -15
- package/engine/internal/item.lua +59 -48
- package/engine/internal/mechanics/cast-ability.lua +6 -3
- package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
- package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
- package/engine/internal/unit/ability.d.ts +14 -14
- package/engine/internal/unit/ability.lua +72 -45
- package/engine/internal/unit/attributes.d.ts +17 -0
- package/engine/internal/unit/attributes.lua +46 -0
- package/engine/internal/unit/bonus.d.ts +2 -0
- package/engine/internal/unit/bonus.lua +10 -0
- package/engine/internal/unit/fly-height.d.ts +7 -0
- package/engine/internal/unit/fly-height.lua +20 -0
- package/engine/internal/unit/interrupts.d.ts +12 -0
- package/engine/internal/unit/interrupts.lua +28 -0
- package/engine/internal/unit/main-selected.lua +12 -27
- package/engine/internal/unit/scale.d.ts +7 -0
- package/engine/internal/unit/scale.lua +20 -0
- package/engine/internal/unit-missile-launch.lua +51 -20
- package/engine/internal/unit.d.ts +16 -20
- package/engine/internal/unit.lua +159 -160
- package/engine/local-client.d.ts +2 -0
- package/engine/local-client.lua +30 -0
- package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
- package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
- package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
- package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
- package/engine/object-data/entry/ability-type.lua +4 -1
- package/engine/object-data/entry/destructible-type.d.ts +27 -1
- package/engine/object-data/entry/destructible-type.lua +155 -0
- package/engine/object-data/entry/unit-type.d.ts +4 -0
- package/engine/object-data/entry/unit-type.lua +76 -32
- package/engine/object-field/unit.d.ts +20 -5
- package/engine/object-field/unit.lua +61 -0
- package/engine/object-field.d.ts +9 -1
- package/engine/object-field.lua +265 -122
- package/engine/random.d.ts +9 -0
- package/engine/random.lua +13 -0
- package/engine/standard/fields/ability.d.ts +2 -2
- package/engine/standard/fields/ability.lua +2 -2
- package/engine/standard/fields/unit.d.ts +11 -3
- package/engine/standard/fields/unit.lua +15 -2
- package/engine/synchronization.d.ts +11 -0
- package/engine/synchronization.lua +77 -0
- package/engine/text-tag.lua +3 -2
- package/engine/unit.d.ts +4 -0
- package/engine/unit.lua +4 -0
- package/net/socket.lua +1 -1
- package/objutil/buff.lua +10 -8
- package/package.json +2 -2
- package/patch-lua.lua +15 -0
- package/patch-lualib.lua +1 -1
- package/utility/arrays.d.ts +1 -0
- package/utility/arrays.lua +8 -0
- package/utility/callback-array.d.ts +5 -1
- package/utility/callback-array.lua +16 -1
- package/utility/linked-map.d.ts +26 -0
- package/utility/linked-map.lua +66 -0
- package/utility/linked-set.d.ts +1 -0
- package/utility/linked-set.lua +23 -1
- package/utility/lua-maps.d.ts +11 -2
- package/utility/lua-maps.lua +33 -2
- package/utility/records.lua +20 -1
- package/utility/types.d.ts +3 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
local ____lualib = require("lualib_bundle")
|
|
2
|
+
local __TS__New = ____lualib.__TS__New
|
|
3
|
+
local __TS__Promise = ____lualib.__TS__Promise
|
|
4
|
+
local __TS__Class = ____lualib.__TS__Class
|
|
5
|
+
local ____exports = {}
|
|
6
|
+
local ____player = require("core.types.player")
|
|
7
|
+
local Player = ____player.Player
|
|
8
|
+
local ____math = require("math")
|
|
9
|
+
local MAXIMUM_INTEGER = ____math.MAXIMUM_INTEGER
|
|
10
|
+
local MINIMUM_INTEGER = ____math.MINIMUM_INTEGER
|
|
11
|
+
local ____linked_2Dset = require("utility.linked-set")
|
|
12
|
+
local LinkedSet = ____linked_2Dset.LinkedSet
|
|
13
|
+
local ____event = require("event")
|
|
14
|
+
local Event = ____event.Event
|
|
15
|
+
local eventInvoke = Event.invoke
|
|
16
|
+
local createFrameByType = BlzCreateFrameByType
|
|
17
|
+
local createTrigger = CreateTrigger
|
|
18
|
+
local getOriginFrame = BlzGetOriginFrame
|
|
19
|
+
local getTriggerFrameValue = BlzGetTriggerFrameValue
|
|
20
|
+
local getTriggerPlayer = GetTriggerPlayer
|
|
21
|
+
local frameSetMinMaxValue = BlzFrameSetMinMaxValue
|
|
22
|
+
local frameSetValue = BlzFrameSetValue
|
|
23
|
+
local triggerAddAction = TriggerAddAction
|
|
24
|
+
local triggerRegisterFrameEvent = BlzTriggerRegisterFrameEvent
|
|
25
|
+
____exports.synchronizer = function(getSyncId, getObject)
|
|
26
|
+
local queue = __TS__New(LinkedSet)
|
|
27
|
+
local socket = __TS__New(____exports.ObjectBus, getSyncId, getObject)
|
|
28
|
+
socket.event:addListener(function(_, object)
|
|
29
|
+
local ____opt_0 = queue:pop()
|
|
30
|
+
if ____opt_0 ~= nil then
|
|
31
|
+
____opt_0(object)
|
|
32
|
+
end
|
|
33
|
+
end)
|
|
34
|
+
local function executor(____, resolve)
|
|
35
|
+
queue:add(resolve)
|
|
36
|
+
end
|
|
37
|
+
return function(player, object)
|
|
38
|
+
if player.isLocal then
|
|
39
|
+
socket:send(object)
|
|
40
|
+
end
|
|
41
|
+
return __TS__New(__TS__Promise, executor)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
____exports.ObjectBus = __TS__Class()
|
|
45
|
+
local ObjectBus = ____exports.ObjectBus
|
|
46
|
+
ObjectBus.name = "ObjectBus"
|
|
47
|
+
function ObjectBus.prototype.____constructor(self, getSyncId, getObject)
|
|
48
|
+
self.getSyncId = getSyncId
|
|
49
|
+
local syncSlider = createFrameByType(
|
|
50
|
+
"SLIDER",
|
|
51
|
+
"Synchronizer",
|
|
52
|
+
getOriginFrame(ORIGIN_FRAME_WORLD_FRAME, 0),
|
|
53
|
+
"",
|
|
54
|
+
0
|
|
55
|
+
)
|
|
56
|
+
frameSetMinMaxValue(syncSlider, MINIMUM_INTEGER, MAXIMUM_INTEGER)
|
|
57
|
+
self.syncSlider = syncSlider
|
|
58
|
+
local event = __TS__New(Event)
|
|
59
|
+
local trigger = createTrigger()
|
|
60
|
+
triggerRegisterFrameEvent(trigger, syncSlider, FRAMEEVENT_SLIDER_VALUE_CHANGED)
|
|
61
|
+
triggerAddAction(
|
|
62
|
+
trigger,
|
|
63
|
+
function()
|
|
64
|
+
eventInvoke(
|
|
65
|
+
event,
|
|
66
|
+
Player:of(getTriggerPlayer()),
|
|
67
|
+
getObject(getTriggerFrameValue())
|
|
68
|
+
)
|
|
69
|
+
end
|
|
70
|
+
)
|
|
71
|
+
self.event = event
|
|
72
|
+
end
|
|
73
|
+
function ObjectBus.prototype.send(self, object)
|
|
74
|
+
local syncId = object ~= nil and self.getSyncId(object) or 0
|
|
75
|
+
frameSetValue(self.syncSlider, syncId)
|
|
76
|
+
end
|
|
77
|
+
return ____exports
|
package/engine/text-tag.lua
CHANGED
|
@@ -36,6 +36,7 @@ local isUnitVisible = IsUnitVisible
|
|
|
36
36
|
local getUnitFlyHeight = GetUnitFlyHeight
|
|
37
37
|
local getUnitX = GetUnitX
|
|
38
38
|
local getUnitY = GetUnitY
|
|
39
|
+
local unitAlive = UnitAlive
|
|
39
40
|
local DEFAULT_FONT_SIZE = 0.024
|
|
40
41
|
local function applyConfiguration(textTag, configuration)
|
|
41
42
|
setTextTagFadepoint(textTag, configuration.fadepoint)
|
|
@@ -141,7 +142,7 @@ __TS__SetDescriptor(
|
|
|
141
142
|
setTextTagText(
|
|
142
143
|
ensureHandle(self),
|
|
143
144
|
self[103] or "",
|
|
144
|
-
|
|
145
|
+
fontSize
|
|
145
146
|
)
|
|
146
147
|
self[104] = fontSize
|
|
147
148
|
end
|
|
@@ -333,7 +334,7 @@ Timer.onPeriod[1 / 64]:addListener(function()
|
|
|
333
334
|
y,
|
|
334
335
|
getUnitFlyHeight(unit) + getTerrainZ(x, y)
|
|
335
336
|
)
|
|
336
|
-
if isInView and not isUnitHidden(unit) and not isUnitLoaded(unit) and isUnitVisible(unit, PLAYER_LOCAL_HANDLE) then
|
|
337
|
+
if isInView and not isUnitHidden(unit) and not isUnitLoaded(unit) and isUnitVisible(unit, PLAYER_LOCAL_HANDLE) and unitAlive(unit) then
|
|
337
338
|
setTextTagPosUnit(
|
|
338
339
|
ensureHandle(textTag),
|
|
339
340
|
unit,
|
package/engine/unit.d.ts
CHANGED
|
@@ -19,6 +19,10 @@ import "./internal/unit/invulnerability-counter";
|
|
|
19
19
|
import "./internal/unit/detach-missiles";
|
|
20
20
|
import "./internal/unit/main-selected";
|
|
21
21
|
import "./internal/unit/add-item-to-slot-init";
|
|
22
|
+
import "./internal/unit/attributes";
|
|
23
|
+
import "./internal/unit/fly-height";
|
|
24
|
+
import "./internal/unit/scale";
|
|
25
|
+
import "./internal/unit/interrupts";
|
|
22
26
|
import "./internal/unit/band-aids/ancestral-spirit-cannibalize";
|
|
23
27
|
export { Unit, DamagingEvent, DamageEvent } from "./internal/unit";
|
|
24
28
|
export * from "./internal/unit+damage";
|
package/engine/unit.lua
CHANGED
|
@@ -19,6 +19,10 @@ require("engine.internal.unit.invulnerability-counter")
|
|
|
19
19
|
require("engine.internal.unit.detach-missiles")
|
|
20
20
|
require("engine.internal.unit.main-selected")
|
|
21
21
|
require("engine.internal.unit.add-item-to-slot-init")
|
|
22
|
+
require("engine.internal.unit.attributes")
|
|
23
|
+
require("engine.internal.unit.fly-height")
|
|
24
|
+
require("engine.internal.unit.scale")
|
|
25
|
+
require("engine.internal.unit.interrupts")
|
|
22
26
|
require("engine.internal.unit.band-aids.ancestral-spirit-cannibalize")
|
|
23
27
|
do
|
|
24
28
|
local ____unit = require("engine.internal.unit")
|
package/net/socket.lua
CHANGED
|
@@ -28,13 +28,13 @@ function Socket.prototype.____constructor(self)
|
|
|
28
28
|
onReceive[self[0]]:addListener(function(sender, data)
|
|
29
29
|
local chunks = chunksByPlayer[sender]
|
|
30
30
|
if chunks ~= nil then
|
|
31
|
+
chunksByPlayer[sender] = nil
|
|
31
32
|
chunks[#chunks + 1] = data
|
|
32
33
|
Event.invoke(
|
|
33
34
|
self.onMessage,
|
|
34
35
|
sender,
|
|
35
36
|
tableConcat(chunks)
|
|
36
37
|
)
|
|
37
|
-
chunksByPlayer[sender] = nil
|
|
38
38
|
else
|
|
39
39
|
Event.invoke(self.onMessage, sender, data)
|
|
40
40
|
end
|
package/objutil/buff.lua
CHANGED
|
@@ -29,6 +29,8 @@ local ____timer = require("core.types.timer")
|
|
|
29
29
|
local Timer = ____timer.Timer
|
|
30
30
|
local ____exception = require("exception")
|
|
31
31
|
local IllegalStateException = ____exception.IllegalStateException
|
|
32
|
+
local ____linked_2Dmap = require("utility.linked-map")
|
|
33
|
+
local LinkedMap = ____linked_2Dmap.LinkedMap
|
|
32
34
|
local ____assert = _G.assert
|
|
33
35
|
local ____pairs = _G.pairs
|
|
34
36
|
____exports.BuffDefinition = __TS__Class()
|
|
@@ -461,7 +463,7 @@ local buffs = setmetatable(
|
|
|
461
463
|
{
|
|
462
464
|
__mode = "k",
|
|
463
465
|
__index = function(self, unit)
|
|
464
|
-
local ____table =
|
|
466
|
+
local ____table = __TS__New(LinkedMap)
|
|
465
467
|
self[unit] = ____table
|
|
466
468
|
return ____table
|
|
467
469
|
end
|
|
@@ -494,7 +496,7 @@ function Buff.prototype.____constructor(self, unit, source, duration, level, pre
|
|
|
494
496
|
end
|
|
495
497
|
local constructor = self.constructor
|
|
496
498
|
local instances = buffs[unit]
|
|
497
|
-
local instance = instances
|
|
499
|
+
local instance = instances:get(constructor)
|
|
498
500
|
if instance then
|
|
499
501
|
instance:destroy()
|
|
500
502
|
if not instance.destroyed then
|
|
@@ -507,7 +509,7 @@ function Buff.prototype.____constructor(self, unit, source, duration, level, pre
|
|
|
507
509
|
)
|
|
508
510
|
end
|
|
509
511
|
end
|
|
510
|
-
instances
|
|
512
|
+
instances:put(constructor, self)
|
|
511
513
|
if preset then
|
|
512
514
|
local unitHandle = unit.handle
|
|
513
515
|
local slowPoisonMethod = not preset.positive and not preset.magic
|
|
@@ -586,13 +588,13 @@ function Buff.apply(self, ...)
|
|
|
586
588
|
end
|
|
587
589
|
end
|
|
588
590
|
function Buff.getInstance(self, unit)
|
|
589
|
-
return buffs[unit]
|
|
591
|
+
return buffs[unit]:get(self)
|
|
590
592
|
end
|
|
591
593
|
function Buff.isApplied(self, unit)
|
|
592
|
-
return buffs[unit]
|
|
594
|
+
return buffs[unit]:get(self) ~= nil
|
|
593
595
|
end
|
|
594
596
|
function Buff.ifApplied(self, unit, action)
|
|
595
|
-
local instance = buffs[unit]
|
|
597
|
+
local instance = buffs[unit]:get(self)
|
|
596
598
|
if instance then
|
|
597
599
|
____assert(__TS__InstanceOf(instance, self))
|
|
598
600
|
action(instance)
|
|
@@ -615,7 +617,7 @@ function Buff.prototype.destroy(self)
|
|
|
615
617
|
if self.preset then
|
|
616
618
|
self.unit:removeAbility(self.preset.buffId)
|
|
617
619
|
end
|
|
618
|
-
buffs[self.unit]
|
|
620
|
+
buffs[self.unit]:remove(self.constructor)
|
|
619
621
|
self.destroyed = true
|
|
620
622
|
end
|
|
621
623
|
function Buff.prototype.onDispel(self, source)
|
|
@@ -762,7 +764,7 @@ Unit.onDamaging:addListener(function(source, target, event)
|
|
|
762
764
|
end
|
|
763
765
|
end)
|
|
764
766
|
Unit.itemPickedUpEvent:addListener(function(unit, item)
|
|
765
|
-
if item.
|
|
767
|
+
if item.isPowerUp and item:hasAbility(fourCC("APdi")) then
|
|
766
768
|
end
|
|
767
769
|
end)
|
|
768
770
|
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.
|
|
4
|
+
"version": "0.0.1-dev.c677d41",
|
|
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.
|
|
27
|
+
"warpack": "0.0.1-dev.e490aaf"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@typescript-eslint/eslint-plugin": "^8.13.0",
|
package/patch-lua.lua
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
local error = _G.error
|
|
1
2
|
local getmetatable = _G.getmetatable
|
|
2
3
|
local ipairs = _G.ipairs
|
|
4
|
+
local select = _G.select
|
|
5
|
+
local tostring = _G.tostring
|
|
6
|
+
local tableconcat = table.concat
|
|
3
7
|
|
|
4
8
|
_G.ipairs = function(t)
|
|
5
9
|
local metatable = getmetatable(t)
|
|
@@ -8,3 +12,14 @@ _G.ipairs = function(t)
|
|
|
8
12
|
end
|
|
9
13
|
return ipairs(t)
|
|
10
14
|
end
|
|
15
|
+
|
|
16
|
+
_G.assert = function(v, ...)
|
|
17
|
+
if not v then
|
|
18
|
+
local args = {}
|
|
19
|
+
for i = 1, select("#", ...) do
|
|
20
|
+
args[i] = tostring(select(i, ...))
|
|
21
|
+
end
|
|
22
|
+
error(tableconcat(args, " "))
|
|
23
|
+
end
|
|
24
|
+
return v, ...
|
|
25
|
+
end
|
package/patch-lualib.lua
CHANGED
|
@@ -3,7 +3,7 @@ local lualib = _G.require("lualib_bundle")
|
|
|
3
3
|
local next = _G.next
|
|
4
4
|
local ____type = _G.type
|
|
5
5
|
lualib.__TS__ArrayIsArray = function(value)
|
|
6
|
-
return ____type(value) == "table" and (value[1] ~= nil or (
|
|
6
|
+
return ____type(value) == "table" and (value[1] ~= nil or (next(value)) == nil) and value.constructor == nil
|
|
7
7
|
end
|
|
8
8
|
local __TS__SetDescriptor = lualib.__TS__SetDescriptor
|
|
9
9
|
lualib.__TS__ObjectDefineProperty = function(target, key, desc)
|
package/utility/arrays.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare const joinToString: <T>(array: readonly T[], separator: string, t
|
|
|
5
5
|
export declare const arrayOfNotNull: <T>(...elements: readonly (T | undefined | null)[]) => T[];
|
|
6
6
|
export declare const array: <T, N extends number>(length: N, initialize: (index: number) => T) => TupleOf<T, N>;
|
|
7
7
|
export declare const toLuaSet: <T extends AnyNotNil>(array: readonly T[]) => LuaSet<T>;
|
|
8
|
+
export declare const contains: <T>(array: readonly T[], element: T) => boolean;
|
|
8
9
|
export declare const forEach: <T, Args extends any[]>(array: readonly T[], consumerOrKey: ((value: T, ...args: Args) => void) | KeysOfType<T, (this: T, ...args: Args) => void>, ...args: Args) => void;
|
|
9
10
|
export declare const all: {
|
|
10
11
|
<T>(array: readonly T[], transform: (value: T) => boolean): boolean;
|
package/utility/arrays.lua
CHANGED
|
@@ -49,6 +49,14 @@ ____exports.toLuaSet = function(array)
|
|
|
49
49
|
end
|
|
50
50
|
return result
|
|
51
51
|
end
|
|
52
|
+
____exports.contains = function(array, element)
|
|
53
|
+
for i = 1, #array do
|
|
54
|
+
if array[i] == element then
|
|
55
|
+
return true
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
return false
|
|
59
|
+
end
|
|
52
60
|
____exports.forEach = function(array, consumerOrKey, ...)
|
|
53
61
|
if type(consumerOrKey) == "function" then
|
|
54
62
|
for i = 1, #array do
|
|
@@ -2,12 +2,16 @@
|
|
|
2
2
|
type Callback = {
|
|
3
3
|
readonly __callback: unique symbol;
|
|
4
4
|
};
|
|
5
|
+
export type CallbackId = number & {
|
|
6
|
+
readonly __callbackId: unique symbol;
|
|
7
|
+
};
|
|
5
8
|
export type CallbackArray = {
|
|
6
9
|
readonly __callbackArray: unique symbol;
|
|
7
10
|
} & Callback[];
|
|
8
11
|
export declare const callbackArray: () => CallbackArray;
|
|
9
|
-
export declare function addCallback<Args extends any[]>(this: void, array: CallbackArray, callback: (...args: Args) => unknown, ...args: Args):
|
|
12
|
+
export declare function addCallback<Args extends any[]>(this: void, array: CallbackArray, callback: (...args: Args) => unknown, ...args: Args): CallbackId;
|
|
10
13
|
export declare function clearCallbacks(this: void, array: CallbackArray): void;
|
|
14
|
+
export declare function consumeCallback(this: void, array: CallbackArray, id: CallbackId): void;
|
|
11
15
|
export declare function consumeCallbacks(this: void, array: CallbackArray): void;
|
|
12
16
|
export declare function invokeCallbacks(this: void, array: CallbackArray): void;
|
|
13
17
|
export {};
|
|
@@ -20,8 +20,11 @@ local select = _G.select
|
|
|
20
20
|
local tableMove = table.move
|
|
21
21
|
tableUnpack = table.unpack
|
|
22
22
|
____exports.callbackArray = function() return {} end
|
|
23
|
+
local function doNothing()
|
|
24
|
+
end
|
|
23
25
|
function ____exports.addCallback(array, callback, ...)
|
|
24
|
-
local
|
|
26
|
+
local id = array[1] or 2
|
|
27
|
+
local i = id
|
|
25
28
|
array[i] = callback
|
|
26
29
|
local argsCount = select("#", ...)
|
|
27
30
|
i = i + 1
|
|
@@ -31,11 +34,23 @@ function ____exports.addCallback(array, callback, ...)
|
|
|
31
34
|
array[i] = (select(j, ...))
|
|
32
35
|
end
|
|
33
36
|
array[1] = i + 1
|
|
37
|
+
return id
|
|
34
38
|
end
|
|
35
39
|
function ____exports.clearCallbacks(array)
|
|
36
40
|
local length = array[1] or 2
|
|
37
41
|
tableMove(array, length, length + length - 2, 1)
|
|
38
42
|
end
|
|
43
|
+
function ____exports.consumeCallback(array, id)
|
|
44
|
+
local callback = array[id]
|
|
45
|
+
array[id] = doNothing
|
|
46
|
+
id = id + 1
|
|
47
|
+
local argsCount = array[id]
|
|
48
|
+
id = id + 1
|
|
49
|
+
safeCall(
|
|
50
|
+
callback,
|
|
51
|
+
tableUnpack(array, id, id + argsCount - 1)
|
|
52
|
+
)
|
|
53
|
+
end
|
|
39
54
|
function ____exports.consumeCallbacks(array)
|
|
40
55
|
local length = array[1] or 2
|
|
41
56
|
____exports.invokeCallbacks(array)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** @noSelfInFile */
|
|
2
|
+
import { ReadonlyLinkedSet } from "./linked-set";
|
|
3
|
+
type IteratorState<K extends AnyNotNil, V> = {
|
|
4
|
+
n?: K;
|
|
5
|
+
t: LuaMap<K, K>;
|
|
6
|
+
v: LuaMap<K, V>;
|
|
7
|
+
};
|
|
8
|
+
type OneSidedTypeGuard = {
|
|
9
|
+
readonly __oneSidedTypeGuard: unique symbol;
|
|
10
|
+
};
|
|
11
|
+
export interface LinkedMap<K extends AnyNotNil, V> extends LuaPairsIterable<K, V> {
|
|
12
|
+
readonly __linkedSet: unique symbol;
|
|
13
|
+
}
|
|
14
|
+
export declare class LinkedMap<K extends AnyNotNil, V> {
|
|
15
|
+
private k;
|
|
16
|
+
private v;
|
|
17
|
+
get keys(): ReadonlyLinkedSet<K>;
|
|
18
|
+
get(key: K): V | undefined;
|
|
19
|
+
getOrPut(key: K, defaultValue: (this: void) => V): V;
|
|
20
|
+
put(key: K, value: V): void;
|
|
21
|
+
remove(key: K): boolean;
|
|
22
|
+
contains(key: AnyNotNil): key is K & OneSidedTypeGuard;
|
|
23
|
+
get size(): number;
|
|
24
|
+
protected __pairs(this: LinkedMap<K, V>): LuaIterator<LuaMultiReturn<[K | undefined, V | undefined]>, IteratorState<K, V>>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
local ____lualib = require("lualib_bundle")
|
|
2
|
+
local __TS__Class = ____lualib.__TS__Class
|
|
3
|
+
local __TS__New = ____lualib.__TS__New
|
|
4
|
+
local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
|
|
5
|
+
local ____exports = {}
|
|
6
|
+
local ____linked_2Dset = require("utility.linked-set")
|
|
7
|
+
local LinkedSet = ____linked_2Dset.LinkedSet
|
|
8
|
+
local function linkedMapNext(state)
|
|
9
|
+
local n = state.n
|
|
10
|
+
state.n = state.t[n]
|
|
11
|
+
return n, state.v[n]
|
|
12
|
+
end
|
|
13
|
+
____exports.LinkedMap = __TS__Class()
|
|
14
|
+
local LinkedMap = ____exports.LinkedMap
|
|
15
|
+
LinkedMap.name = "LinkedMap"
|
|
16
|
+
function LinkedMap.prototype.____constructor(self)
|
|
17
|
+
self.k = __TS__New(LinkedSet)
|
|
18
|
+
self.v = {}
|
|
19
|
+
end
|
|
20
|
+
function LinkedMap.prototype.get(self, key)
|
|
21
|
+
return self.v[key]
|
|
22
|
+
end
|
|
23
|
+
function LinkedMap.prototype.getOrPut(self, key, defaultValue)
|
|
24
|
+
local value = self.v[key]
|
|
25
|
+
if value ~= nil then
|
|
26
|
+
return value
|
|
27
|
+
end
|
|
28
|
+
value = defaultValue()
|
|
29
|
+
self.k:add(key)
|
|
30
|
+
self.v[key] = value
|
|
31
|
+
return value
|
|
32
|
+
end
|
|
33
|
+
function LinkedMap.prototype.put(self, key, value)
|
|
34
|
+
self.k:add(key)
|
|
35
|
+
self.v[key] = value
|
|
36
|
+
end
|
|
37
|
+
function LinkedMap.prototype.remove(self, key)
|
|
38
|
+
if self.k:remove(key) then
|
|
39
|
+
self.v[key] = nil
|
|
40
|
+
return true
|
|
41
|
+
end
|
|
42
|
+
return false
|
|
43
|
+
end
|
|
44
|
+
function LinkedMap.prototype.contains(self, key)
|
|
45
|
+
return self.keys:contains(key)
|
|
46
|
+
end
|
|
47
|
+
function LinkedMap.prototype.__pairs(self)
|
|
48
|
+
return linkedMapNext, {n = self.k.f, t = self.k.n, v = self.v}, nil
|
|
49
|
+
end
|
|
50
|
+
__TS__SetDescriptor(
|
|
51
|
+
LinkedMap.prototype,
|
|
52
|
+
"keys",
|
|
53
|
+
{get = function(self)
|
|
54
|
+
return self.k
|
|
55
|
+
end},
|
|
56
|
+
true
|
|
57
|
+
)
|
|
58
|
+
__TS__SetDescriptor(
|
|
59
|
+
LinkedMap.prototype,
|
|
60
|
+
"size",
|
|
61
|
+
{get = function(self)
|
|
62
|
+
return self.keys.size
|
|
63
|
+
end},
|
|
64
|
+
true
|
|
65
|
+
)
|
|
66
|
+
return ____exports
|
package/utility/linked-set.d.ts
CHANGED
|
@@ -36,6 +36,7 @@ export declare class LinkedSet<T extends AnyNotNil> implements ReadonlyLinkedSet
|
|
|
36
36
|
copyOf(): LinkedSet<T>;
|
|
37
37
|
first(): T | undefined;
|
|
38
38
|
last(): T | undefined;
|
|
39
|
+
pop(): T | undefined;
|
|
39
40
|
next(key: T): T | undefined;
|
|
40
41
|
previous(key: T): T | undefined;
|
|
41
42
|
add(key: T): boolean;
|
package/utility/linked-set.lua
CHANGED
|
@@ -42,6 +42,23 @@ end
|
|
|
42
42
|
function LinkedSet.prototype.last(self)
|
|
43
43
|
return self.l
|
|
44
44
|
end
|
|
45
|
+
function LinkedSet.prototype.pop(self)
|
|
46
|
+
local f = self.f
|
|
47
|
+
if f == nil then
|
|
48
|
+
return nil
|
|
49
|
+
end
|
|
50
|
+
local n = self.n
|
|
51
|
+
local next = n[f]
|
|
52
|
+
n[f] = nil
|
|
53
|
+
self.f = next
|
|
54
|
+
if next ~= nil then
|
|
55
|
+
self.p[next] = nil
|
|
56
|
+
else
|
|
57
|
+
self.l = nil
|
|
58
|
+
end
|
|
59
|
+
self.s = self.s - 1
|
|
60
|
+
return f
|
|
61
|
+
end
|
|
45
62
|
function LinkedSet.prototype.next(self, key)
|
|
46
63
|
return self.n[key]
|
|
47
64
|
end
|
|
@@ -107,8 +124,9 @@ function LinkedSet.prototype.forEach(self, action, ...)
|
|
|
107
124
|
local n = self.n
|
|
108
125
|
local c = self.f
|
|
109
126
|
while c ~= nil do
|
|
127
|
+
local next = n[c]
|
|
110
128
|
action(c, ...)
|
|
111
|
-
c =
|
|
129
|
+
c = next
|
|
112
130
|
end
|
|
113
131
|
end
|
|
114
132
|
function LinkedSet.prototype.toArray(self)
|
|
@@ -164,6 +182,7 @@ __TS__SetDescriptor(
|
|
|
164
182
|
end},
|
|
165
183
|
true
|
|
166
184
|
)
|
|
185
|
+
local emptyIteratorState = {t = {}}
|
|
167
186
|
local EmptyLinkedSet = __TS__Class()
|
|
168
187
|
EmptyLinkedSet.name = "EmptyLinkedSet"
|
|
169
188
|
__TS__ClassExtends(EmptyLinkedSet, ____exports.LinkedSet)
|
|
@@ -173,6 +192,9 @@ function EmptyLinkedSet.prototype.add(self)
|
|
|
173
192
|
0
|
|
174
193
|
)
|
|
175
194
|
end
|
|
195
|
+
function EmptyLinkedSet.prototype.__pairs(self)
|
|
196
|
+
return linkedSetNext, emptyIteratorState, nil
|
|
197
|
+
end
|
|
176
198
|
local EMPTY_LINKED_SET = __TS__New(EmptyLinkedSet)
|
|
177
199
|
____exports.emptyLinkedSet = function()
|
|
178
200
|
return EMPTY_LINKED_SET
|
package/utility/lua-maps.d.ts
CHANGED
|
@@ -4,6 +4,15 @@ export declare const emptyLuaMap: <K extends AnyNotNil, V>() => ReadonlyLuaMap<K
|
|
|
4
4
|
export declare const mutableLuaMap: <K extends AnyNotNil, V>() => LuaMap<K, V>;
|
|
5
5
|
export declare const mutableWeakLuaMap: <K extends AnyNotNil, V>() => LuaMap<K, V>;
|
|
6
6
|
export declare const luaMapOf: <K extends AnyNotNil, V>(...pairs: Flatten<TupleOf<[K, V], 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40>>) => LuaMap<K, V>;
|
|
7
|
-
export declare const luaMapInvert: <K extends AnyNotNil, V extends AnyNotNil>(luaMap:
|
|
8
|
-
export declare const
|
|
7
|
+
export declare const luaMapInvert: <K extends AnyNotNil, V extends AnyNotNil>(luaMap: ReadonlyLuaMap<K, V | undefined | null>) => LuaMap<V, K>;
|
|
8
|
+
export declare const toLuaMap: <K extends PropertyKey, V>(record: Record<K, V>) => LuaMap<K, V>;
|
|
9
|
+
export declare const flattenKeys: <K extends AnyNotNil, V>(luaMap: ReadonlyLuaMap<readonly K[], V> | ReadonlyLuaMap<K[], V>) => LuaMap<K, V>;
|
|
10
|
+
export declare const mapKeys: {
|
|
11
|
+
<K1 extends AnyNotNil, K2 extends AnyNotNil, V>(luaMap: ReadonlyLuaMap<K1, V>, transform: (value: K1) => K2): LuaMap<K2, V>;
|
|
12
|
+
<K1 extends AnyNotNil, K2 extends keyof K1, V>(luaMap: ReadonlyLuaMap<K1, V>, key: K2): K1[K2] extends AnyNotNil ? LuaMap<K1[K2], V> : never;
|
|
13
|
+
};
|
|
14
|
+
export declare const mapValues: {
|
|
15
|
+
<K extends AnyNotNil, V1, V2>(luaMap: ReadonlyLuaMap<K, V1>, transform: (value: V1) => V2): LuaMap<K, V2>;
|
|
16
|
+
<K extends AnyNotNil, V1, V2 extends keyof V1>(luaMap: ReadonlyLuaMap<K, V1>, key: V2): LuaMap<K, V1[V2]>;
|
|
17
|
+
};
|
|
9
18
|
export declare const getOrPut: <K extends AnyNotNil, V>(luaMap: LuaMap<K, V>, key: K, defaultValue: () => V) => V;
|
package/utility/lua-maps.lua
CHANGED
|
@@ -27,10 +27,41 @@ ____exports.luaMapInvert = function(luaMap)
|
|
|
27
27
|
end
|
|
28
28
|
return invertLuaMap
|
|
29
29
|
end
|
|
30
|
+
____exports.toLuaMap = function(record)
|
|
31
|
+
return record
|
|
32
|
+
end
|
|
33
|
+
____exports.flattenKeys = function(luaMap)
|
|
34
|
+
local result = {}
|
|
35
|
+
for keys, value in pairs(luaMap) do
|
|
36
|
+
for ____, key in ipairs(keys) do
|
|
37
|
+
result[key] = value
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
return result
|
|
41
|
+
end
|
|
42
|
+
____exports.mapKeys = function(luaMap, transform)
|
|
43
|
+
local result = {}
|
|
44
|
+
if type(transform) == "function" then
|
|
45
|
+
for key, value in pairs(luaMap) do
|
|
46
|
+
result[transform(key)] = value
|
|
47
|
+
end
|
|
48
|
+
else
|
|
49
|
+
for key, value in pairs(luaMap) do
|
|
50
|
+
result[key[transform]] = value
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
return result
|
|
54
|
+
end
|
|
30
55
|
____exports.mapValues = function(luaMap, transform)
|
|
31
56
|
local result = {}
|
|
32
|
-
|
|
33
|
-
|
|
57
|
+
if type(transform) == "function" then
|
|
58
|
+
for key, value in pairs(luaMap) do
|
|
59
|
+
result[key] = transform(value)
|
|
60
|
+
end
|
|
61
|
+
else
|
|
62
|
+
for key, value in pairs(luaMap) do
|
|
63
|
+
result[key] = value[transform]
|
|
64
|
+
end
|
|
34
65
|
end
|
|
35
66
|
return result
|
|
36
67
|
end
|
package/utility/records.lua
CHANGED
|
@@ -1,9 +1,28 @@
|
|
|
1
1
|
local ____exports = {}
|
|
2
|
+
local ____pairs = _G.pairs
|
|
3
|
+
local tableSort = table.sort
|
|
2
4
|
____exports.invertRecord = function(record)
|
|
3
5
|
local invertRecord = {}
|
|
4
|
-
for key, value in
|
|
6
|
+
for key, value in ____pairs(record) do
|
|
5
7
|
invertRecord[value] = key
|
|
6
8
|
end
|
|
7
9
|
return invertRecord
|
|
8
10
|
end
|
|
11
|
+
local sortedKeysInternal = {}
|
|
12
|
+
local lastSortedKeysLength = 0
|
|
13
|
+
---
|
|
14
|
+
-- @internal For use by internal systems only.
|
|
15
|
+
____exports.sortedKeysUnnested = function(record)
|
|
16
|
+
local length = 0
|
|
17
|
+
for key in ____pairs(record) do
|
|
18
|
+
length = length + 1
|
|
19
|
+
sortedKeysInternal[length] = key
|
|
20
|
+
end
|
|
21
|
+
for i = length + 1, lastSortedKeysLength do
|
|
22
|
+
sortedKeysInternal[i] = nil
|
|
23
|
+
end
|
|
24
|
+
lastSortedKeysLength = length
|
|
25
|
+
tableSort(sortedKeysInternal)
|
|
26
|
+
return sortedKeysInternal
|
|
27
|
+
end
|
|
9
28
|
return ____exports
|
package/utility/types.d.ts
CHANGED
|
@@ -37,4 +37,7 @@ export type Flatten<T extends readonly any[], A extends readonly any[] = []> = T
|
|
|
37
37
|
export type Prohibit<T, K extends keyof any> = T & {
|
|
38
38
|
[P in K]?: never;
|
|
39
39
|
};
|
|
40
|
+
type TupleSplit<T, N extends number, O extends readonly any[] = readonly []> = O["length"] extends N ? [O, T] : T extends readonly [infer F, ...infer R] ? TupleSplit<readonly [...R], N, readonly [...O, F]> : [O, T];
|
|
41
|
+
export type TakeFirst<T extends readonly any[], N extends number> = TupleSplit<T, N>[0];
|
|
42
|
+
export type SkipFirst<T extends readonly any[], N extends number> = TupleSplit<T, N>[1];
|
|
40
43
|
export {};
|