# 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