From 52316347dabd330aa9d64f6881f7cea33bbed445 Mon Sep 17 00:00:00 2001 From: Not Date: Mon, 14 Nov 2022 17:53:40 +0100 Subject: [PATCH] add coldstore tool --- tools/coldstore.py | 94 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100755 tools/coldstore.py diff --git a/tools/coldstore.py b/tools/coldstore.py new file mode 100755 index 0000000..b4ee2c0 --- /dev/null +++ b/tools/coldstore.py @@ -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 ") + 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