Added Pet class and made a final demo

This commit is contained in:
Bo⋆˚✿˖° 2025-09-24 13:25:21 +02:00
parent faf0b2973c
commit b2470eac16
Signed by: FreedTapestry21
GPG key ID: 5E19D8C7E935C480
3 changed files with 71 additions and 21 deletions

View file

@ -48,6 +48,7 @@ class Instance:
def __init__(self): def __init__(self):
self.config_manager = system.ConfigurationManager() self.config_manager = system.ConfigurationManager()
self.logger = system.Logger(self.config_manager.config) 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) self.input_controller = system.InputController(self.config_manager.config["controls"], self.logger)
# Select display driver # Select display driver
@ -59,7 +60,7 @@ class Instance:
self.display = system.Display(self.display_driver, 128, 64, self.logger) self.display = system.Display(self.display_driver, 128, 64, self.logger)
self.ui = system.UserInterface(self.display, self.input_controller, 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 # Entry point
@ -76,7 +77,7 @@ if __name__ == '__main__':
import petcard import petcard
print("Starting Petcard") print("Starting Petcard")
instance = Instance() 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() app.run()
# #

View file

@ -9,7 +9,7 @@
# Importing libraries # Importing libraries
# #
import sys, json, machine import sys, json, machine, _thread, time, random
# Import SYSTEM module # Import SYSTEM module
import system import system
@ -20,9 +20,10 @@ import system
# Main system & application controller # Main system & application controller
class Application: 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.config_manager = config_manager
self.logger = logger self.logger = logger
self.pet = pet
self.display_driver = display_driver self.display_driver = display_driver
self.display = display self.display = display
self.input_controller = input_controller self.input_controller = input_controller
@ -33,10 +34,12 @@ class Application:
def initialize(self): def initialize(self):
self.logger.log("Initializing Petcard System...", 3) self.logger.log("Initializing Petcard System...", 3)
self.display.initialize() 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) self.logger.log("System initialization complete", 3)
# Main system loop # Main system loop
def run(self): def run(self):
try: try:
self.initialize() self.initialize()
@ -45,6 +48,7 @@ class Application:
system.MenuItem("Food", self._action, "f"), system.MenuItem("Food", self._action, "f"),
system.MenuItem("Drinks", self._action, "d"), system.MenuItem("Drinks", self._action, "d"),
system.MenuItem("Play", self._action, "p"), system.MenuItem("Play", self._action, "p"),
system.MenuItem("Save", self._save),
system.MenuItem("Sleep", self.power.sleep) system.MenuItem("Sleep", self.power.sleep)
] ]
@ -55,25 +59,32 @@ class Application:
selected_item = self.ui.show_menu(main_menu) selected_item = self.ui.show_menu(main_menu)
if selected_item: if selected_item:
result = selected_item.execute() result = selected_item.execute()
if result == "exit":
break
except Exception as e: except Exception as e:
self.logger.log(f"System error: {e}", 0) 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 # Defines what to do when a certain action is triggered
def _action(self, act): def _action(self, act):
if act == "f": if act == "f":
self.logger.log("Food!", 3) self.pet.nom("pancakes", 10)
elif act == "d": elif act == "d":
self.logger.log("Drink!", 3) self.pet.slurp("water", 10)
elif act == "p": elif act == "p":
self.logger.log("Play!", 3) self.pet.play("petted", 10)
else: self.logger.log(f"Invalid action {act}", 1) else: self.logger.log(f"Invalid action {act}", 1)
return 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) # End Of File (EOF)
# #

View file

@ -9,13 +9,7 @@
# Importing libraries # Importing libraries
# #
import sys import sys, time, json, machine, framebuf, ssd1306, random
import time
import json
import machine
import framebuf
import ssd1306
import _thread
# #
# Classes # Classes
@ -36,6 +30,13 @@ class ConfigurationManager:
print(f"Failed to load config: {e}") print(f"Failed to load config: {e}")
return self._get_default_config() 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 # Return default configuration
def _get_default_config(self): def _get_default_config(self):
return { return {
@ -49,6 +50,13 @@ class ConfigurationManager:
"down": "3", "down": "3",
"select": "1", "select": "1",
"back": "2" "back": "2"
},
"pet": {
"name": "Pet",
"level": 0,
"happiness": 100,
"hunger": 100,
"thirst": 100,
} }
} }
@ -57,7 +65,7 @@ class Logger:
def __init__(self, config): def __init__(self, config):
self.log_level = config.get("loglevel") self.log_level = config.get("loglevel")
self.logging_enabled = config.get("logging") 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): def log(self, message, log_level, ignore_console=False):
timestamp = self._get_timestamp() timestamp = self._get_timestamp()
@ -96,6 +104,33 @@ class Logger:
# Get configuration value # Get configuration value
def get(self, key, default=None): def get(self, key, default=None):
return self.config.get(key, default) 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 # Handles input from buttons/controls
class InputController: class InputController:
@ -311,7 +346,8 @@ class UserInterface:
# Handles power management # Handles power management
class Power: class Power:
def __init__(self, display, input_controller, logger): def __init__(self, config, display, input_controller, logger):
self.config = config
self.display = display self.display = display
self.input_controller = input_controller self.input_controller = input_controller
self.logger = logger self.logger = logger
@ -328,11 +364,13 @@ class Power:
self.logger.log("Returning from sleep mode", 4) self.logger.log("Returning from sleep mode", 4)
return return
def exit_system(self, message=""): def shutdown(self, message=""):
# Exit the system with optional message # Exit the system with optional message
if message: if message:
self.logger.log(message, 3) self.logger.log(message, 3)
self.logger.log("System shutting down...", 3) self.logger.log("System shutting down...", 3)
self.display.clear()
self.display.update()
machine.deepsleep() machine.deepsleep()
# #