100 lines
3.6 KiB
Python
100 lines
3.6 KiB
Python
# 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
|
|
|