ccsave/ccsave/__init__.py

68 lines
2.3 KiB
Python

import base64
from ccsave.enums import Preferences, Upgrades, Achievements
from urllib.parse import quote_plus as encode
from urllib.parse import unquote_plus as decode
def number(s):
try:
return int(s)
except:
try:
return float(s)
except:
return 0
preferences = Preferences()
upgrades = Upgrades()
achievements = Achievements()
class Game:
# 00000000001111111
# 01234567890123456
ALL_ON_PREFERENCES = "11111111001111110"
def __init__(self,save="",savefile=""):
if savefile and not save:
with open(savefile) as f:
save = decode(f.read().strip())
elif not (savefile or save):
raise Exception("Either pass in a save or a save file!")
save = decode(save).split("!END!")[0]
self.data = base64.b64decode(save).decode("utf-8").split("|")
self.version = self.data.pop(0)
self.reserved = self.data.pop(0)
startdata = self.data.pop(0).split(";")
self.session_start, self.legacy_start, self.save_tstamp = (int(x)/1000 for x in [startdata.pop(0) for y in range(3)])
self.name = startdata.pop(0)
self.seed = startdata.pop(0)
self.preferences = self.data.pop(0)
self.cookie_data = self.data.pop(0)
self.building_data = self.data.pop(0)
self.upgrades = self.data.pop(0)
self.achievements = [x=="1" for x in self.data.pop(0)]
self.buffs = self.data.pop(0)
del self.data
self.preferences = [self.preferences[x]==self.ALL_ON_PREFERENCES[x] for x in range(len(self.preferences))]
def write_save(self,level=0):
if level==0:
return self.write_save(1)
elif level==3:
print("Warning: commented save not available")
return self.write_save(2)
ret = ""
ret += self.version+"|" # Game version
ret += "|" # "//just in case we need some more stuff here"
ret += ";".join(str(int(round(x*1000))) for x in (self.session_start, self.legacy_start, self.save_tstamp))+";"+";".join((self.name, self.seed))+"|"
ret += "".join(self.ALL_ON_PREFERENCES[x] if self.preferences[x] else toggle(self.ALL_ON_PREFERENCES[x]) for x in range(len(self.preferences)))+"|"
ret += self.cookie_data+"|"
ret += self.building_data+"|"
ret += self.upgrades+"|"
ret += " ".strip().join("1" if self.achievements[x] else "0" for x in range(achievements.v))+"|"
ret += self.buffs
if level==2:
return ret
ret = encode(base64.b64encode(ret.encode("utf-8"))+b"!END!")
return ret