warscript 0.0.1-dev.ec4cf89 → 0.0.1-dev.eda504c
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 +6 -0
- package/attributes.lua +17 -1
- package/config.d.ts +5 -0
- package/config.lua +10 -0
- package/core/types/effect.d.ts +14 -6
- package/core/types/effect.lua +131 -35
- package/core/types/frame.d.ts +6 -0
- package/core/types/frame.lua +115 -22
- package/core/types/player.lua +3 -1
- package/core/types/playerCamera.d.ts +2 -0
- package/core/types/playerCamera.lua +123 -5
- package/core/types/sound.d.ts +17 -24
- package/core/types/sound.lua +99 -24
- package/core/types/tileCell.d.ts +9 -0
- package/core/types/tileCell.lua +92 -0
- package/core/types/timer.d.ts +9 -8
- package/core/types/timer.lua +45 -23
- package/core/util.d.ts +1 -1
- package/core/util.lua +18 -1
- package/decl/native.d.ts +846 -790
- package/engine/behavior.d.ts +7 -2
- package/engine/behavior.lua +112 -33
- package/engine/behaviour/ability/always-enabled.d.ts +7 -0
- package/engine/behaviour/ability/always-enabled.lua +31 -0
- package/engine/behaviour/ability/apply-buff.d.ts +8 -5
- package/engine/behaviour/ability/apply-buff.lua +32 -0
- package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
- package/engine/behaviour/ability/damage.d.ts +9 -3
- package/engine/behaviour/ability/damage.lua +26 -38
- package/engine/behaviour/ability/emulate-impact.d.ts +6 -0
- package/engine/behaviour/ability/emulate-impact.lua +43 -0
- package/engine/behaviour/ability/instant-impact.d.ts +2 -2
- package/engine/behaviour/ability/instant-impact.lua +4 -19
- package/engine/behaviour/ability/on-command-impact.d.ts +8 -0
- package/engine/behaviour/ability/on-command-impact.lua +25 -0
- package/engine/behaviour/ability/remove-buffs.d.ts +16 -0
- package/engine/behaviour/ability/remove-buffs.lua +28 -0
- package/engine/behaviour/ability/restore-mana.d.ts +1 -1
- package/engine/behaviour/ability/restore-mana.lua +6 -6
- package/engine/behaviour/ability.d.ts +20 -4
- package/engine/behaviour/ability.lua +111 -47
- package/engine/behaviour/unit/stun-immunity.d.ts +7 -3
- package/engine/behaviour/unit/stun-immunity.lua +52 -27
- package/engine/behaviour/unit.d.ts +39 -0
- package/engine/behaviour/unit.lua +210 -4
- package/engine/buff.d.ts +85 -46
- package/engine/buff.lua +373 -229
- package/engine/internal/ability.d.ts +23 -14
- package/engine/internal/ability.lua +129 -85
- package/engine/internal/item/ability.lua +162 -4
- package/engine/internal/item+owner.lua +12 -6
- package/engine/internal/item.d.ts +20 -19
- package/engine/internal/item.lua +191 -74
- package/engine/internal/mechanics/ability-duration.lua +1 -1
- package/engine/internal/misc/ability-disable-counter.d.ts +2 -0
- package/engine/internal/misc/ability-disable-counter.lua +13 -0
- package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
- package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
- package/engine/internal/misc/frame-coordinates.d.ts +2 -0
- package/engine/internal/misc/frame-coordinates.lua +21 -0
- package/engine/internal/misc/get-terrain-z.d.ts +2 -0
- package/engine/internal/misc/get-terrain-z.lua +11 -0
- package/engine/internal/misc/player-local-handle.d.ts +2 -0
- package/engine/internal/misc/player-local-handle.lua +5 -0
- package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
- package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
- package/engine/internal/object-data/evasion-probability.d.ts +2 -0
- package/engine/internal/object-data/evasion-probability.lua +16 -0
- package/engine/internal/unit/ability.d.ts +45 -1
- package/engine/internal/unit/ability.lua +128 -17
- package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
- package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
- package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
- package/engine/internal/unit/add-item-to-slot.lua +52 -0
- package/engine/internal/unit/allowed-targets.d.ts +1 -1
- package/engine/internal/unit/allowed-targets.lua +9 -1
- package/engine/internal/unit/bonus.d.ts +6 -2
- package/engine/internal/unit/bonus.lua +23 -1
- package/engine/internal/unit/ignore-events-items.d.ts +2 -0
- package/engine/internal/unit/ignore-events-items.lua +5 -0
- package/engine/internal/unit/item.d.ts +24 -0
- package/engine/internal/unit/item.lua +78 -0
- package/engine/internal/unit/main-selected.d.ts +13 -0
- package/engine/internal/unit/main-selected.lua +51 -0
- package/engine/internal/unit/order.d.ts +20 -0
- package/engine/internal/unit/order.lua +136 -0
- package/engine/internal/unit+ability.lua +12 -3
- package/engine/internal/unit+damage.d.ts +2 -11
- package/engine/internal/unit+damage.lua +10 -14
- package/engine/internal/unit+spellSteal.lua +1 -2
- package/engine/internal/unit-missile-launch.lua +60 -13
- package/engine/internal/unit.d.ts +58 -18
- package/engine/internal/unit.lua +399 -161
- package/engine/internal/utility.lua +12 -0
- package/engine/lightning.d.ts +12 -5
- package/engine/lightning.lua +48 -14
- package/engine/local-client.d.ts +7 -2
- package/engine/local-client.lua +82 -0
- package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
- package/engine/object-data/auxiliary/animation-name.lua +16 -0
- package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
- package/engine/object-data/auxiliary/armor-type.lua +46 -0
- package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
- package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
- package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
- package/engine/object-data/auxiliary/attack-type.lua +42 -0
- package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
- package/engine/object-data/auxiliary/movement-type.lua +22 -0
- package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
- package/engine/object-data/auxiliary/sound-eax.lua +2 -0
- package/engine/object-data/auxiliary/sound-preset-name.d.ts +5 -1
- package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
- package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
- package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
- package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
- package/engine/object-data/entry/ability-type/berserk.lua +13 -0
- package/engine/object-data/entry/ability-type/blank-configurable.lua +12 -1
- package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
- package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
- package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
- package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
- package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
- package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
- package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
- package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
- package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
- package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
- package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
- package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
- package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
- package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
- package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
- package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
- package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
- package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
- package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
- package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
- package/engine/object-data/entry/ability-type/web.d.ts +12 -0
- package/engine/object-data/entry/ability-type/web.lua +52 -0
- package/engine/object-data/entry/ability-type.d.ts +19 -17
- package/engine/object-data/entry/ability-type.lua +93 -36
- package/engine/object-data/entry/buff-type/applicable.lua +18 -37
- package/engine/object-data/entry/buff-type.d.ts +6 -12
- package/engine/object-data/entry/buff-type.lua +13 -29
- package/engine/object-data/entry/destructible-type.d.ts +1 -1
- package/engine/object-data/entry/item-type.d.ts +15 -1
- package/engine/object-data/entry/item-type.lua +93 -2
- package/engine/object-data/entry/lightning-type.d.ts +1 -1
- package/engine/object-data/entry/sound-preset.d.ts +33 -0
- package/engine/object-data/entry/sound-preset.lua +140 -0
- package/engine/object-data/entry/unit-type.d.ts +21 -5
- package/engine/object-data/entry/unit-type.lua +214 -93
- package/engine/object-data/entry/upgrade.d.ts +1 -1
- package/engine/object-data/entry/upgrade.lua +4 -4
- package/engine/object-data/entry.d.ts +16 -14
- package/engine/object-data/entry.lua +60 -32
- package/engine/object-data/utility/object-data-entry-id-generator.lua +7 -0
- package/engine/object-field/ability.d.ts +28 -5
- package/engine/object-field/ability.lua +59 -5
- package/engine/object-field/unit.d.ts +57 -3
- package/engine/object-field/unit.lua +207 -7
- package/engine/object-field.d.ts +17 -6
- package/engine/object-field.lua +190 -90
- package/engine/random.d.ts +9 -0
- package/engine/random.lua +13 -0
- package/engine/standard/entries/buff-type.d.ts +3 -0
- package/engine/standard/entries/buff-type.lua +3 -0
- package/engine/standard/entries/sound-preset.d.ts +10 -0
- package/engine/standard/entries/sound-preset.lua +10 -0
- package/engine/standard/fields/ability.d.ts +2 -0
- package/engine/standard/fields/ability.lua +2 -0
- package/engine/standard/fields/unit.d.ts +4 -0
- package/engine/standard/fields/unit.lua +7 -0
- package/engine/text-tag.d.ts +36 -2
- package/engine/text-tag.lua +249 -10
- package/engine/unit.d.ts +4 -0
- package/engine/unit.lua +4 -0
- package/index.d.ts +1 -0
- package/index.lua +1 -0
- package/net/socket.d.ts +7 -1
- package/net/socket.lua +45 -4
- package/network.d.ts +1 -0
- package/network.lua +3 -2
- package/objutil/buff.lua +3 -4
- package/objutil/unit.lua +8 -0
- package/package.json +2 -2
- package/patch-lua.d.ts +0 -0
- package/patch-lua.lua +10 -0
- package/patch-lualib.lua +1 -1
- package/utility/arrays.d.ts +10 -1
- package/utility/arrays.lua +45 -3
- package/utility/callback-array.d.ts +17 -0
- package/utility/callback-array.lua +61 -0
- package/utility/functions.d.ts +8 -0
- package/utility/functions.lua +13 -0
- package/utility/lazy.d.ts +2 -0
- package/utility/lazy.lua +14 -0
- package/utility/linked-set.d.ts +12 -2
- package/utility/linked-set.lua +10 -3
- package/utility/lua-maps.d.ts +15 -2
- package/utility/lua-maps.lua +53 -2
- package/utility/lua-sets.d.ts +2 -0
- package/utility/lua-sets.lua +7 -0
- package/utility/reflection.lua +11 -7
- package/utility/types.d.ts +4 -0
- package/core/types/order.d.ts +0 -25
- package/core/types/order.lua +0 -55
package/engine/text-tag.lua
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
local ____lualib = require("lualib_bundle")
|
|
2
2
|
local __TS__Class = ____lualib.__TS__Class
|
|
3
|
+
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
|
|
4
|
+
local __TS__New = ____lualib.__TS__New
|
|
5
|
+
local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
|
|
3
6
|
local __TS__ObjectAssign = ____lualib.__TS__ObjectAssign
|
|
4
7
|
local ____exports = {}
|
|
5
8
|
local ____color = require("core.types.color")
|
|
6
9
|
local Color = ____color.Color
|
|
10
|
+
local ____timer = require("core.types.timer")
|
|
11
|
+
local Timer = ____timer.Timer
|
|
12
|
+
local ____destroyable = require("destroyable")
|
|
13
|
+
local AbstractDestroyable = ____destroyable.AbstractDestroyable
|
|
14
|
+
local ____playerCamera = require("core.types.playerCamera")
|
|
15
|
+
local worldCoordinatesToFrame = ____playerCamera.worldCoordinatesToFrame
|
|
16
|
+
local ____get_2Dterrain_2Dz = require("engine.internal.misc.get-terrain-z")
|
|
17
|
+
local getTerrainZ = ____get_2Dterrain_2Dz.getTerrainZ
|
|
18
|
+
local ____player_2Dlocal_2Dhandle = require("engine.internal.misc.player-local-handle")
|
|
19
|
+
local PLAYER_LOCAL_HANDLE = ____player_2Dlocal_2Dhandle.PLAYER_LOCAL_HANDLE
|
|
7
20
|
local createTextTag = CreateTextTag
|
|
8
21
|
local destroyTextTag = DestroyTextTag
|
|
9
22
|
local setTextTagText = SetTextTagText
|
|
@@ -17,17 +30,14 @@ local setTextTagPermanent = SetTextTagPermanent
|
|
|
17
30
|
local setTextTagAge = SetTextTagAge
|
|
18
31
|
local setTextTagLifespan = SetTextTagLifespan
|
|
19
32
|
local setTextTagFadepoint = SetTextTagFadepoint
|
|
33
|
+
local isUnitHidden = IsUnitHidden
|
|
34
|
+
local isUnitLoaded = IsUnitLoaded
|
|
35
|
+
local isUnitVisible = IsUnitVisible
|
|
36
|
+
local getUnitFlyHeight = GetUnitFlyHeight
|
|
37
|
+
local getUnitX = GetUnitX
|
|
38
|
+
local getUnitY = GetUnitY
|
|
20
39
|
local DEFAULT_FONT_SIZE = 0.024
|
|
21
|
-
|
|
22
|
-
local TextTag = ____exports.TextTag
|
|
23
|
-
TextTag.name = "TextTag"
|
|
24
|
-
function TextTag.prototype.____constructor(self, handle)
|
|
25
|
-
self.handle = handle
|
|
26
|
-
end
|
|
27
|
-
function TextTag.flash(self, configuration, text, x, y, z)
|
|
28
|
-
local textTag = createTextTag()
|
|
29
|
-
setTextTagText(textTag, text, DEFAULT_FONT_SIZE)
|
|
30
|
-
setTextTagPos(textTag, x + configuration.offsetX, y + configuration.offsetY, (z or 0) + configuration.offsetZ)
|
|
40
|
+
local function applyConfiguration(textTag, configuration)
|
|
31
41
|
setTextTagFadepoint(textTag, configuration.fadepoint)
|
|
32
42
|
setTextTagLifespan(textTag, configuration.lifespan)
|
|
33
43
|
local color = configuration.color
|
|
@@ -42,6 +52,213 @@ function TextTag.flash(self, configuration, text, x, y, z)
|
|
|
42
52
|
setTextTagPermanent(textTag, false)
|
|
43
53
|
setTextTagVisibility(textTag, true)
|
|
44
54
|
end
|
|
55
|
+
local unitTextTags = setmetatable({}, {__mode = "k"})
|
|
56
|
+
local function ensureHandle(textTag)
|
|
57
|
+
local handle = textTag[101]
|
|
58
|
+
if handle == nil then
|
|
59
|
+
handle = createTextTag()
|
|
60
|
+
applyConfiguration(handle, textTag[102])
|
|
61
|
+
setTextTagPermanent(handle, true)
|
|
62
|
+
setTextTagText(handle, textTag[103] or "", textTag[104] or DEFAULT_FONT_SIZE)
|
|
63
|
+
local color = textTag[105]
|
|
64
|
+
if color ~= nil then
|
|
65
|
+
setTextTagColor(
|
|
66
|
+
handle,
|
|
67
|
+
color.r,
|
|
68
|
+
color.g,
|
|
69
|
+
color.b,
|
|
70
|
+
color.a
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
local unit = textTag[100]
|
|
74
|
+
if unit ~= nil then
|
|
75
|
+
setTextTagPosUnit(handle, unit.handle, textTag[102].offsetZ)
|
|
76
|
+
else
|
|
77
|
+
setTextTagPos(handle, textTag[106] or 0, textTag[107] or 0, 0)
|
|
78
|
+
end
|
|
79
|
+
textTag[101] = handle
|
|
80
|
+
end
|
|
81
|
+
return handle
|
|
82
|
+
end
|
|
83
|
+
____exports.TextTag = __TS__Class()
|
|
84
|
+
local TextTag = ____exports.TextTag
|
|
85
|
+
TextTag.name = "TextTag"
|
|
86
|
+
__TS__ClassExtends(TextTag, AbstractDestroyable)
|
|
87
|
+
function TextTag.prototype.____constructor(self, handle)
|
|
88
|
+
AbstractDestroyable.prototype.____constructor(self)
|
|
89
|
+
self[101] = handle
|
|
90
|
+
end
|
|
91
|
+
function TextTag.prototype.onDestroy(self)
|
|
92
|
+
local handle = self[101]
|
|
93
|
+
if handle ~= nil then
|
|
94
|
+
destroyTextTag(handle)
|
|
95
|
+
self[101] = nil
|
|
96
|
+
end
|
|
97
|
+
unitTextTags[self] = nil
|
|
98
|
+
return AbstractDestroyable.prototype.onDestroy(self)
|
|
99
|
+
end
|
|
100
|
+
function TextTag.flash(self, configuration, text, x, y, z)
|
|
101
|
+
local textTag = createTextTag()
|
|
102
|
+
setTextTagText(textTag, text, DEFAULT_FONT_SIZE)
|
|
103
|
+
setTextTagPos(textTag, x + configuration.offsetX, y + configuration.offsetY, (z or 0) + configuration.offsetZ)
|
|
104
|
+
applyConfiguration(textTag, configuration)
|
|
105
|
+
end
|
|
106
|
+
function TextTag.create(self, configuration, text, unit)
|
|
107
|
+
local textTag = __TS__New(____exports.TextTag)
|
|
108
|
+
textTag[103] = text
|
|
109
|
+
textTag[100] = unit
|
|
110
|
+
textTag[102] = configuration
|
|
111
|
+
ensureHandle(textTag)
|
|
112
|
+
unitTextTags[textTag] = true
|
|
113
|
+
return textTag
|
|
114
|
+
end
|
|
115
|
+
__TS__SetDescriptor(
|
|
116
|
+
TextTag.prototype,
|
|
117
|
+
"text",
|
|
118
|
+
{
|
|
119
|
+
get = function(self)
|
|
120
|
+
return self[103] or ""
|
|
121
|
+
end,
|
|
122
|
+
set = function(self, text)
|
|
123
|
+
setTextTagText(
|
|
124
|
+
ensureHandle(self),
|
|
125
|
+
text,
|
|
126
|
+
self[104] or DEFAULT_FONT_SIZE
|
|
127
|
+
)
|
|
128
|
+
self[103] = text
|
|
129
|
+
end
|
|
130
|
+
},
|
|
131
|
+
true
|
|
132
|
+
)
|
|
133
|
+
__TS__SetDescriptor(
|
|
134
|
+
TextTag.prototype,
|
|
135
|
+
"fontSize",
|
|
136
|
+
{
|
|
137
|
+
get = function(self)
|
|
138
|
+
return self[104] or DEFAULT_FONT_SIZE
|
|
139
|
+
end,
|
|
140
|
+
set = function(self, fontSize)
|
|
141
|
+
setTextTagText(
|
|
142
|
+
ensureHandle(self),
|
|
143
|
+
self[103] or "",
|
|
144
|
+
fontSize
|
|
145
|
+
)
|
|
146
|
+
self[104] = fontSize
|
|
147
|
+
end
|
|
148
|
+
},
|
|
149
|
+
true
|
|
150
|
+
)
|
|
151
|
+
__TS__SetDescriptor(
|
|
152
|
+
TextTag.prototype,
|
|
153
|
+
"color",
|
|
154
|
+
{
|
|
155
|
+
get = function(self)
|
|
156
|
+
return self[105] or Color.white
|
|
157
|
+
end,
|
|
158
|
+
set = function(self, color)
|
|
159
|
+
setTextTagColor(
|
|
160
|
+
ensureHandle(self),
|
|
161
|
+
color.r,
|
|
162
|
+
color.g,
|
|
163
|
+
color.b,
|
|
164
|
+
color.a
|
|
165
|
+
)
|
|
166
|
+
self[105] = color
|
|
167
|
+
end
|
|
168
|
+
},
|
|
169
|
+
true
|
|
170
|
+
)
|
|
171
|
+
__TS__SetDescriptor(
|
|
172
|
+
TextTag.prototype,
|
|
173
|
+
"unit",
|
|
174
|
+
{
|
|
175
|
+
get = function(self)
|
|
176
|
+
return self[100]
|
|
177
|
+
end,
|
|
178
|
+
set = function(self, unit)
|
|
179
|
+
if unit ~= nil then
|
|
180
|
+
setTextTagPosUnit(
|
|
181
|
+
ensureHandle(self),
|
|
182
|
+
unit.handle,
|
|
183
|
+
0
|
|
184
|
+
)
|
|
185
|
+
self[106] = nil
|
|
186
|
+
self[107] = nil
|
|
187
|
+
unitTextTags[self] = true
|
|
188
|
+
elseif self[100] ~= nil then
|
|
189
|
+
local unit = self[100]
|
|
190
|
+
local x = unit.x
|
|
191
|
+
local y = unit.y
|
|
192
|
+
setTextTagPos(
|
|
193
|
+
ensureHandle(self),
|
|
194
|
+
x,
|
|
195
|
+
y,
|
|
196
|
+
0
|
|
197
|
+
)
|
|
198
|
+
self[106] = x
|
|
199
|
+
self[107] = y
|
|
200
|
+
unitTextTags[self] = nil
|
|
201
|
+
end
|
|
202
|
+
self[100] = unit
|
|
203
|
+
end
|
|
204
|
+
},
|
|
205
|
+
true
|
|
206
|
+
)
|
|
207
|
+
__TS__SetDescriptor(
|
|
208
|
+
TextTag.prototype,
|
|
209
|
+
"x",
|
|
210
|
+
{
|
|
211
|
+
get = function(self)
|
|
212
|
+
local ____self__106_2 = self[106]
|
|
213
|
+
if ____self__106_2 == nil then
|
|
214
|
+
local ____opt_0 = self[100]
|
|
215
|
+
____self__106_2 = ____opt_0 and ____opt_0.x
|
|
216
|
+
end
|
|
217
|
+
return ____self__106_2 or 0
|
|
218
|
+
end,
|
|
219
|
+
set = function(self, x)
|
|
220
|
+
local ____ensureHandle_result_6 = ensureHandle(self)
|
|
221
|
+
local ____x_7 = x
|
|
222
|
+
local ____self__107_5 = self[107]
|
|
223
|
+
if ____self__107_5 == nil then
|
|
224
|
+
local ____opt_3 = self[100]
|
|
225
|
+
____self__107_5 = ____opt_3 and ____opt_3.y
|
|
226
|
+
end
|
|
227
|
+
setTextTagPos(____ensureHandle_result_6, ____x_7, ____self__107_5 or 0, 0)
|
|
228
|
+
self[106] = x
|
|
229
|
+
self[100] = nil
|
|
230
|
+
unitTextTags[self] = nil
|
|
231
|
+
end
|
|
232
|
+
},
|
|
233
|
+
true
|
|
234
|
+
)
|
|
235
|
+
__TS__SetDescriptor(
|
|
236
|
+
TextTag.prototype,
|
|
237
|
+
"y",
|
|
238
|
+
{
|
|
239
|
+
get = function(self)
|
|
240
|
+
local ____self__107_10 = self[107]
|
|
241
|
+
if ____self__107_10 == nil then
|
|
242
|
+
local ____opt_8 = self[100]
|
|
243
|
+
____self__107_10 = ____opt_8 and ____opt_8.y
|
|
244
|
+
end
|
|
245
|
+
return ____self__107_10 or 0
|
|
246
|
+
end,
|
|
247
|
+
set = function(self, y)
|
|
248
|
+
local ____ensureHandle_result_14 = ensureHandle(self)
|
|
249
|
+
local ____self__106_13 = self[106]
|
|
250
|
+
if ____self__106_13 == nil then
|
|
251
|
+
local ____opt_11 = self[100]
|
|
252
|
+
____self__106_13 = ____opt_11 and ____opt_11.x
|
|
253
|
+
end
|
|
254
|
+
setTextTagPos(____ensureHandle_result_14, ____self__106_13 or 0, y, 0)
|
|
255
|
+
self[107] = y
|
|
256
|
+
self[100] = nil
|
|
257
|
+
unitTextTags[self] = nil
|
|
258
|
+
end
|
|
259
|
+
},
|
|
260
|
+
true
|
|
261
|
+
)
|
|
45
262
|
TextTag.BASE = {
|
|
46
263
|
fadepoint = 2,
|
|
47
264
|
lifespan = 3,
|
|
@@ -106,4 +323,26 @@ TextTag.SHADOW_STRIKE = __TS__ObjectAssign(
|
|
|
106
323
|
lifespan = 5
|
|
107
324
|
}
|
|
108
325
|
)
|
|
326
|
+
Timer.onPeriod[1 / 64]:addListener(function()
|
|
327
|
+
for textTag in pairs(unitTextTags) do
|
|
328
|
+
local unit = textTag[100].handle
|
|
329
|
+
local x = getUnitX(unit)
|
|
330
|
+
local y = getUnitY(unit)
|
|
331
|
+
local ____, ____, isInView = worldCoordinatesToFrame(
|
|
332
|
+
x,
|
|
333
|
+
y,
|
|
334
|
+
getUnitFlyHeight(unit) + getTerrainZ(x, y)
|
|
335
|
+
)
|
|
336
|
+
if isInView and not isUnitHidden(unit) and not isUnitLoaded(unit) and isUnitVisible(unit, PLAYER_LOCAL_HANDLE) then
|
|
337
|
+
setTextTagPosUnit(
|
|
338
|
+
ensureHandle(textTag),
|
|
339
|
+
unit,
|
|
340
|
+
textTag[102].offsetZ
|
|
341
|
+
)
|
|
342
|
+
elseif textTag[101] ~= nil then
|
|
343
|
+
destroyTextTag(textTag[101])
|
|
344
|
+
textTag[101] = nil
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
end)
|
|
109
348
|
return ____exports
|
package/engine/unit.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/** @noSelfInFile */
|
|
2
2
|
import "./internal/unit";
|
|
3
|
+
import "./internal/unit/order";
|
|
3
4
|
import "./internal/unit/ability";
|
|
4
5
|
import "./internal/unit/allowed-targets";
|
|
5
6
|
import "./internal/unit/buff";
|
|
6
7
|
import "./internal/unit/expiration-timer";
|
|
8
|
+
import "./internal/unit/item";
|
|
7
9
|
import "./internal/unit+ability";
|
|
8
10
|
import "./internal/unit+damage";
|
|
9
11
|
import "./internal/unit+rally";
|
|
@@ -15,6 +17,8 @@ import "./internal/unit-missile-launch";
|
|
|
15
17
|
import "./internal/unit/ghost-counter";
|
|
16
18
|
import "./internal/unit/invulnerability-counter";
|
|
17
19
|
import "./internal/unit/detach-missiles";
|
|
20
|
+
import "./internal/unit/main-selected";
|
|
21
|
+
import "./internal/unit/add-item-to-slot-init";
|
|
18
22
|
import "./internal/unit/band-aids/ancestral-spirit-cannibalize";
|
|
19
23
|
export { Unit, DamagingEvent, DamageEvent } from "./internal/unit";
|
|
20
24
|
export * from "./internal/unit+damage";
|
package/engine/unit.lua
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
local ____exports = {}
|
|
2
2
|
require("engine.internal.unit")
|
|
3
|
+
require("engine.internal.unit.order")
|
|
3
4
|
require("engine.internal.unit.ability")
|
|
4
5
|
require("engine.internal.unit.allowed-targets")
|
|
5
6
|
require("engine.internal.unit.buff")
|
|
6
7
|
require("engine.internal.unit.expiration-timer")
|
|
8
|
+
require("engine.internal.unit.item")
|
|
7
9
|
require("engine.internal.unit+ability")
|
|
8
10
|
require("engine.internal.unit+damage")
|
|
9
11
|
require("engine.internal.unit+rally")
|
|
@@ -15,6 +17,8 @@ require("engine.internal.unit-missile-launch")
|
|
|
15
17
|
require("engine.internal.unit.ghost-counter")
|
|
16
18
|
require("engine.internal.unit.invulnerability-counter")
|
|
17
19
|
require("engine.internal.unit.detach-missiles")
|
|
20
|
+
require("engine.internal.unit.main-selected")
|
|
21
|
+
require("engine.internal.unit.add-item-to-slot-init")
|
|
18
22
|
require("engine.internal.unit.band-aids.ancestral-spirit-cannibalize")
|
|
19
23
|
do
|
|
20
24
|
local ____unit = require("engine.internal.unit")
|
package/index.d.ts
CHANGED
package/index.lua
CHANGED
package/net/socket.d.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
/** @noSelfInFile */
|
|
2
2
|
import { Event } from "../event";
|
|
3
3
|
import { Player } from "../core/types/player";
|
|
4
|
+
declare const enum SocketPropertyKey {
|
|
5
|
+
ID = 0,
|
|
6
|
+
CHUNK_ID = 1
|
|
7
|
+
}
|
|
4
8
|
export declare class Socket {
|
|
5
|
-
private readonly
|
|
9
|
+
private readonly [SocketPropertyKey.ID];
|
|
10
|
+
private readonly [SocketPropertyKey.CHUNK_ID];
|
|
6
11
|
readonly onMessage: Event<[Player, string]>;
|
|
7
12
|
constructor();
|
|
8
13
|
send(data: string): void;
|
|
9
14
|
}
|
|
15
|
+
export {};
|
package/net/socket.lua
CHANGED
|
@@ -7,6 +7,11 @@ local Event = ____event.Event
|
|
|
7
7
|
local ____network = require("network")
|
|
8
8
|
local send = ____network.send
|
|
9
9
|
local onReceive = ____network.onReceive
|
|
10
|
+
local MAX_PAYLOAD_LENGTH = ____network.MAX_PAYLOAD_LENGTH
|
|
11
|
+
local ____math = require("math")
|
|
12
|
+
local ceil = ____math.ceil
|
|
13
|
+
local stringSub = string.sub
|
|
14
|
+
local tableConcat = table.concat
|
|
10
15
|
local nextId = 0
|
|
11
16
|
____exports.Socket = __TS__Class()
|
|
12
17
|
local Socket = ____exports.Socket
|
|
@@ -14,13 +19,49 @@ Socket.name = "Socket"
|
|
|
14
19
|
function Socket.prototype.____constructor(self)
|
|
15
20
|
local ____tostring_0 = tostring
|
|
16
21
|
nextId = nextId + 1
|
|
17
|
-
self
|
|
22
|
+
self[0] = ____tostring_0(nextId)
|
|
23
|
+
local ____tostring_1 = tostring
|
|
24
|
+
nextId = nextId + 1
|
|
25
|
+
self[1] = ____tostring_1(nextId)
|
|
18
26
|
self.onMessage = __TS__New(Event)
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
local chunksByPlayer = {}
|
|
28
|
+
onReceive[self[0]]:addListener(function(sender, data)
|
|
29
|
+
local chunks = chunksByPlayer[sender]
|
|
30
|
+
if chunks ~= nil then
|
|
31
|
+
chunks[#chunks + 1] = data
|
|
32
|
+
Event.invoke(
|
|
33
|
+
self.onMessage,
|
|
34
|
+
sender,
|
|
35
|
+
tableConcat(chunks)
|
|
36
|
+
)
|
|
37
|
+
chunksByPlayer[sender] = nil
|
|
38
|
+
else
|
|
39
|
+
Event.invoke(self.onMessage, sender, data)
|
|
40
|
+
end
|
|
41
|
+
end)
|
|
42
|
+
onReceive[self[1]]:addListener(function(sender, data)
|
|
43
|
+
local chunks = chunksByPlayer[sender]
|
|
44
|
+
if chunks == nil then
|
|
45
|
+
chunks = {}
|
|
46
|
+
chunksByPlayer[sender] = chunks
|
|
47
|
+
end
|
|
48
|
+
chunks[#chunks + 1] = data
|
|
21
49
|
end)
|
|
22
50
|
end
|
|
23
51
|
function Socket.prototype.send(self, data)
|
|
24
|
-
|
|
52
|
+
local chunks = ceil(#data / MAX_PAYLOAD_LENGTH) - 1
|
|
53
|
+
local offset = 1
|
|
54
|
+
for _ = 0, chunks - 1 do
|
|
55
|
+
local nextOffset = offset + MAX_PAYLOAD_LENGTH
|
|
56
|
+
send(
|
|
57
|
+
self[1],
|
|
58
|
+
stringSub(data, offset, nextOffset - 1)
|
|
59
|
+
)
|
|
60
|
+
offset = nextOffset
|
|
61
|
+
end
|
|
62
|
+
send(
|
|
63
|
+
self[0],
|
|
64
|
+
stringSub(data, offset)
|
|
65
|
+
)
|
|
25
66
|
end
|
|
26
67
|
return ____exports
|
package/network.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { Event } from "./event";
|
|
3
3
|
import { Player } from "./core/types/player";
|
|
4
4
|
import { Operation, OperationContinue, OperationMonitor } from "./operation";
|
|
5
|
+
export declare const MAX_PAYLOAD_LENGTH = 255;
|
|
5
6
|
export declare const onReceive: {
|
|
6
7
|
[prefix: string]: Event<[Player, string]>;
|
|
7
8
|
} & {
|
package/network.lua
CHANGED
|
@@ -25,6 +25,7 @@ local concat = table.concat
|
|
|
25
25
|
local pack = string.pack
|
|
26
26
|
local sub = string.sub
|
|
27
27
|
local ____unpack = string.unpack
|
|
28
|
+
____exports.MAX_PAYLOAD_LENGTH = 255
|
|
28
29
|
____exports.onReceive = setmetatable(
|
|
29
30
|
{},
|
|
30
31
|
{__index = function(self, prefix)
|
|
@@ -42,11 +43,11 @@ ____exports.onReceive = setmetatable(
|
|
|
42
43
|
end}
|
|
43
44
|
)
|
|
44
45
|
function ____exports.send(id, payload)
|
|
45
|
-
if #payload >
|
|
46
|
+
if #payload > ____exports.MAX_PAYLOAD_LENGTH then
|
|
46
47
|
error(
|
|
47
48
|
__TS__New(
|
|
48
49
|
IllegalArgumentException,
|
|
49
|
-
"payload length must be <=
|
|
50
|
+
(("payload length must be <= " .. tostring(____exports.MAX_PAYLOAD_LENGTH)) .. ", but was ") .. tostring(#payload)
|
|
50
51
|
),
|
|
51
52
|
0
|
|
52
53
|
)
|
package/objutil/buff.lua
CHANGED
|
@@ -20,7 +20,6 @@ local AbilityDefinitionInnerFire = ____ability.AbilityDefinitionInnerFire
|
|
|
20
20
|
local AbilityDefinitionSearingArrows = ____ability.AbilityDefinitionSearingArrows
|
|
21
21
|
local AbilityDefinitionSlowPoison = ____ability.AbilityDefinitionSlowPoison
|
|
22
22
|
local ____unit = require("core.types.unit")
|
|
23
|
-
local AttackType = ____unit.AttackType
|
|
24
23
|
local DamageType = ____unit.DamageType
|
|
25
24
|
local Unit = ____unit.Unit
|
|
26
25
|
local ____dummy = require("core.dummy")
|
|
@@ -756,14 +755,14 @@ for ____, pointDispelAbilityId in ipairs(pointDispelAbilityIds) do
|
|
|
756
755
|
end)
|
|
757
756
|
end
|
|
758
757
|
Unit.onDamaging:addListener(function(source, target, event)
|
|
759
|
-
if event.amount == 0 and event.attackType ==
|
|
758
|
+
if event.amount == 0 and event.attackType == 0 and event.damageType == DamageType.NORMAL and not event.isAttack then
|
|
760
759
|
Timer:run(function()
|
|
761
760
|
checkBuffs(target, true, source)
|
|
762
761
|
end)
|
|
763
762
|
end
|
|
764
763
|
end)
|
|
765
|
-
Unit.
|
|
766
|
-
if item.
|
|
764
|
+
Unit.itemPickedUpEvent:addListener(function(unit, item)
|
|
765
|
+
if item.isPowerUp and item:hasAbility(fourCC("APdi")) then
|
|
767
766
|
end
|
|
768
767
|
end)
|
|
769
768
|
return ____exports
|
package/objutil/unit.lua
CHANGED
|
@@ -11,6 +11,8 @@ local ____exports = {}
|
|
|
11
11
|
local ____object = require("objutil.object")
|
|
12
12
|
local ObjectDefinition = ____object.ObjectDefinition
|
|
13
13
|
local idgen = require("objutil.idgen")
|
|
14
|
+
local ____config = require("config")
|
|
15
|
+
local WarscriptConfig = ____config.WarscriptConfig
|
|
14
16
|
local attackTypes = setmetatable(
|
|
15
17
|
{
|
|
16
18
|
normal = "normal",
|
|
@@ -593,6 +595,9 @@ __TS__SetDescriptor(
|
|
|
593
595
|
end,
|
|
594
596
|
set = function(self, v)
|
|
595
597
|
self:setStringField("umdl", v)
|
|
598
|
+
if WarscriptConfig.AUTOMATICALLY_SET_UNIT_TYPE_PORTRAIT_MODEL_PATH then
|
|
599
|
+
self:setStringField("upor", "")
|
|
600
|
+
end
|
|
596
601
|
end
|
|
597
602
|
},
|
|
598
603
|
true
|
|
@@ -606,6 +611,9 @@ __TS__SetDescriptor(
|
|
|
606
611
|
end,
|
|
607
612
|
set = function(self, v)
|
|
608
613
|
self.object:setField("umdl:hd", v)
|
|
614
|
+
if WarscriptConfig.AUTOMATICALLY_SET_UNIT_TYPE_PORTRAIT_MODEL_PATH then
|
|
615
|
+
self.object:setField("upor:hd", "")
|
|
616
|
+
end
|
|
609
617
|
end
|
|
610
618
|
},
|
|
611
619
|
true
|
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.eda504c",
|
|
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.251db08"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@typescript-eslint/eslint-plugin": "^8.13.0",
|
package/patch-lua.d.ts
ADDED
|
File without changes
|
package/patch-lua.lua
ADDED
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;
|
|
@@ -22,6 +23,7 @@ export declare const mapToLuaSet: {
|
|
|
22
23
|
<T, R extends AnyNotNil>(array: readonly T[], transform: (value: T) => R): LuaSet<R>;
|
|
23
24
|
<T, K extends KeysOfType<T, AnyNotNil>>(array: readonly T[], key: K): LuaSet<T[K] extends AnyNotNil ? T[K] : never>;
|
|
24
25
|
};
|
|
26
|
+
export declare const flatten: <T>(array: readonly (readonly T[])[]) => T[];
|
|
25
27
|
export declare const flatMap: {
|
|
26
28
|
<T, R>(array: readonly T[], transform: (value: T) => readonly R[]): R[];
|
|
27
29
|
<T, K extends KeysOfType<T, readonly any[]>>(array: readonly T[], key: K): (T[K] extends readonly (infer R)[] ? R : never)[];
|
|
@@ -32,7 +34,10 @@ export declare const flatMapToLuaSet: {
|
|
|
32
34
|
};
|
|
33
35
|
export declare const mapIndexed: <T, R>(array: readonly T[], transform: (index: number, value: T) => R) => R[];
|
|
34
36
|
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:
|
|
37
|
+
export declare const associateBy: {
|
|
38
|
+
<K extends AnyNotNil, V>(array: readonly V[], keySelector: (value: V) => K): LuaMap<K, V>;
|
|
39
|
+
<K extends KeysOfType<V, AnyNotNil>, V>(array: readonly V[], keySelector: K): LuaMap<V[K] extends AnyNotNil ? V[K] : never, V>;
|
|
40
|
+
};
|
|
36
41
|
export declare const associateByIndexed: <K extends AnyNotNil, V>(array: readonly V[], keySelector: (index: number, value: V) => K) => LuaMap<K, V>;
|
|
37
42
|
export declare const associateWith: <K extends AnyNotNil, V>(array: readonly K[], valueSelector: (value: K) => V) => LuaMap<K, V>;
|
|
38
43
|
export declare const associateWithIndexed: <K extends AnyNotNil, V>(array: readonly K[], valueSelector: (index: number, value: K) => V) => LuaMap<K, V>;
|
|
@@ -41,6 +46,10 @@ export declare const average: (array: readonly number[]) => number;
|
|
|
41
46
|
export declare const sum: (array: readonly number[]) => number;
|
|
42
47
|
export declare const product: (array: readonly number[]) => number;
|
|
43
48
|
export declare const max: (array: readonly number[]) => number;
|
|
49
|
+
export declare const maxBy: {
|
|
50
|
+
<T, Args extends any[]>(array: readonly T[], selector: (value: T, ...args: Args) => number, ...args: Args): T | undefined;
|
|
51
|
+
<T, K extends KeysOfType<T, number>>(array: readonly T[], key: K): T | undefined;
|
|
52
|
+
};
|
|
44
53
|
export declare const intersperse: <T>(array: readonly T[], delimiter: T) => T[];
|
|
45
54
|
export declare const zip: <T, R, V>(array: readonly T[], otherArray: readonly R[], transform: (value: T, otherValue: R) => V) => V[];
|
|
46
55
|
export declare const chunked: <T>(array: readonly T[], size: number) => T[][];
|
package/utility/arrays.lua
CHANGED
|
@@ -3,6 +3,8 @@ local __TS__New = ____lualib.__TS__New
|
|
|
3
3
|
local ____exports = {}
|
|
4
4
|
local ____exception = require("exception")
|
|
5
5
|
local IllegalArgumentException = ____exception.IllegalArgumentException
|
|
6
|
+
local ____functions = require("utility.functions")
|
|
7
|
+
local identity = ____functions.identity
|
|
6
8
|
local mathMax = math.max
|
|
7
9
|
local mathMin = math.min
|
|
8
10
|
local select = _G.select
|
|
@@ -47,6 +49,14 @@ ____exports.toLuaSet = function(array)
|
|
|
47
49
|
end
|
|
48
50
|
return result
|
|
49
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
|
|
50
60
|
____exports.forEach = function(array, consumerOrKey, ...)
|
|
51
61
|
if type(consumerOrKey) == "function" then
|
|
52
62
|
for i = 1, #array do
|
|
@@ -120,6 +130,7 @@ ____exports.mapToLuaSet = function(array, transform)
|
|
|
120
130
|
end
|
|
121
131
|
return result
|
|
122
132
|
end
|
|
133
|
+
____exports.flatten = function(array) return ____exports.flatMap(array, identity) end
|
|
123
134
|
____exports.flatMap = function(array, transform)
|
|
124
135
|
local result = {}
|
|
125
136
|
local k = 1
|
|
@@ -178,9 +189,16 @@ ____exports.associate = function(array, keySelector, valueSelector)
|
|
|
178
189
|
end
|
|
179
190
|
____exports.associateBy = function(array, keySelector)
|
|
180
191
|
local result = {}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
192
|
+
if type(keySelector) == "function" then
|
|
193
|
+
for i = 1, #array do
|
|
194
|
+
local value = array[i]
|
|
195
|
+
result[keySelector(value)] = value
|
|
196
|
+
end
|
|
197
|
+
else
|
|
198
|
+
for i = 1, #array do
|
|
199
|
+
local value = array[i]
|
|
200
|
+
result[value[keySelector]] = value
|
|
201
|
+
end
|
|
184
202
|
end
|
|
185
203
|
return result
|
|
186
204
|
end
|
|
@@ -251,6 +269,30 @@ ____exports.max = function(array)
|
|
|
251
269
|
end
|
|
252
270
|
return mathMax(table.unpack(array))
|
|
253
271
|
end
|
|
272
|
+
____exports.maxBy = function(array, selector, ...)
|
|
273
|
+
local result = nil
|
|
274
|
+
local maxValue = -math.huge
|
|
275
|
+
if type(selector) == "function" then
|
|
276
|
+
for i = 1, #array do
|
|
277
|
+
local element = array[i]
|
|
278
|
+
local value = selector(element, ...)
|
|
279
|
+
if value > maxValue then
|
|
280
|
+
result = element
|
|
281
|
+
maxValue = value
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
else
|
|
285
|
+
for i = 1, #array do
|
|
286
|
+
local element = array[i]
|
|
287
|
+
local value = element[selector]
|
|
288
|
+
if value > maxValue then
|
|
289
|
+
result = element
|
|
290
|
+
maxValue = value
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
return result
|
|
295
|
+
end
|
|
254
296
|
____exports.intersperse = function(array, delimiter)
|
|
255
297
|
local result = {}
|
|
256
298
|
local length = #array
|