from data.cat import Cat from systems.ui import clear, title from systems.world import shelter, house, shop import systems.ui as ui import data.save import data.text import os import json import traceback import base64 import time class Game: def __init__(self): self.cat = None def settings(self): while True: match ui.select( "Please choose an option", ["Prepare for savefile transfer", "Back"] ): case "Back": return False case "Prepare for savefile transfer": print( "This tool is for transfering your savefile to another device without causing the tamper detection." ) print( "If you confirm, the game will save and then exit, at this point you will copy your game files and saves folder over." ) print( "DO NOT RELAUNCH THE GAME before copying or it will undo this tool" ) if ui.confirm(): data.save.save(self.cat) return True return False def options_menu(self): options = ["Back"] if not os.path.exists("WEB_VERSION"): options[0:0] = [ # AI came up with this, what the heck is [0:0] "Save", "Save and quit", "Quit", "Settings", ] else: options[0:0] = ["Save"] while True: match ui.select( "Please choose an option", options, ): case "Save": data.save.save(self.cat) case "Save and quit": print("Goodbye!") data.save.save(self.cat) return True case "Quit": if ui.confirm("Are you sure you want to quit without saving?"): print("Goodbye!") return True case "Settings": if self.settings(): return True case "Back": return False def new_game(self): self.cat = shelter() if not os.path.exists("WEB_VERSION"): print("Saving...") data.save.save(self.cat) print("Save complete.") self.game_loop() # TODO: Add way to make money def game_loop(self): self.cat.apply_decay() self.cat.last_login = time.time() ui.current_cat = self.cat while True: match ui.select( "Please choose an option", ["Go to your house", "Go to the shop", "Options"], ): case "Go to your house": house(self.cat) case "Go to the shop": shop(self.cat) case "Options": if self.options_menu(): return case _: return def load_game(self): if os.path.exists("WEB_VERSION"): print( "Please paste your savefile on the next line, DO NOT USE CTRL+V, instead, right click and click paste. Make sure to not paste the quotes surrounding it if you copied those. Press enter to cancel." ) savetext = ui.text("Enter here:") if savetext: try: self.cat = Cat(**json.loads(base64.b64decode(savetext).decode())) except: print( "The savefile you gave was unable to load, please make sure you pasted correctly. Otherwise, it may have broken." ) else: print( f"Savefile loaded successfully! Continuing save with {self.cat.name}." ) return True return False save = "saves/" + ui.select( "Please choose a savefile to load", os.listdir("saves") ) try: self.cat = data.save.load(save) except: print("The savefile you selected was unable to load, it may be corrupt.") return False else: print( f"Savefile loaded successfully! Continuing save with {self.cat.name}." ) return True def run(self): title() if os.path.exists("WEB_VERSION"): print( f"This is a web version of {data.text.GAME_NAME}, here is some important info. To anyone outside of Germany, this game is running on a cheap VPS I got, the company didn't have any US locations available, so I had to get a Germany one, sorry for the high ping (I also have to deal with it, I'm in the US)\nPls don't hack this" ) print( "Just a recommendation, don't press any keys with CTRL, it will probably break something. If something weird happens, reload." ) print( "By weird, I mean, skipped dialog, crashes, skipping stuff, and breaking a ton, don't click CTRL+C (CTRL+A also seems to end the game for some reason. IDK why. Some other keys might also.)" ) if os.path.exists("debug.json"): bypass_tamper_check = False debug_config = None with open("debug.json", "r") as f: content = f.read() if content.strip(): debug_config = json.loads(content) if debug_config: if debug_config.get("bypass_tamper_check_message", None): if ( debug_config["bypass_tamper_check_message"] == data.text.BYPASS_TAMPER_CHECK_MESSAGE ): if debug_config.get("bypass_tamper_check_enable", False): bypass_tamper_check = True if debug_config.get("auto_load_savefile", None): try: self.cat = data.save.load( debug_config["auto_load_savefile"], bypass_tamper_check=bypass_tamper_check, ) self.game_loop() except: print( "There was an error loading the autoload savefile, please check your configuration." ) else: print(f"{self.cat.name} says bye") return options = ["New Game", "Release Notes", "Credits"] if os.path.exists("saves") or os.path.exists("WEB_VERSION"): options.insert(0, "Load Game") if not os.path.exists("WEB_VERSION"): options.append("Quit") print(f"Welcome to {data.text.GAME_NAME}") while True: choice = ui.select("Please choose an option", choices=options) if choice == "New Game": self.new_game() elif choice == "Load Game": if self.load_game(): self.game_loop() elif choice == "Quit": return True elif choice == "Release Notes": print() with open("RELEASE_NOTES.txt", "r") as f: release_notes = f.read() print(release_notes.strip()) print() elif choice == "Credits": print() with open("CREDITS.txt", "r") as f: credits = f.read() print(credits.strip()) print() if __name__ == "__main__": try: game = Game() result = game.run() except: # horrible coding right here print("Developer stuff incoming, if you can, tell me what this says:") traceback.print_exc() print( "Welp, seems that the game crashed, idk why. A common cause of this is pressing CTRL+C, which will cancel some UI stuff and just break the game. If you're on the desktop version, reopen it, if you're on the web version, reload, and don't use CTRL+C.\nOtherwise, great job! You found an issue in the game! If you can, please tell me." ) print( "Take a moment to screenshot the error or write it down or something if you can send it to me, and:" ) ui.press_any_key_to_continue( "Press any key to quit/do nothing if you're on the web version." ) else: if not result: print( "I think you did CTRL+C? I said not to I think. Well, here you are! Great job, not following instructions, I said it for a reason." )