229 lines
8.9 KiB
Python
229 lines
8.9 KiB
Python
from data.cat import Cat
|
|
from systems.ui import clear, title
|
|
from systems.world import shelter, house, shop, work
|
|
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", "Go to work", "Options"],
|
|
):
|
|
case "Go to your house":
|
|
house(self.cat)
|
|
case "Go to the shop":
|
|
shop(self.cat)
|
|
case "Go to work":
|
|
work(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."
|
|
)
|