add coldstore tool

This commit is contained in:
Not 2022-11-14 17:53:40 +01:00
parent 4a1e42c5cb
commit 52316347da
1 changed files with 94 additions and 0 deletions

94
tools/coldstore.py Executable file
View File

@ -0,0 +1,94 @@
#!/bin/python
import sys
from os import linesep
if len(sys.argv) != 4 or not sys.argv[1] or not sys.argv[2] or not sys.argv[3]:
print("Usage: coldstore.py <leaderboard.txt> <coldstore.txt> <leaderboard_records.lua>")
quit()
leaderboard_txt = sys.argv[1]
coldstore_txt = sys.argv[2]
records_lua = sys.argv[3]
def ParseScore(score):
# Map Name Skin Color Time Splits Flags Stat
split = score.split("\t")
return {
"map": split[0],
"name": split[1],
"skin": split[2],
"color": split[3],
"time": int(split[4]),
"splits": split[5],
"flags": int(split[6]),
"stat": split[7]
}
# Compare scores
def CompareScore(a, b):
return a["time"] < b["time"]
F_SEP = 0xF
def SameScore(a, b):
return a["name"] == b["name"] and (a["flags"] & F_SEP) == (b["flags"] & F_SEP)
def LoadRecordsFromFile(path):
records = []
with open(path, "r") as f:
for line in f.readlines():
records.append(ParseScore(line.strip()))
return records
def AddScore(records, score):
mapid = score["map"]
mapTable = records.get(mapid) or []
for i in range(len(mapTable)):
scoreb = mapTable[i]
if SameScore(score, scoreb):
if CompareScore(score, scoreb):
mapTable[i] = score
records[mapid] = mapTable
return
mapTable.append(score)
records[mapid] = mapTable
# load leaderboard.txt and coldstore.txt
recordsList = LoadRecordsFromFile(leaderboard_txt)
recordsList.extend(LoadRecordsFromFile(coldstore_txt))
# construct the map tables
records = {}
for score in recordsList:
AddScore(records, score)
# convert records to flat list
recordsList = []
for mapTable in records.values():
for score in mapTable:
recordsList.append("\t".join([str(v) for v in list(score.values())]))
# truncate and write records to coldstore
with open(coldstore_txt, "w") as f:
for score in recordsList:
f.write(score + linesep)
luaA = """local ParseScore = lb_parse_score
local AddColdStore = lb_add_coldstore_record
local records = {
"""
luaB = """}
for _, str in ipairs(records) do
AddColdStore(ParseScore(str))
end
"""
# pack the records.lua file
with open(records_lua, "w") as f:
f.write(luaA)
for score in recordsList:
f.write("\"{}\",{}".format(score, linesep))
f.write(luaB)
# truncate leaderboard.txt
with open(leaderboard_txt, "w"): pass