From f502b21183d307fcab9b353aa18609d15c3547f1 Mon Sep 17 00:00:00 2001 From: Viljami Ilola <+@hix.fi> Date: Thu, 28 Mar 2024 13:54:00 +0200 Subject: hiscores: loading, saving, screen --- src/sliceitoff/game/__init__.py | 3 -- src/sliceitoff/game/game.py | 33 +++++++++++++++------- src/sliceitoff/game/hiscore.py | 44 ----------------------------- src/sliceitoff/game/initials.py | 44 +++++++++++++++++++++++++++++ src/sliceitoff/game/show.py | 7 +++-- src/sliceitoff/hiscores/__init__.py | 1 + src/sliceitoff/hiscores/hiscores.py | 55 +++++++++++++++++++++++++++++++++++++ src/sliceitoff/screens/__init__.py | 3 +- src/sliceitoff/screens/hiscore.py | 14 ---------- src/sliceitoff/screens/hiscores.py | 9 ++++++ src/sliceitoff/screens/initials.py | 14 ++++++++++ 11 files changed, 152 insertions(+), 75 deletions(-) delete mode 100644 src/sliceitoff/game/hiscore.py create mode 100644 src/sliceitoff/game/initials.py create mode 100644 src/sliceitoff/hiscores/__init__.py create mode 100644 src/sliceitoff/hiscores/hiscores.py delete mode 100644 src/sliceitoff/screens/hiscore.py create mode 100644 src/sliceitoff/screens/hiscores.py create mode 100644 src/sliceitoff/screens/initials.py diff --git a/src/sliceitoff/game/__init__.py b/src/sliceitoff/game/__init__.py index cf0da1e..a2771db 100644 --- a/src/sliceitoff/game/__init__.py +++ b/src/sliceitoff/game/__init__.py @@ -1,4 +1 @@ from .game import Game -from .gameplay import Gameplay -from .level import Level -from .show import Show diff --git a/src/sliceitoff/game/game.py b/src/sliceitoff/game/game.py index fd796e9..0b67d2f 100644 --- a/src/sliceitoff/game/game.py +++ b/src/sliceitoff/game/game.py @@ -9,11 +9,12 @@ import pygame from display import Display from images import Images, Fonts from stats import Stats -from screens import welcome_screen +from screens import welcome_screen, hiscores_screen +from hiscores import HiScores from .level import Level from .show import Show -from .hiscore import HiScore +from .initials import Initials class Game: def __init__(self): @@ -25,12 +26,21 @@ class Game: Fonts.load_fonts( Path(__file__).parent.parent.resolve() ) + self.hiscores = HiScores() + def welcome(self): ws = Show(welcome_screen()) dt = 0 while ws.step(dt): dt = self.clock.tick() - self.display.update( [ws.sprites] ) + self.display.update( [ws] ) + + def show_highscores(self): + his = Show(hiscores_screen(str(self.hiscores))) + dt = 0 + while his.step(dt): + dt = self.clock.tick() + self.display.update( [his] ) def newgame(self): Stats.new_game() @@ -43,18 +53,21 @@ class Game: if Stats.lives: Stats.level_up() - def hiscore(self): - hs = HiScore() - dt = 0 - while hs.step(): + def initials(self): + initials = Initials() + dt = 0 + while initials.step(): dt = self.clock.tick() - # hs.update(dt = dt) - self.display.update([hs]) + self.display.update([initials]) + return initials.name def run(self): self.welcome() self.newgame() - self.hiscore() + if self.hiscores.high_enough(Stats.score): + self.hiscores.add( Stats.score, self.initials()) + self.show_highscores() + def __del__(self): pygame.quit() diff --git a/src/sliceitoff/game/hiscore.py b/src/sliceitoff/game/hiscore.py deleted file mode 100644 index 734ad5e..0000000 --- a/src/sliceitoff/game/hiscore.py +++ /dev/null @@ -1,44 +0,0 @@ -import pygame - -from screens import hiscore_screen - -class HiScore(pygame.sprite.Group): - def __init__(self): - super().__init__() - self.add(hiscore_screen("")) - self.name = "" - - def update(self, **kwargs): - super().update(**kwargs) - - def step(self): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key in ( - pygame.K_ESCAPE, - pygame.K_KP_ENTER, - pygame.K_RETURN): - return False - if event.key in ( - pygame.K_RSHIFT, - pygame.K_LSHIFT, - pygame.K_RCTRL, - pygame.K_LCTRL, - pygame.K_RALT, - pygame.K_LALT, - pygame.K_RMETA, - pygame.K_LMETA, - pygame.K_LSUPER, - pygame.K_RSUPER, - pygame.K_SPACE): - continue - if event.key in (pygame.K_BACKSPACE, pygame.K_DELETE): - self.name = self.name [:-1] - elif pygame.key.name(event.key): - self.name += pygame.key.name(event.key)[0].upper() - self.name = self.name[:8] - self.empty() - self.add(hiscore_screen(self.name)) - return True diff --git a/src/sliceitoff/game/initials.py b/src/sliceitoff/game/initials.py new file mode 100644 index 0000000..5b25195 --- /dev/null +++ b/src/sliceitoff/game/initials.py @@ -0,0 +1,44 @@ +import pygame + +from screens import initials_screen + +class Initials(pygame.sprite.Group): + def __init__(self): + super().__init__() + self.add(initials_screen("")) + self.name = "" + + def update(self, **kwargs): + super().update(**kwargs) + + def step(self): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key in ( + pygame.K_ESCAPE, + pygame.K_KP_ENTER, + pygame.K_RETURN): + return False + if event.key in ( + pygame.K_RSHIFT, + pygame.K_LSHIFT, + pygame.K_RCTRL, + pygame.K_LCTRL, + pygame.K_RALT, + pygame.K_LALT, + pygame.K_RMETA, + pygame.K_LMETA, + pygame.K_LSUPER, + pygame.K_RSUPER, + pygame.K_SPACE): + continue + if event.key in (pygame.K_BACKSPACE, pygame.K_DELETE): + self.name = self.name [:-1] + elif pygame.key.name(event.key): + self.name += pygame.key.name(event.key)[0].upper() + self.name = self.name[:8] + self.empty() + self.add(initials_screen(self.name)) + return True diff --git a/src/sliceitoff/game/show.py b/src/sliceitoff/game/show.py index 50ed0ba..07146c3 100644 --- a/src/sliceitoff/game/show.py +++ b/src/sliceitoff/game/show.py @@ -2,10 +2,11 @@ import pygame from .anykey import anykey -class Show: +class Show(pygame.sprite.Group): """ To show some sprites and quit on any key """ def __init__(self, sprites = []): - self.sprites = sprites + super().__init__() + self.add(sprites) self.fadeout = 1_000 self.timeout = 5_000 @@ -17,7 +18,7 @@ class Show: if anykey(): return False self.fadeout -= dt - self.sprites.update(explode=dt) + self.update(explode=dt) return True if anykey(): diff --git a/src/sliceitoff/hiscores/__init__.py b/src/sliceitoff/hiscores/__init__.py new file mode 100644 index 0000000..f3d7811 --- /dev/null +++ b/src/sliceitoff/hiscores/__init__.py @@ -0,0 +1 @@ +from .hiscores import HiScores diff --git a/src/sliceitoff/hiscores/hiscores.py b/src/sliceitoff/hiscores/hiscores.py new file mode 100644 index 0000000..098f0e3 --- /dev/null +++ b/src/sliceitoff/hiscores/hiscores.py @@ -0,0 +1,55 @@ +import os + +MAX_HIGHSCORES = 20 + +class HiScores: + def __init__(self): + self.table=[] + self.config_filename = os.path.join( + os.getenv('HOME'), + ".config", + "sliceitoffrc") + if not os.path.isfile(self.config_filename): + self.table=[(0,"") for _ in range(MAX_HIGHSCORES)] + return + with open(self.config_filename, "r") as config_file: + for line in config_file: + option, value = line.split('=') + if option == 'hiscore': + score, name = value.split('!') + self.add(int(score.strip()),name.strip()) + if len(self.table)