insert checksums

This commit is contained in:
Not 2022-11-14 22:17:30 +01:00
parent 52316347da
commit 08c1af3073
1 changed files with 45 additions and 17 deletions

View File

@ -122,6 +122,26 @@ local function stat_str(stat)
return "0" return "0"
end 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
local function mapChecksum(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
-- GLOBAL -- GLOBAL
-- Save a record to the LiveStore and write to disk -- Save a record to the LiveStore and write to disk
-- SaveRecord will replace the record holders previous record but it will not compare any record times -- SaveRecord will replace the record holders previous record but it will not compare any record times
@ -141,6 +161,11 @@ local function SaveRecord(score, map, modeSep)
for mapid, records in pairs(LiveStore) do for mapid, records in pairs(LiveStore) do
for _, record in ipairs(records) do for _, record in ipairs(records) do
-- Insert checksum if missing
if (not record.checksum) or record.checksum == "" then
record.checksum = mapChecksum(mapid)
end
f:write( f:write(
mapid, "\t", mapid, "\t",
record.name, "\t", record.name, "\t",
@ -149,7 +174,8 @@ local function SaveRecord(score, map, modeSep)
record.time, "\t", record.time, "\t",
table.concat(record.splits, " "), "\t", table.concat(record.splits, " "), "\t",
record.flags, "\t", record.flags, "\t",
stat_str(record.stat), "\n" stat_str(record.stat), "\t",
record.checksum or "", "\n"
) )
end end
end end
@ -164,7 +190,7 @@ end
addHook("NetVars", netvars) addHook("NetVars", netvars)
local function score_t(map, name, skin, color, time, splits, flags, stat) local function score_t(map, name, skin, color, time, splits, flags, stat, checksum)
return { return {
["map"] = map, ["map"] = map,
["name"] = name, ["name"] = name,
@ -173,7 +199,8 @@ local function score_t(map, name, skin, color, time, splits, flags, stat)
["time"] = time, ["time"] = time,
["splits"] = splits, ["splits"] = splits,
["flags"] = flags, ["flags"] = flags,
["stat"] = stat ["stat"] = stat,
["checksum"] = checksum
} }
end end
@ -206,6 +233,8 @@ local function parseScore(str)
end end
end end
local checksum = t[9]
return score_t( return score_t(
tonumber(t[1]), -- Map tonumber(t[1]), -- Map
t[2], -- Name t[2], -- Name
@ -214,25 +243,24 @@ local function parseScore(str)
tonumber(t[5]), -- Time tonumber(t[5]), -- Time
splits, splits,
flags, flags,
stats stats,
checksum
) )
end end
rawset(_G, "lb_parse_score", parseScore) rawset(_G, "lb_parse_score", parseScore)
-- Load the livestore -- Load the livestore
do if isserver then
if isserver then local f = assert(
local f = assert( io.open(LEADERBOARD_FILE, "r"),
io.open(LEADERBOARD_FILE, "r"), "Failed to open file: "..LEADERBOARD_FILE
"Failed to open file: "..LEADERBOARD_FILE )
)
for l in f:lines() do for l in f:lines() do
local score = parseScore(l) local score = parseScore(l)
LiveStore[score.map] = $ or {} LiveStore[score.map] = $ or {}
table.insert(LiveStore[score.map], score) table.insert(LiveStore[score.map], score)
end
f:close()
end end
f:close()
end end