Compare commits

..

6 Commits

Author SHA1 Message Date
Lonsfor e25b417fbd fix function name 2022-05-15 22:31:51 +02:00
Lonsfor 3d54350dae Use strings as the default cvar value 2022-05-14 08:12:58 +02:00
Lonsfor 89da89fbfe Simplify allowJoin() 2022-05-14 08:04:28 +02:00
Lonsfor 906444ae08 change ingame() to only check if there is 2 players in game
as ingame() is only used to check if there is more than 1 player then it is changed to not look for more than 2 since its not needed. name changed to reflect that.
2022-05-14 08:02:05 +02:00
Lonsfor 405a0e50f2 save player iteration on thinker
we know that there are no more than one player as `disable` is false and you know there is 1 if `p` exist
2022-05-14 07:41:40 +02:00
Lonsfor 6ea3341b06 better init logic + make sure we are not in battle 2022-05-14 07:33:03 +02:00
1 changed files with 89 additions and 255 deletions

View File

@ -12,28 +12,14 @@ local splits = {}
local PATCH = nil
local help = true
local EncoreInitial = nil
local cv_teamchange
local scoreTable
-- Text flash on finish
local FlashTics = 0
local FlashRate
local FlashVFlags
local YellowFlash = {
[0] = V_YELLOWMAP,
[1] = V_ORANGEMAP,
[2] = 0
}
local RedFlash = {
[0] = V_REDMAP,
[1] = 0
}
-- Tracks if stats have been written or not
local StatTrack = false
local UNCLAIMED = "Unclaimed Record"
local HELP_MESSAGE = "\x89Leaderboard Commands:\nretry exit findmap changelevel spba_clearcheats lb_gui rival scroll encore records"
local HELP_MESSAGE = "\x89Leaderboard Commands:\nretry exit findmap changelevel spba_clearcheats lb_gui rival scroll encore"
local FILENAME = "leaderboard.txt"
-- Retry / changelevel map
@ -90,13 +76,9 @@ local ticsToTime
local allowJoin
---------------
-- cvars
local cv_teamchange
local cv_spbatk
local cv_gui = CV_RegisterVar({
name = "lb_gui",
defaultvalue = GUI_ON,
defaultvalue = "On",
flags = 0,
PossibleValue = {Off = GUI_OFF, Splits = GUI_SPLITS, On = GUI_ON}
})
@ -104,7 +86,7 @@ local cv_gui = CV_RegisterVar({
local AntiAFK = true
CV_RegisterVar({
name = "lb_afk",
defaultvalue = 1,
defaultvalue = "On",
flags = CV_NETVAR | CV_CALL,
PossibleValue = CV_OnOff,
func = function(v)
@ -123,7 +105,7 @@ CV_RegisterVar({
local cv_enable = CV_RegisterVar({
name = "lb_enable",
defaultvalue = 1,
defaultvalue = "On",
flags = CV_NETVAR | CV_CALL,
PossibleValue = CV_OnOff,
func = function(v)
@ -143,7 +125,7 @@ local cv_saves = CV_RegisterVar({
local cv_interrupt = CV_RegisterVar({
name = "lb_interrupt",
defaultvalue = 0,
defaultvalue = "Off",
flags = CV_NETVAR | CV_CALL,
PossibleValue = CV_OnOff,
func = function(v)
@ -211,7 +193,7 @@ end
local cv_spb_separate = CV_RegisterVar({
name = "lb_spb_combined",
defaultvalue = 1,
defaultvalue = "On",
flags = CV_NETVAR | CV_CALL,
PossibleValue = CV_YesNo,
func = function(v)
@ -315,40 +297,39 @@ end
function allowJoin(v)
if not cv_interrupt.value then
local y
if v then
y = "yes"
COM_BufInsertText(server, "allowteamchange Yes")
hud.enable("freeplay")
else
y = "no"
COM_BufInsertText(server, "allowteamchange No")
hud.disable("freeplay")
end
COM_BufInsertText(server, "allowteamchange " + y)
end
end
-- Returns true if there is a single player ingame
local function singleplayer()
local function TwoPlusInGame()
local n = 0
for p in players.iterate do
if p.valid and not p.spectator then
n = $ + 1
if n > 1 then
return false
if n == 2 then
return true
end
end
end
return true
return false
end
local function initLeaderboard(player)
if disable and leveltime < START_TIME then
disable = not singleplayer()
if cv_enable.value and G_RaceGametype() then
if disable and leveltime < START_TIME then
disable = TwoPlusInGame()
else
disable = $ or TwoPlusInGame()
end
else
disable = disable or not singleplayer()
disable = true
end
disable = $ or not cv_enable.value or not (maptol & (TOL_SP | TOL_RACE))
-- Restore encore mode to initial value
if disable and EncoreInitial != nil then
@ -361,7 +342,7 @@ end
addHook("PlayerSpawn", initLeaderboard)
local function doyoudare(player)
if not singleplayer() or player.spectator then
if TwoPlusInGame() or player.spectator then
CONS_Printf(player, "How dare you")
return false
end
@ -386,58 +367,26 @@ local function exitlevel(player, ...)
end
COM_AddCommand("exit", exitlevel)
local function zoneAct(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
local function findMap(player, ...)
local search = ...
if search == nil then
local hell = "\x85HELL"
local tol = {
[TOL_SP] = "\x81Race\x80", -- Nuked race maps
[TOL_COOP] = "\x8D\Battle\x80", -- Nuked battle maps
[TOL_RACE] = "\x88Race\x80",
[TOL_MATCH] = "\x87\Battle\x80"
}
local lvltype, map, lvlttl
return
end
for i = 1, #mapheaderinfo do
map = mapheaderinfo[i]
local map = mapheaderinfo[i]
if map == nil then
continue
end
lvlttl = map.lvlttl + zoneAct(map)
if not search or lvlttl:lower():find(search:lower()) then
-- Only care for up to TOL_MATCH (0x10)
lvltype = tol[map.typeoflevel & 0x1F] or map.typeoflevel
-- If not battle print numlaps
lvltype = (map.typeoflevel & (TOL_MATCH | TOL_COOP) and lvltype)
or string.format("%s \x82%-2d\x80", lvltype, map.numlaps)
if map.lvlttl:lower():find(search:lower()) then
CONS_Printf(
player,
string.format(
"%s %-9s %-30s - %s\t%s",
"%s - %s",
G_BuildMapName(i),
lvltype,
lvlttl,
map.subttl,
(map.menuflags & LF2_HIDEINMENU and hell) or ""
map.lvlttl
)
)
end
@ -445,128 +394,11 @@ local function findMap(player, ...)
end
COM_AddCommand("findmap", findMap)
local function mapnumFromExtended(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
local function mapNotExists(player, map)
CONS_Printf(player, string.format("Map doesn't exist: %s", map:upper()))
end
local SPBModeSym = {
[F_SPBEXP] = "X",
[F_SPBBIG] = "B",
[F_SPBJUS] = "J",
}
local function modeToString(mode)
local modestr = "Time Attack"
if mode & F_SPBATK then
modestr = "SPB"
for k, v in pairs(SPBModeSym) do
if mode & k then
modestr = $ + v
end
end
end
return modestr
end
local function records(player, ...)
local mapid = ...
local mapnum = gamemap
if mapid then
mapnum = mapnumFromExtended(mapid)
if not mapnum then
CONS_Printf(player, string.format("Invalid map name: %s", mapid))
return
end
end
local map = mapheaderinfo[mapnum]
if map then
CONS_Printf(player,
string.format(
"\x83%s%8s",
map.lvlttl,
(map.menuflags & LF2_HIDEINMENU and "\x85HELL") or ""
)
)
local zoneact = zoneAct(map)
-- print the zone/act on the right hand size under the title
CONS_Printf(
player,
string.format(
string.format("\x83%%%ds%%s\x80 - \x88%%s", #map.lvlttl - #zoneact / 2 - 1),
" ",
zoneAct(map),
map.subttl
)
)
else
CONS_Printf(player, "\x85UNKNOWN MAP")
end
for mode, maps in pairs(lb) do
local maptbl = maps[mapnum]
if not maptbl then continue end
CONS_Printf(player, "")
CONS_Printf(player, modeToString(mode))
-- don't print flags for time attack
if mode then
for i, tbl in ipairs(maptbl) do
CONS_Printf(
player,
string.format(
"%2d %-21s \x89%8s \x80%s",
i,
tbl["name"],
ticsToTime(tbl["time"]),
modeToString(tbl["flags"])
)
)
end
else
for i, tbl in ipairs(maptbl) do
CONS_Printf(
player,
string.format(
"%2d %-21s \x89%8s",
i,
tbl["name"],
ticsToTime(tbl["time"])
)
)
end
end
end
end
COM_AddCommand("records", records)
local ALPH = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
local function changelevel(player, ...)
if not doyoudare(player) then
@ -582,19 +414,32 @@ local function changelevel(player, ...)
return
end
local mapnum = mapnumFromExtended(map)
if not mapnum then
local p, q = map:upper():match("MAP(%w)(%w)$", 1)
if not (p and q) then
CONS_Printf(player, string.format("Invalid map name: %s", map))
end
if mapheaderinfo[mapnum] == nil then
CONS_Printf(player, string.format("Map doesn't exist: %s", map:upper()))
return
end
-- Verify valid race level
if not (mapheaderinfo[mapnum].typeoflevel & (TOL_SP | TOL_RACE)) then
CONS_Printf(player, "Battle maps are not supported")
local mapnum = 0
if tonumber(p) != nil then
-- Non extended map numbers
if tonumber(q) == nil then
mapNotExists(player, map)
return
end
mapnum = tonumber(p) * 10 + tonumber(q)
else
--Extended map numbers
p = ALPH:find(p) - 1
local qn = tonumber(q)
if qn == nil then
qn = ALPH:find(q) + 9
end
mapnum = 36 * p + qn + 100
end
if mapheaderinfo[mapnum] == nil then
mapNotExists(player, map)
return
end
@ -653,7 +498,7 @@ local function findRival(player, ...)
[0] = "\x89",
[-1] = "\x88"
}
local sym = {
[true] = "-",
[false] = "",
@ -711,6 +556,12 @@ local function findRival(player, ...)
return a["rival"]["map"] < b["rival"]["map"]
end
local modestrings = {
[F_SPBEXP] = "X",
[F_SPBBIG] = "B",
[F_SPBJUS] = "J",
}
for mode, tbl in pairs(scores) do
if i >= stop then break end
@ -724,7 +575,15 @@ local function findRival(player, ...)
if i >= stop then break end
i = i + 1
local modestr = modeToString(score["rival"]["flags"])
local modestr = "TA"
if score["rival"]["flags"] & F_SPBATK then
modestr = "SPB"
for k, v in pairs(modestrings) do
if score["rival"]["flags"] & k then
modestr = $ + v
end
end
end
if score["your"] then
local diff = score["your"]["time"] - score["rival"]["time"]
@ -793,7 +652,7 @@ COM_AddCommand("rival", findRival)
-- -- v[i]["flags"],
-- -- ","
-- -- )
-- --
-- --
-- --end
-- end
-- end
@ -806,7 +665,6 @@ addHook("MapLoad", function()
drawState = DS_DEFAULT
scrollY = 50 * FRACUNIT
scrollAcc = 0
FlashTics = 0
allowJoin(true)
--printTable(lb)
@ -861,7 +719,7 @@ local function marquee(text, maxwidth)
if #text <= maxwidth then
return text
end
local shift = 16
-- Creates an index range ranging from -shift to #text + shift
@ -899,11 +757,10 @@ local FACERANK_DIM = 16
local FACERANK_SPC = FACERANK_DIM + 4
local function drawScore(v, player, pos, x, y, gui, faceRank, score, drawPos, textVFlags)
textVFlags = textVFlags or V_HUDTRANSHALF
local me = player.name == score["name"]
--draw Patch/chili
v.draw(x, y, faceRank, V_HUDTRANS | VFLAGS, v.getColormap("sonic", score["color"]))
if me then
if player.name == score["name"] then
v.draw(x, y, PATCH["CHILI"][(leveltime / 4) % 8], V_HUDTRANS | VFLAGS)
end
@ -915,7 +772,7 @@ local function drawScore(v, player, pos, x, y, gui, faceRank, score, drawPos, te
bob + (y + FACERANK_DIM / 2) * FRACUNIT,
FRACUNIT / 6,
PATCH["RUBY"],
V_HUDTRANS | VFLAGS
V_HUDTRANS
)
end
@ -999,16 +856,11 @@ local function drawScore(v, player, pos, x, y, gui, faceRank, score, drawPos, te
end
end
local flashV = 0
if me and FlashTics > leveltime then
flashV = FlashVFlags[leveltime / FlashRate % (#FlashVFlags + 1)]
end
v.drawString(
x + FACERANK_DIM + px,
y + py,
name,
textVFlags | V_ALLOWLOWERCASE | VFLAGS | flashV,
textVFlags | V_ALLOWLOWERCASE | VFLAGS,
stralign
)
@ -1026,7 +878,7 @@ local function drawScore(v, player, pos, x, y, gui, faceRank, score, drawPos, te
x + px + FACERANK_DIM,
y + 8,
ticsToTime(score["time"], true),
textVFlags | bodium[min(pos, 4)] | VFLAGS | flashV
textVFlags | bodium[min(pos, 4)] | VFLAGS
)
end
end
@ -1223,16 +1075,10 @@ local function saveTime(player)
if lbComp(newscore, scoreTable[i]) then
table.remove(scoreTable, i)
S_StartSound(nil, 130)
FlashTics = leveltime + TICRATE * 3
FlashRate = 1
FlashVFlags = YellowFlash
break
else
-- You suck lol
S_StartSound(nil, 201)
FlashTics = leveltime + TICRATE * 3
FlashRate = 3
FlashVFlags = RedFlash
scroll_to(player)
return
end
@ -1309,17 +1155,15 @@ local function getGamer()
end
end
local function changeMap()
COM_BufInsertText(server, "map " + nextMap + " -force -gametype race")
nextMap = nil
end
local function think()
if nextMap then changeMap() end
if nextMap then
COM_BufInsertText(server, "map " + nextMap)
nextMap = nil
end
if disable then
if AntiAFK then
if not singleplayer() then
if TwoPlusInGame() then
for p in players.iterate do
if p.valid and not p.spectator and not p.exiting and p.lives > 0 then
if p.cmd.buttons then
@ -1356,7 +1200,7 @@ local function think()
if leveltime < START_TIME then
-- Help message
if leveltime == START_TIME - TICRATE * 3 then
if singleplayer() then
if p then
if help then
help = false
chatprint(HELP_MESSAGE, true)
@ -1382,15 +1226,10 @@ local function think()
end
end
end
if not cv_spbatk then
cv_spbatk = CV_FindVar("spbatk")
end
-- Gamemode flags
Flags = $ & !(F_SPBATK | F_SPBEXP | F_SPBBIG | F_SPBJUS)
if server.SPBArunning
and cv_spbatk.value
and leveltime > START_TIME - (3 * TICRATE) / 2 then
if leveltime > START_TIME - (3 * TICRATE) / 2 and server.SPBArunning then
Flags = $ | F_SPBATK
if server.SPBAexpert then
Flags = $ | F_SPBEXP
@ -1413,18 +1252,10 @@ local function think()
end
end
-- make sure the spb actually spawned
if leveltime == START_TIME - 1 then
if not (server.SPBAbomb and server.SPBAbomb.valid) then
-- it didn't spawn, clear spb flags
Flags = $ & !(F_SPBATK | F_SPBEXP | F_SPBBIG | F_SPBJUS)
end
end
else
end
if not (Flags & F_SPBATK) then
hud.enable("freeplay")
end
end
scoreTable = getScoreTable(gamemap, Flags)
@ -1481,7 +1312,10 @@ end
addHook("ThinkFrame", think)
local function interThink()
if nextMap then changeMap() end
if nextMap then
COM_BufInsertText(server, "map " + nextMap)
nextMap = nil
end
if not cv_teamchange then
cv_teamchange = CV_FindVar("allowteamchange")