YAP/gamestate.py

101 lines
3.6 KiB
Python
Raw Normal View History

2026-10-04 19:17:16 +02:00
# libraries
from datetime import timedelta
# project modules
import db_utils as db
import db_utils
from new_gui import *
# -----------------------------------------------------
# Enum and Tables
# -----------------------------------------------------
class State(Enum):
MENU = 0
PLAY = 1
PAUSE = 2
SELECT = 3
COMPLETE = 4
# ------------------------------------------------------
# Class GameState
# - Represents the game state (playing, pause, menu...)
# - creates and keeps the different views
# ------------------------------------------------------
class GameState:
def __init__(self):
self.running = True
self.state = State.MENU
self.level_state = None
# Game time keeping
self.play_start = 0
self.paused_time = 0
self.pause_start = 0
self.elapsed = 0
# Views
self.start_menu = self.create_start_menu()
self.pause_menu = self.create_pause_menu()
self.select_menu = self.create_select_menu()
# It will get created at the end of each level
self.completed_menu = None
def update(self, ticks):
# update elapsed playing time
if self.state == State.PLAY:
self.elapsed = ticks - self.play_start - self.paused_time
# If the current level has been completed. This block of code is executed ONCE with the last check of the if
if self.level_state != None and self.level_state.completed == True and self.state != State.COMPLETE:
# save total time inside the level state
self.level_state.final_time = self.elapsed
self.state = State.COMPLETE
self.completed_menu = self.create_completed_menu()
self.save_progress()
self.select_menu = self.create_select_menu()
def save_progress(self):
# Save progress in db and unlock next level
db.save_progress(self.level_state)
# Functions that create the views
def create_pause_menu(self):
menu = MenuPage(MenuType.PAUSE)
menu.add_top_text("Don't worry, the clock isn't ticking!")
menu.add_button("playing", ButtonTypes.RESUME)
menu.add_button("select_level", ButtonTypes.MENU)
return menu
def create_start_menu(self):
menu = MenuPage(MenuType.START)
menu.add_button("select_level", ButtonTypes.PLAY)
menu.add_button("delete", ButtonTypes.DELETE)
menu.add_button("quit_game", ButtonTypes.QUIT)
return menu
def create_completed_menu(self):
# Text with the time formatted
timer = timedelta(milliseconds=self.level_state.final_time)
text = f"Timer: {str(timer).split(".")[0]}"
menu = MenuPage(MenuType.COMPLETED)
menu.add_top_text("Play the level again to beat your time!")
menu.add_bottom_text(text)
menu.add_button("retry", ButtonTypes.RETRY)
menu.add_button("select_level", ButtonTypes.MENU)
return menu
def create_select_menu(self):
level_paths = db_utils.get_levels()
progress = db_utils.get_progress()
menu = Menu(MenuType.SELECT)
# Adding buttons based on level files
for info in zip(level_paths, progress):
# print(f"Path: {info[0]}, Completato:{info[1][0]}, Tempo:{info[1][1]}")
time_text = str(timedelta(milliseconds=info[1][1])).split(".")[0]
text = f"{info[0].name.split('.')[0].split('_')[1]} - {time_text}"
menu.add_entry(text, (info[0],info[1][0]), EntryState.UNLOCKED if int(info[1][0]) == 1 else EntryState.LOCKED)
return menu