From b2470eac1631e24ff9e0dff5da199fba76e67f7c Mon Sep 17 00:00:00 2001 From: FreedTapestry21 Date: Wed, 24 Sep 2025 13:25:21 +0200 Subject: [PATCH] Added Pet class and made a final demo --- main.py | 5 +++-- petcard.py | 29 ++++++++++++++++++--------- system.py | 58 ++++++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 71 insertions(+), 21 deletions(-) diff --git a/main.py b/main.py index 057c770..2b23097 100644 --- a/main.py +++ b/main.py @@ -48,6 +48,7 @@ class Instance: def __init__(self): self.config_manager = system.ConfigurationManager() self.logger = system.Logger(self.config_manager.config) + self.pet = system.Pet(self.config_manager, self.logger) self.input_controller = system.InputController(self.config_manager.config["controls"], self.logger) # Select display driver @@ -59,7 +60,7 @@ class Instance: self.display = system.Display(self.display_driver, 128, 64, self.logger) self.ui = system.UserInterface(self.display, self.input_controller, self.logger) - self.power = system.Power(self.display, self.input_controller, self.logger) + self.power = system.Power(self.config_manager, self.display, self.input_controller, self.logger) # # Entry point @@ -76,7 +77,7 @@ if __name__ == '__main__': import petcard print("Starting Petcard") instance = Instance() - app = petcard.Application(instance.config_manager, instance.logger, instance.display_driver, instance.display, instance.input_controller, instance.ui, instance.power) + app = petcard.Application(instance.config_manager, instance.logger, instance.pet, instance.display_driver, instance.display, instance.input_controller, instance.ui, instance.power) app.run() # diff --git a/petcard.py b/petcard.py index 15b8919..1baa96a 100644 --- a/petcard.py +++ b/petcard.py @@ -9,7 +9,7 @@ # Importing libraries # -import sys, json, machine +import sys, json, machine, _thread, time, random # Import SYSTEM module import system @@ -20,9 +20,10 @@ import system # Main system & application controller class Application: - def __init__(self, config_manager, logger, display_driver, display, input_controller, ui, power): + def __init__(self, config_manager, logger, pet, display_driver, display, input_controller, ui, power): self.config_manager = config_manager self.logger = logger + self.pet = pet self.display_driver = display_driver self.display = display self.input_controller = input_controller @@ -33,10 +34,12 @@ class Application: def initialize(self): self.logger.log("Initializing Petcard System...", 3) self.display.initialize() + self.logger.log("Initializing Petcard health manager...", 3) + _thread.start_new_thread(self._pet_health_manager, ()) self.logger.log("System initialization complete", 3) # Main system loop - def run(self): + def run(self): try: self.initialize() @@ -45,6 +48,7 @@ class Application: system.MenuItem("Food", self._action, "f"), system.MenuItem("Drinks", self._action, "d"), system.MenuItem("Play", self._action, "p"), + system.MenuItem("Save", self._save), system.MenuItem("Sleep", self.power.sleep) ] @@ -55,25 +59,32 @@ class Application: selected_item = self.ui.show_menu(main_menu) if selected_item: result = selected_item.execute() - if result == "exit": - break except Exception as e: self.logger.log(f"System error: {e}", 0) - self.power.exit_system("System encountered an error") + self.power.shutdown("System encountered an error") # Defines what to do when a certain action is triggered def _action(self, act): if act == "f": - self.logger.log("Food!", 3) + self.pet.nom("pancakes", 10) elif act == "d": - self.logger.log("Drink!", 3) + self.pet.slurp("water", 10) elif act == "p": - self.logger.log("Play!", 3) + self.pet.play("petted", 10) else: self.logger.log(f"Invalid action {act}", 1) return + def _save(self): + self.logger.log("Saving game progression...", 4) + self.config_manager.save_config() + self.logger.log("Game progression has been saved!", 4) + + def _pet_health_manager(self): + while True: + time.sleep(random.randint(10, 60)) + self.pet.wombicombi() # # End Of File (EOF) # \ No newline at end of file diff --git a/system.py b/system.py index 4290cbf..545bd11 100644 --- a/system.py +++ b/system.py @@ -9,13 +9,7 @@ # Importing libraries # -import sys -import time -import json -import machine -import framebuf -import ssd1306 -import _thread +import sys, time, json, machine, framebuf, ssd1306, random # # Classes @@ -36,6 +30,13 @@ class ConfigurationManager: print(f"Failed to load config: {e}") return self._get_default_config() + def save_config(self): + try: + with open(self.config_file, "w") as file: + json.dump(self.config, file) + except Exception as e: + print(f"Failed to save config: {e}") + # Return default configuration def _get_default_config(self): return { @@ -49,6 +50,13 @@ class ConfigurationManager: "down": "3", "select": "1", "back": "2" + }, + "pet": { + "name": "Pet", + "level": 0, + "happiness": 100, + "hunger": 100, + "thirst": 100, } } @@ -57,7 +65,7 @@ class Logger: def __init__(self, config): self.log_level = config.get("loglevel") self.logging_enabled = config.get("logging") - self.log_file = config.get("logfile", "system.log") + self.log_file = config.get("logfile") def log(self, message, log_level, ignore_console=False): timestamp = self._get_timestamp() @@ -96,6 +104,33 @@ class Logger: # Get configuration value def get(self, key, default=None): return self.config.get(key, default) + +class Pet: + def __init__(self, config, logger): + self.config = config + self.logger = logger + + def play(self, name, amount): + self.config.config["pet"]["happiness"] = self.config.config["pet"]["happiness"] + (amount * ((self.config.config["pet"]["level"] / 100)+1)) + self.logger.log(f"You {self.config.config['pet']['name']} {name} and gained {str(amount)} of happiness! Your happiness bar is now at {str(self.config.config['pet']['happiness'])}!", 3) + + def nom(self, name, amount): + self.config.config["pet"]["hunger"] = self.config.config["pet"]["hunger"] + (amount * ((self.config.config["pet"]["level"] / 100)+1)) + self.logger.log(f"You fed {self.config.config['pet']['name']} {name} and gained {str(amount)} of food! Your food bar is now at {str(self.config.config['pet']['hunger'])}!", 3) + + def slurp(self, name, amount): + self.config.config["pet"]["thirst"] = self.config.config["pet"]["thirst"] + (amount * ((self.config.config["pet"]["level"] / 100)+1)) + self.logger.log(f"You gave {self.config.config['pet']['name']} {name} and gained {str(amount)} of hydration! Your hydration bar is now at {str(self.config.config['pet']['thirst'])}!", 3) + + def wombicombi(self): + self.logger.log("Health depletion triggered", 4) + self.config.config["pet"]["happiness"] = round(self.config.config["pet"]["happiness"] - ((100 - self.config.config["pet"]["level"]) * random.uniform(0.0, 0.2))) + self.config.config["pet"]["hunger"] = round(self.config.config["pet"]["hunger"] - ((100 - self.config.config["pet"]["level"]) * random.uniform(0.0, 0.2))) + self.config.config["pet"]["thirst"] = round(self.config.config["pet"]["thirst"] - ((100 - self.config.config["pet"]["level"]) * random.uniform(0.0, 0.2))) + self.logger.log(f"Health is now at the following values...", 4) + self.logger.log(f"Happiness: {self.config.config['pet']['happiness']}", 4) + self.logger.log(f"Food: {self.config.config['pet']['hunger']}", 4) + self.logger.log(f"Hydration: {self.config.config['pet']['thirst']}", 4) # Handles input from buttons/controls class InputController: @@ -311,7 +346,8 @@ class UserInterface: # Handles power management class Power: - def __init__(self, display, input_controller, logger): + def __init__(self, config, display, input_controller, logger): + self.config = config self.display = display self.input_controller = input_controller self.logger = logger @@ -328,11 +364,13 @@ class Power: self.logger.log("Returning from sleep mode", 4) return - def exit_system(self, message=""): + def shutdown(self, message=""): # Exit the system with optional message if message: self.logger.log(message, 3) self.logger.log("System shutting down...", 3) + self.display.clear() + self.display.update() machine.deepsleep() #