Compare commits

..

6 Commits

Author SHA1 Message Date
e25b417fbd fix function name 2022-05-15 22:31:51 +02:00
3d54350dae Use strings as the default cvar value 2022-05-14 08:12:58 +02:00
89da89fbfe Simplify allowJoin() 2022-05-14 08:04:28 +02:00
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
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
6ea3341b06 better init logic + make sure we are not in battle 2022-05-14 07:33:03 +02:00

View File

@ -12,28 +12,14 @@ local splits = {}
local PATCH = nil local PATCH = nil
local help = true local help = true
local EncoreInitial = nil local EncoreInitial = nil
local cv_teamchange
local scoreTable 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 -- Tracks if stats have been written or not
local StatTrack = false local StatTrack = false
local UNCLAIMED = "Unclaimed Record" 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" local FILENAME = "leaderboard.txt"
-- Retry / changelevel map -- Retry / changelevel map
@ -90,13 +76,9 @@ local ticsToTime
local allowJoin local allowJoin
--------------- ---------------
-- cvars
local cv_teamchange
local cv_spbatk
local cv_gui = CV_RegisterVar({ local cv_gui = CV_RegisterVar({
name = "lb_gui", name = "lb_gui",
defaultvalue = GUI_ON, defaultvalue = "On",
flags = 0, flags = 0,
PossibleValue = {Off = GUI_OFF, Splits = GUI_SPLITS, On = GUI_ON} PossibleValue = {Off = GUI_OFF, Splits = GUI_SPLITS, On = GUI_ON}
}) })
@ -104,7 +86,7 @@ local cv_gui = CV_RegisterVar({
local AntiAFK = true local AntiAFK = true
CV_RegisterVar({ CV_RegisterVar({
name = "lb_afk", name = "lb_afk",
defaultvalue = 1, defaultvalue = "On",
flags = CV_NETVAR | CV_CALL, flags = CV_NETVAR | CV_CALL,
PossibleValue = CV_OnOff, PossibleValue = CV_OnOff,
func = function(v) func = function(v)
@ -123,7 +105,7 @@ CV_RegisterVar({
local cv_enable = CV_RegisterVar({ local cv_enable = CV_RegisterVar({
name = "lb_enable", name = "lb_enable",
defaultvalue = 1, defaultvalue = "On",
flags = CV_NETVAR | CV_CALL, flags = CV_NETVAR | CV_CALL,
PossibleValue = CV_OnOff, PossibleValue = CV_OnOff,
func = function(v) func = function(v)
@ -143,7 +125,7 @@ local cv_saves = CV_RegisterVar({
local cv_interrupt = CV_RegisterVar({ local cv_interrupt = CV_RegisterVar({
name = "lb_interrupt", name = "lb_interrupt",
defaultvalue = 0, defaultvalue = "Off",
flags = CV_NETVAR | CV_CALL, flags = CV_NETVAR | CV_CALL,
PossibleValue = CV_OnOff, PossibleValue = CV_OnOff,
func = function(v) func = function(v)
@ -211,7 +193,7 @@ end
local cv_spb_separate = CV_RegisterVar({ local cv_spb_separate = CV_RegisterVar({
name = "lb_spb_combined", name = "lb_spb_combined",
defaultvalue = 1, defaultvalue = "On",
flags = CV_NETVAR | CV_CALL, flags = CV_NETVAR | CV_CALL,
PossibleValue = CV_YesNo, PossibleValue = CV_YesNo,
func = function(v) func = function(v)
@ -315,40 +297,39 @@ end
function allowJoin(v) function allowJoin(v)
if not cv_interrupt.value then if not cv_interrupt.value then
local y
if v then if v then
y = "yes" COM_BufInsertText(server, "allowteamchange Yes")
hud.enable("freeplay") hud.enable("freeplay")
else else
y = "no" COM_BufInsertText(server, "allowteamchange No")
hud.disable("freeplay") hud.disable("freeplay")
end end
COM_BufInsertText(server, "allowteamchange " + y)
end end
end end
-- Returns true if there is a single player ingame local function TwoPlusInGame()
local function singleplayer()
local n = 0 local n = 0
for p in players.iterate do for p in players.iterate do
if p.valid and not p.spectator then if p.valid and not p.spectator then
n = $ + 1 n = $ + 1
if n > 1 then if n == 2 then
return false
end
end
end
return true return true
end end
end
end
return false
end
local function initLeaderboard(player) local function initLeaderboard(player)
if cv_enable.value and G_RaceGametype() then
if disable and leveltime < START_TIME then if disable and leveltime < START_TIME then
disable = not singleplayer() disable = TwoPlusInGame()
else else
disable = disable or not singleplayer() disable = $ or TwoPlusInGame()
end
else
disable = true
end end
disable = $ or not cv_enable.value or not (maptol & (TOL_SP | TOL_RACE))
-- Restore encore mode to initial value -- Restore encore mode to initial value
if disable and EncoreInitial != nil then if disable and EncoreInitial != nil then
@ -361,7 +342,7 @@ end
addHook("PlayerSpawn", initLeaderboard) addHook("PlayerSpawn", initLeaderboard)
local function doyoudare(player) local function doyoudare(player)
if not singleplayer() or player.spectator then if TwoPlusInGame() or player.spectator then
CONS_Printf(player, "How dare you") CONS_Printf(player, "How dare you")
return false return false
end end
@ -386,58 +367,26 @@ local function exitlevel(player, ...)
end end
COM_AddCommand("exit", exitlevel) 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 function findMap(player, ...)
local search = ... local search = ...
if search == nil then
local hell = "\x85HELL" return
local tol = { end
[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
for i = 1, #mapheaderinfo do for i = 1, #mapheaderinfo do
map = mapheaderinfo[i] local map = mapheaderinfo[i]
if map == nil then if map == nil then
continue continue
end end
lvlttl = map.lvlttl + zoneAct(map) if map.lvlttl:lower():find(search:lower()) then
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)
CONS_Printf( CONS_Printf(
player, player,
string.format( string.format(
"%s %-9s %-30s - %s\t%s", "%s - %s",
G_BuildMapName(i), G_BuildMapName(i),
lvltype, map.lvlttl
lvlttl,
map.subttl,
(map.menuflags & LF2_HIDEINMENU and hell) or ""
) )
) )
end end
@ -445,128 +394,11 @@ local function findMap(player, ...)
end end
COM_AddCommand("findmap", findMap) COM_AddCommand("findmap", findMap)
local function mapnumFromExtended(map) local function mapNotExists(player, map)
local p, q = map:upper():match("MAP(%w)(%w)$", 1) CONS_Printf(player, string.format("Map doesn't exist: %s", map:upper()))
if not (p and q) then
return nil
end end
local mapnum = 0 local ALPH = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
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
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 function changelevel(player, ...) local function changelevel(player, ...)
if not doyoudare(player) then if not doyoudare(player) then
@ -582,19 +414,32 @@ local function changelevel(player, ...)
return return
end end
local mapnum = mapnumFromExtended(map) local p, q = map:upper():match("MAP(%w)(%w)$", 1)
if not mapnum then if not (p and q) then
CONS_Printf(player, string.format("Invalid map name: %s", map)) 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 return
end end
-- Verify valid race level local mapnum = 0
if not (mapheaderinfo[mapnum].typeoflevel & (TOL_SP | TOL_RACE)) then if tonumber(p) != nil then
CONS_Printf(player, "Battle maps are not supported") -- 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 return
end end
@ -711,6 +556,12 @@ local function findRival(player, ...)
return a["rival"]["map"] < b["rival"]["map"] return a["rival"]["map"] < b["rival"]["map"]
end end
local modestrings = {
[F_SPBEXP] = "X",
[F_SPBBIG] = "B",
[F_SPBJUS] = "J",
}
for mode, tbl in pairs(scores) do for mode, tbl in pairs(scores) do
if i >= stop then break end if i >= stop then break end
@ -724,7 +575,15 @@ local function findRival(player, ...)
if i >= stop then break end if i >= stop then break end
i = i + 1 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 if score["your"] then
local diff = score["your"]["time"] - score["rival"]["time"] local diff = score["your"]["time"] - score["rival"]["time"]
@ -806,7 +665,6 @@ addHook("MapLoad", function()
drawState = DS_DEFAULT drawState = DS_DEFAULT
scrollY = 50 * FRACUNIT scrollY = 50 * FRACUNIT
scrollAcc = 0 scrollAcc = 0
FlashTics = 0
allowJoin(true) allowJoin(true)
--printTable(lb) --printTable(lb)
@ -899,11 +757,10 @@ local FACERANK_DIM = 16
local FACERANK_SPC = FACERANK_DIM + 4 local FACERANK_SPC = FACERANK_DIM + 4
local function drawScore(v, player, pos, x, y, gui, faceRank, score, drawPos, textVFlags) local function drawScore(v, player, pos, x, y, gui, faceRank, score, drawPos, textVFlags)
textVFlags = textVFlags or V_HUDTRANSHALF textVFlags = textVFlags or V_HUDTRANSHALF
local me = player.name == score["name"]
--draw Patch/chili --draw Patch/chili
v.draw(x, y, faceRank, V_HUDTRANS | VFLAGS, v.getColormap("sonic", score["color"])) 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) v.draw(x, y, PATCH["CHILI"][(leveltime / 4) % 8], V_HUDTRANS | VFLAGS)
end end
@ -915,7 +772,7 @@ local function drawScore(v, player, pos, x, y, gui, faceRank, score, drawPos, te
bob + (y + FACERANK_DIM / 2) * FRACUNIT, bob + (y + FACERANK_DIM / 2) * FRACUNIT,
FRACUNIT / 6, FRACUNIT / 6,
PATCH["RUBY"], PATCH["RUBY"],
V_HUDTRANS | VFLAGS V_HUDTRANS
) )
end end
@ -999,16 +856,11 @@ local function drawScore(v, player, pos, x, y, gui, faceRank, score, drawPos, te
end end
end end
local flashV = 0
if me and FlashTics > leveltime then
flashV = FlashVFlags[leveltime / FlashRate % (#FlashVFlags + 1)]
end
v.drawString( v.drawString(
x + FACERANK_DIM + px, x + FACERANK_DIM + px,
y + py, y + py,
name, name,
textVFlags | V_ALLOWLOWERCASE | VFLAGS | flashV, textVFlags | V_ALLOWLOWERCASE | VFLAGS,
stralign stralign
) )
@ -1026,7 +878,7 @@ local function drawScore(v, player, pos, x, y, gui, faceRank, score, drawPos, te
x + px + FACERANK_DIM, x + px + FACERANK_DIM,
y + 8, y + 8,
ticsToTime(score["time"], true), ticsToTime(score["time"], true),
textVFlags | bodium[min(pos, 4)] | VFLAGS | flashV textVFlags | bodium[min(pos, 4)] | VFLAGS
) )
end end
end end
@ -1223,16 +1075,10 @@ local function saveTime(player)
if lbComp(newscore, scoreTable[i]) then if lbComp(newscore, scoreTable[i]) then
table.remove(scoreTable, i) table.remove(scoreTable, i)
S_StartSound(nil, 130) S_StartSound(nil, 130)
FlashTics = leveltime + TICRATE * 3
FlashRate = 1
FlashVFlags = YellowFlash
break break
else else
-- You suck lol -- You suck lol
S_StartSound(nil, 201) S_StartSound(nil, 201)
FlashTics = leveltime + TICRATE * 3
FlashRate = 3
FlashVFlags = RedFlash
scroll_to(player) scroll_to(player)
return return
end end
@ -1309,17 +1155,15 @@ local function getGamer()
end end
end end
local function changeMap() local function think()
COM_BufInsertText(server, "map " + nextMap + " -force -gametype race") if nextMap then
COM_BufInsertText(server, "map " + nextMap)
nextMap = nil nextMap = nil
end end
local function think()
if nextMap then changeMap() end
if disable then if disable then
if AntiAFK then if AntiAFK then
if not singleplayer() then if TwoPlusInGame() then
for p in players.iterate do for p in players.iterate do
if p.valid and not p.spectator and not p.exiting and p.lives > 0 then if p.valid and not p.spectator and not p.exiting and p.lives > 0 then
if p.cmd.buttons then if p.cmd.buttons then
@ -1356,7 +1200,7 @@ local function think()
if leveltime < START_TIME then if leveltime < START_TIME then
-- Help message -- Help message
if leveltime == START_TIME - TICRATE * 3 then if leveltime == START_TIME - TICRATE * 3 then
if singleplayer() then if p then
if help then if help then
help = false help = false
chatprint(HELP_MESSAGE, true) chatprint(HELP_MESSAGE, true)
@ -1382,15 +1226,10 @@ local function think()
end end
end end
end end
if not cv_spbatk then
cv_spbatk = CV_FindVar("spbatk")
end
-- Gamemode flags -- Gamemode flags
Flags = $ & !(F_SPBATK | F_SPBEXP | F_SPBBIG | F_SPBJUS) Flags = $ & !(F_SPBATK | F_SPBEXP | F_SPBBIG | F_SPBJUS)
if server.SPBArunning if leveltime > START_TIME - (3 * TICRATE) / 2 and server.SPBArunning then
and cv_spbatk.value
and leveltime > START_TIME - (3 * TICRATE) / 2 then
Flags = $ | F_SPBATK Flags = $ | F_SPBATK
if server.SPBAexpert then if server.SPBAexpert then
Flags = $ | F_SPBEXP Flags = $ | F_SPBEXP
@ -1413,18 +1252,10 @@ local function think()
end end
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
end if not (Flags & F_SPBATK) then
else
hud.enable("freeplay") hud.enable("freeplay")
end end
end end
scoreTable = getScoreTable(gamemap, Flags) scoreTable = getScoreTable(gamemap, Flags)
@ -1481,7 +1312,10 @@ end
addHook("ThinkFrame", think) addHook("ThinkFrame", think)
local function interThink() local function interThink()
if nextMap then changeMap() end if nextMap then
COM_BufInsertText(server, "map " + nextMap)
nextMap = nil
end
if not cv_teamchange then if not cv_teamchange then
cv_teamchange = CV_FindVar("allowteamchange") cv_teamchange = CV_FindVar("allowteamchange")