Added Pet class and made a final demo
This commit is contained in:
parent
faf0b2973c
commit
b2470eac16
3 changed files with 71 additions and 21 deletions
5
main.py
5
main.py
|
@ -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()
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
29
petcard.py
29
petcard.py
|
@ -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)
|
||||||
#
|
#
|
58
system.py
58
system.py
|
@ -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()
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue