Fix hash debug menu+bypass hash in debug+new debug config system+shop+base for inventory system+what am i forgetting

This commit is contained in:
2026-04-13 17:45:29 -04:00
parent c92699888e
commit 4df79550ea
8 changed files with 118 additions and 20 deletions

2
.gitignore vendored
View File

@@ -192,4 +192,4 @@ cython_debug/
# Whiskerbound specific stuff
saves/
*test*
ENABLE DEBUG
debug.json

View File

@@ -5,7 +5,7 @@
"README.md": true,
".vscode/": true,
".venv/": true,
".ruff_cache/":true,
"*/__pycache__/":true
".ruff_cache/": true,
"*/__pycache__/": true
}
}

View File

@@ -1,8 +1,10 @@
class Cat:
def __init__(self, name, traits):
def __init__(self, name, traits, food, money, inventory):
self.name = name
self.traits = traits
self.food = 3
self.food = 0
self.money = 25
self.inventory = {}
def to_dict(self):
return vars(self)

View File

@@ -74,7 +74,7 @@ def save(cat):
json.dump(currentjson, f)
def load(filepath):
def load(filepath, bypass_tamper_check=False, force_punish=False):
punished = False
data_dir = get_data_dir()
hash_path = os.path.join(data_dir, "dont hurt cats.json")
@@ -97,6 +97,7 @@ def load(filepath):
with open(filepath) as f:
raw = json.load(f)
cat = Cat(**raw)
if punished:
punish(cat)
if punished or force_punish:
if not bypass_tamper_check:
punish(cat)
return cat

View File

@@ -29,3 +29,8 @@ CAT_PERSONALITIES = [
"just wants to be somewhere else",
]
CAT_EYE_COLORS = ["green", "yellow", "blue", "orange"]
SHOP_ITEMS = {"Food": 5}
BYPASS_TAMPER_CHECK_MESSAGE = "I truly understand that this is cheating and that it is ONLY for development and nothing else. I understand that it is mean to mess with my cat savefile and I apologize to my cat."

44
game.py
View File

@@ -1,9 +1,11 @@
from data.cat import Cat
from systems.ui import clear, title
from systems.world import shelter, house
from systems.world import shelter, house, shop
import systems.ui as ui
import data.save
import data.text
import os
import json
class Game:
@@ -62,24 +64,46 @@ class Game:
print("Save complete.")
self.game_loop()
# TODO: Add shop, make food buyable and add money system
def game_loop(self):
ui.current_cat = self.cat
while True:
match ui.select("Please choose an option", ["Go to your house", "Options"]):
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
def run(self):
if os.path.exists("ENABLE DEBUG"):
with open("ENABLE DEBUG", "r") as f:
file = f.read().strip()
if file:
self.cat = data.save.load(file)
self.game_loop()
print(f"{self.cat.name} says bye")
return
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", None):
if (
debug_config["bypass_tamper_check"]
== data.text.BYPASS_TAMPER_CHECK_MESSAGE
):
bypass_tamper_check = True
if debug_config.get("auto_load_savefile", None):
self.cat = data.save.load(
debug_config["auto_load_savefile"],
bypass_tamper_check=bypass_tamper_check,
)
self.game_loop()
print(f"{self.cat.name} says bye")
return
title()
options = ["New Game", "Quit"]
if os.path.exists("saves"):

View File

@@ -1,6 +1,11 @@
import os
import questionary
import sys
import data.save
import json
from data.cat import Cat
current_cat: Cat | None = None
def getch():
@@ -21,16 +26,38 @@ def getch():
termios.tcsetattr(fd, termios.TCSADRAIN, old)
def fix_hash():
data_dir = data.save.get_data_dir()
hash_path = os.path.join(data_dir, "dont hurt cats.json")
os.makedirs(data_dir, exist_ok=True)
if os.path.exists(hash_path):
with open(hash_path, "r") as f:
currentjson = json.load(f)
currentjson[f"saves/{current_cat.name}.kitten"] = data.save.hash_file(
f"saves/{current_cat.name}.kitten"
)
print(
f"Old hash: {currentjson.get(f"saves/{current_cat.name}.kitten")}. New hash: {currentjson[f"saves/{current_cat.name}.kitten"]}"
)
with open(hash_path, "w") as f:
json.dump(currentjson, f)
def debug_menu():
print("hi")
while True:
match select(
"choose ur way of breaking the game",
["Breakpoint", "Back"],
["Breakpoint", "Fix hash", "Back"],
hide_debug=True,
):
case "Breakpoint":
breakpoint()
case "Fix hash":
fix_hash()
print(
"If you see this message and theres no errors above I think it worked."
)
case "Back":
break
@@ -51,10 +78,12 @@ STYLE = questionary.Style(
]
)
Choice = questionary.Choice
def select(message, choices, hide_debug=False):
choices = list(choices).copy().copy().copy().copy().copy().copy() # yay!
if os.path.exists("ENABLE DEBUG") and hide_debug == False:
if os.path.exists("debug.json") and hide_debug == False:
if not "Debug Menu" in choices:
choices.append("Debug Menu")
choice = questionary.select(message, choices=choices, style=STYLE).ask()

View File

@@ -67,6 +67,43 @@ def shelter(include_welcome=True):
return Cat(name, traits)
def shop(cat: Cat):
print("Welcome to the shop")
while True:
print(f"You have ${cat.money}")
match ui.select("Please choose an option", ["Buy something", "Leave the shop"]):
case "Buy something":
item = ui.select(
"Please choose something to buy",
[
ui.Choice(title=f"{name} - ${price}", value=name)
for name, price in data.text.SHOP_ITEMS.items()
],
)
item_price = data.text.SHOP_ITEMS[item]
if item_price > cat.money:
print(
f"You don't have enough money to buy this! You need {item_price-cat.money} more dollars."
)
else:
if ui.confirm(
f"Are you sure you want to buy {item} for ${item_price}? You will have ${cat.money-item_price} left over."
):
cat.money -= item_price
cat.inventory[item] = cat.inventory.get(item, 0) + 1
print(f"You bought {item}.")
else:
print("Cancelled.")
# TODO: idea, each item, when selected in house storage menu, call a item menu thing thats specific for each item
# TODO: make toy mouse that increases happyness (so also add emotions and sicknesses maybe) but has a 25% chance of getting lost under the couch and makes the cat tired possibly
pass
case "Leave the shop":
print("Goodbye!")
break
def pet(cat: Cat):
print(f"Mash keys to pet {cat.name}, press enter when you're done.")
count = 0