110 lines
2.3 KiB
Lua
110 lines
2.3 KiB
Lua
rawset(_G, "lb_score_t", function(map, name, skin, color, time, splits, flags, stat, checksum)
|
|
return {
|
|
["map"] = map,
|
|
["name"] = name,
|
|
["skin"] = skin,
|
|
["color"] = color,
|
|
["time"] = time,
|
|
["splits"] = splits,
|
|
["flags"] = flags,
|
|
["stat"] = stat,
|
|
["checksum"] = checksum
|
|
}
|
|
end)
|
|
|
|
rawset(_G, "lb_TicsToTime", function(tics, pure)
|
|
if tics == 0 and pure then
|
|
return "-:--:--"
|
|
end
|
|
|
|
return string.format(
|
|
"%d:%02d:%02d",
|
|
G_TicsToMinutes(tics, true),
|
|
G_TicsToSeconds(tics),
|
|
G_TicsToCentiseconds(tics)
|
|
)
|
|
end)
|
|
|
|
rawset(_G, "lb_ZoneAct", function(map)
|
|
local z = ""
|
|
if map.zonttl != "" then
|
|
z = " " + map.zonttl
|
|
elseif not(map.levelflags & LF_NOZONE) then
|
|
z = " Zone"
|
|
end
|
|
if map.actnum != "" then
|
|
z = $ + " " + map.actnum
|
|
end
|
|
|
|
return z
|
|
end)
|
|
|
|
rawset(_G, "lb_stat_t", function(speed, weight)
|
|
if speed and weight then
|
|
return (speed << 4) | weight
|
|
end
|
|
return 0
|
|
end)
|
|
|
|
|
|
local F_SPBBIG = 0x4
|
|
local F_SPBEXP = 0x8
|
|
-- True if a is better than b
|
|
rawset(_G, "lb_comp", function(a, b)
|
|
-- Calculates the difficulty, harder has higher priority
|
|
-- if s is positive then a is harder
|
|
-- if s is negative then b is harder
|
|
-- if s is 0 then compare time
|
|
local s = (a.flags & (F_SPBEXP | F_SPBBIG)) - (b.flags & (F_SPBEXP | F_SPBBIG))
|
|
return s > 0 or not(s < 0 or a.time >= b.time)
|
|
end)
|
|
|
|
local function djb2(message)
|
|
local digest = 5381
|
|
for c in message:gmatch(".") do
|
|
digest = (($ << 5) + $) + string.byte(c)
|
|
end
|
|
|
|
return digest
|
|
end
|
|
|
|
-- Produce a checksum by using the maps title, subtitle and zone
|
|
rawset(_G, "lb_map_checksum", function(mapnum)
|
|
local mh = mapheaderinfo[mapnum]
|
|
if not mh then
|
|
return nil
|
|
end
|
|
|
|
local digest = string.format("%04x", djb2(mh.lvlttl..mh.subttl..mh.zonttl))
|
|
return string.sub(digest, #digest - 3)
|
|
end)
|
|
|
|
rawset(_G, "lb_mapnum_from_extended", function(map)
|
|
local p, q = map:upper():match("MAP(%w)(%w)$", 1)
|
|
if not (p and q) then
|
|
return nil
|
|
end
|
|
|
|
local mapnum = 0
|
|
local A = string.byte("A")
|
|
|
|
if tonumber(p) != nil then
|
|
-- Non extended map numbers
|
|
if tonumber(q) == nil then
|
|
return nil
|
|
end
|
|
mapnum = tonumber(p) * 10 + tonumber(q)
|
|
else
|
|
--Extended map numbers
|
|
p = string.byte(p) - A
|
|
local qn = tonumber(q)
|
|
if qn == nil then
|
|
qn = string.byte(q) - A + 10
|
|
end
|
|
|
|
mapnum = 36 * p + qn + 100
|
|
end
|
|
|
|
return mapnum
|
|
end)
|