12 Commits

3 changed files with 80 additions and 48 deletions

View File

@ -241,7 +241,7 @@ function parseScore(str)
splits, splits,
flags, flags,
stats, stats,
checksum checksum:lower()
) )
end end
rawset(_G, "lb_parse_score", parseScore) rawset(_G, "lb_parse_score", parseScore)
@ -275,8 +275,6 @@ local function moveRecords(from, to, modeSep)
return 0 return 0
end end
local moveCount = #store[from.id][from.checksum]
store[to.id] = $ or {} store[to.id] = $ or {}
store[to.id][to.checksum] = $ or {} store[to.id][to.checksum] = $ or {}
for i, score in ipairs(store[from.id][from.checksum]) do for i, score in ipairs(store[from.id][from.checksum]) do
@ -287,24 +285,21 @@ local function moveRecords(from, to, modeSep)
-- Destroy the original table -- Destroy the original table
store[from.id][from.checksum] = nil store[from.id][from.checksum] = nil
return moveCount
end end
-- move livestore records and write to disk -- move livestore records and write to disk
local moveCount = moveRecordsInStore(LiveStore) moveRecordsInStore(LiveStore)
if isserver then
dumpStoreToFile(LEADERBOARD_FILE, LiveStore) dumpStoreToFile(LEADERBOARD_FILE, LiveStore)
-- move coldstore records -- move coldstore records
if isserver then
local ok, coldstore = pcall(loadStoreFile, COLDSTORE_FILE) local ok, coldstore = pcall(loadStoreFile, COLDSTORE_FILE)
if ok and coldstore then if ok and coldstore then
moveRecordsInStore(coldstore) moveRecordsInStore(coldstore)
dumpStoreToFile(COLDSTORE_FILE, coldstore) dumpStoreToFile(COLDSTORE_FILE, coldstore)
end end
end end
return moveCount
end end
rawset(_G, "lb_move_records", moveRecords) rawset(_G, "lb_move_records", moveRecords)
@ -353,17 +348,14 @@ COM_AddCommand("lb_write_checksums", function(player)
end, COM_ADMIN) end, COM_ADMIN)
COM_AddCommand("lb_known_maps", function(player, map) COM_AddCommand("lb_known_maps", function(player, map)
if not map then local mapnum = gamemap
CONS_Printf(player, "Usage: <map>") if map then
CONS_Printf(player, "Print all known checksums under <map>") mapnum = mapnumFromExtended(map)
return
end
local mapnum = mapnumFromExtended(map)
if not mapnum then if not mapnum then
CONS_Printf(player, string.format("invalid map '%s'", map)) CONS_Printf(player, string.format("invalid map '%s'", map))
return return
end end
end
local known = {} local known = {}
@ -380,10 +372,22 @@ COM_AddCommand("lb_known_maps", function(player, map)
CONS_Printf(player, "Map Chck Records") CONS_Printf(player, "Map Chck Records")
for checksum, count in pairs(known) do for checksum, count in pairs(known) do
CONS_Printf(player, string.format("%s %s %d", map, checksum, count)) CONS_Printf(player, string.format("%s %s %d", G_BuildMapName(mapnum), checksum, count))
end end
end) end)
COM_AddCommand("lb_download_live_records", function(player, filename)
if not filename then
CONS_Printf(player, "Usage: lb_download_live_records <filename>")
return
end
if filename:sub(#filename-3) != ".txt" then
filename = $..".txt"
end
dumpStoreToFile(filename, LiveStore)
end, COM_LOCAL)
-- Load the livestore -- Load the livestore
if isserver then if isserver then
LiveStore = loadStoreFile(LEADERBOARD_FILE) LiveStore = loadStoreFile(LEADERBOARD_FILE)

View File

@ -661,7 +661,7 @@ local function moveRecords(player, from_map, from_checksum, to_map, to_checksum)
local from = { local from = {
["id"] = mapnumFromExtended(from_map), ["id"] = mapnumFromExtended(from_map),
["checksum"] = from_checksum ["checksum"] = from_checksum:lower()
} }
local to = { local to = {
@ -670,15 +670,29 @@ local function moveRecords(player, from_map, from_checksum, to_map, to_checksum)
to.checksum = to_checksum or mapChecksum(to.id) to.checksum = to_checksum or mapChecksum(to.id)
if not to.checksum then if not to.checksum then
CONS_Printf(player, string.format("error: '%s' is missing; provide to_checksum to continue", to.id)) CONS_Printf(player, string.format("error: %s is not loaded; provide to_checksum to continue", to_map:upper()))
return return
end end
if #to.checksum != 4 or to.checksum:match("[^a-f0-9]") then
CONS_Printf(player, string.format("error: %s is an invalid checksum; checksums are of length 4 and can contain only 0-9a-f", to.checksum))
return
end
to.checksum = $:lower()
local mapRecords = GetMapRecords(from.id, from.checksum, F_SPBATK | F_SPBBIG | F_SPBEXP)
local recordCount = 0
for mode, records in pairs(mapRecords) do
recordCount = $ + #records
end
MoveRecords(from, to, ST_SEP)
CONS_Printf( CONS_Printf(
player, player,
string.format( string.format(
"%d records have been moved from %s %s to %s %s", "%d records have been moved from\x82 %s %s\x80 to\x88 %s %s",
MoveRecords(from, to, ST_SEP), recordCount,
from_map, from.checksum, from_map, from.checksum,
to_map, to.checksum to_map, to.checksum
) )
@ -686,7 +700,7 @@ local function moveRecords(player, from_map, from_checksum, to_map, to_checksum)
CONS_Printf(player, "Please repack coldstore and restart the server for changes to take effect.") CONS_Printf(player, "Please repack coldstore and restart the server for changes to take effect.")
end end
COM_AddCommand("lb_move_records", moveRecords) COM_AddCommand("lb_move_records", moveRecords, COM_ADMIN)
--DEBUGGING --DEBUGGING
--local function printTable(tb) --local function printTable(tb)
@ -1032,7 +1046,7 @@ local function drawScoreboard(v, player)
cachePatches(v) cachePatches(v)
local gui = cv_gui.value local gui = cv_gui.value or drawState == DS_BROWSER
-- Force enable gui at start and end of the race -- Force enable gui at start and end of the race
if leveltime < START_TIME or player.exiting or player.lives == 0 then if leveltime < START_TIME or player.exiting or player.lives == 0 then
@ -1041,7 +1055,6 @@ local function drawScoreboard(v, player)
if gui then if gui then
stateFunctions[drawState](v, player, ScoreTable, gui) stateFunctions[drawState](v, player, ScoreTable, gui)
end
local pos = 0 local pos = 0
-- Draw current active modes bottom left -- Draw current active modes bottom left
@ -1049,6 +1062,7 @@ local function drawScoreboard(v, player)
pos = drawMode(v, pos, F_SPBBIG) pos = drawMode(v, pos, F_SPBBIG)
pos = drawMode(v, pos, F_SPBEXP) pos = drawMode(v, pos, F_SPBEXP)
end end
end
hud.add(drawScoreboard, "game") hud.add(drawScoreboard, "game")
function cachePatches(v) function cachePatches(v)
@ -1197,12 +1211,12 @@ local function saveTime(player)
end end
-- DEBUGGING -- DEBUGGING
local function saveLeaderboard(player, ...) --local function saveLeaderboard(player, ...)
TimeFinished = tonumber(... or player.realtime) -- TimeFinished = tonumber(... or player.realtime)
splits = {1000, 2000, 3000} -- splits = {1000, 2000, 3000}
saveTime(player) -- saveTime(player)
end --end
COM_AddCommand("save", saveLeaderboard) --COM_AddCommand("save", saveLeaderboard)
local function regLap(player) local function regLap(player)
if player.laps > prevLap and TimeFinished == 0 then if player.laps > prevLap and TimeFinished == 0 then

View File

@ -1,14 +1,22 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import sys import sys
from os import linesep from os import path
linesep = "\n"
if len(sys.argv) != 4 or not sys.argv[1] or not sys.argv[2] or not sys.argv[3]: if len(sys.argv) != 3 or not sys.argv[1] or not sys.argv[2]:
print("Usage: coldstore.py <leaderboard.txt> <coldstore.txt> <leaderboard_records.lua>") print("Usage: coldstore.py <game_directory> <leaderboard_records.lua>")
print("\t<game_directory>\t\tthe game directory where wads and luafiles reside. Usually at '$HOME/.srb2kart'.")
print("\t<leaderboard_records.lua>\tthe output name for the records packed lua file. It will be saved within <game_directory>.")
quit() quit()
leaderboard_txt = sys.argv[1] if not sys.argv[2].endswith(".lua"):
coldstore_txt = sys.argv[2] print("{} must end with .lua".format(sys.argv[2]))
records_lua = sys.argv[3] quit()
game_dir = sys.argv[1]
leaderboard_txt = path.join(game_dir, "luafiles", "leaderboard.txt")
coldstore_txt = path.join(game_dir, "luafiles", "leaderboard.coldstore.txt")
records_lua = path.join(game_dir, sys.argv[2])
def ParseScore(score): def ParseScore(score):
# Map Name Skin Color Time Splits Flags Stat # Map Name Skin Color Time Splits Flags Stat
@ -40,9 +48,15 @@ def SameScore(a, b):
def LoadRecordsFromFile(path): def LoadRecordsFromFile(path):
records = [] records = []
try:
with open(path, "r") as f: with open(path, "r") as f:
for line in f.readlines(): for line in f.readlines():
records.append(ParseScore(line.strip())) line = line.strip()
if line != "":
records.append(ParseScore(line))
except FileNotFoundError:
pass
return records return records
def AddScore(records, score): def AddScore(records, score):