changeset 555:296c73dcd286

Add high score dialog to main menu.
author Simon Cross <hodgestar@gmail.com>
date Sat, 28 Nov 2009 17:53:42 +0000
parents 46fa3cdfddf4
children 46f6f1a98f3f
files gamelib/engine.py gamelib/gameover.py gamelib/mainmenu.py
diffstat 3 files changed, 64 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/gamelib/engine.py	Sat Nov 28 17:53:25 2009 +0000
+++ b/gamelib/engine.py	Sat Nov 28 17:53:42 2009 +0000
@@ -48,7 +48,6 @@
 
     def set_main_menu(self):
         """Open the main menu"""
-        self.scoreboard = gameover.ScoreTable(self.level)
         main_menu = mainmenu.make_main_menu(self.level)
         self.open_window(main_menu)
 
@@ -60,8 +59,7 @@
     def create_game_over(self):
         """Create and open the Game Over window"""
         level = self.gameboard.level
-        game_over = gameover.create_game_over(self.gameboard,
-                self.scoreboard[level.level_name], level)
+        game_over = gameover.create_game_over(self.gameboard, level)
         self.gameboard = None
         self.open_window(game_over)
 
--- a/gamelib/gameover.py	Sat Nov 28 17:53:25 2009 +0000
+++ b/gamelib/gameover.py	Sat Nov 28 17:53:42 2009 +0000
@@ -1,6 +1,6 @@
 """The Game Over Screen"""
-import tempfile
 import random
+import os
 
 from pgu import gui
 from pgu.high import Highs
@@ -9,6 +9,7 @@
 import engine
 import constants
 import imagecache
+import config
 
 WON, LOST, LEFT = range(3)
 
@@ -34,21 +35,29 @@
 
 def ScoreTable(level):
     """Create and initialise a score table"""
-    # We need a true file, so load will work, but, as we never save,
-    # the deletion doesn't bother us.
-    our_scores = Highs(tempfile.NamedTemporaryFile(), 4)
-    #for mode in constants.TURN_LIMITS:
-    #    for score in range(700,1000,100):
-    #        our_scores[mode].submit(score, 'No-one', None)
-    for score in range(700,1000,100):
-        our_scores[level.level_name].submit(score, 'No-one', None)
-    return our_scores
+    score_path = os.path.join(config.config.prefs_folder, "highscores.dat")
+    all_scores = Highs(score_path, 4)
+    all_scores.load()
+    level_scores = all_scores[level.level_name]
+
+    if not list(level_scores):
+        authors = [auth[2] for auth in constants.AUTHORS]
+        scores = [700+i*100 for i in range(len(authors))]
+        random.shuffle(scores)
 
-def create_game_over(gameboard, scores, level):
+        for auth, score in zip(authors, scores):
+            level_scores.submit(score, auth, None)
+
+        level_scores.save()
+
+    return level_scores
+
+def create_game_over(gameboard, level):
     """Create a game over screen"""
-    game_over = GameOver(gameboard, scores, level)
+    game_over = GameOver(gameboard, level)
     return GameOverContainer(game_over, align=0, valign=0)
 
+
 class GameOverContainer(gui.Container):
     def __init__(self, game_over, *args, **kwargs):
         gui.Container.__init__(self, *args, **kwargs)
@@ -68,10 +77,12 @@
         pygame.display.get_surface().blit(self.splash, (0, 0))
         gui.Container.paint(self, s)
 
+
 class GameOver(gui.Table):
 
-    def __init__(self, gameboard, scoreboard, level, **params):
+    def __init__(self, gameboard, level, **params):
         gui.Table.__init__(self, **params)
+        scoreboard = ScoreTable(level)
 
         def return_pressed():
             pygame.event.post(engine.GO_MAIN_MENU)
@@ -126,6 +137,7 @@
         self.td(gui.Label("Final score : %d" % score,
             color=constants.FG_COLOR), colspan=3)
         if made_list:
+            scoreboard.save()
             self.tr()
             if self.survived == WON:
                 self.td(gui.Label("You made the high scores",
@@ -160,3 +172,20 @@
     def add_spacer(self, height=5):
         self.tr()
         self.td(gui.Spacer(0, height), colspan=3)
+
+
+class Scoreboard(gui.Table):
+
+    def __init__(self, level, **params):
+        gui.Table.__init__(self, **params)
+
+        scoreboard = ScoreTable(level)
+
+        self.tr()
+        self.td(gui.Label('Level: %s' % level.level_name, colspan=3))
+
+        for highscore in scoreboard:
+            self.tr()
+            self.td(gui.Label(highscore.name), colspan=2)
+            self.td(gui.Label('%d' % highscore.score))
+
--- a/gamelib/mainmenu.py	Sat Nov 28 17:53:25 2009 +0000
+++ b/gamelib/mainmenu.py	Sat Nov 28 17:53:42 2009 +0000
@@ -6,6 +6,7 @@
 import engine
 import imagecache
 import gameboard
+import gameover
 import savegame
 import loadlevel
 
@@ -32,7 +33,7 @@
     def __init__(self, level, **params):
         gui.Table.__init__(self, **params)
         self.mode = None
-        self.level_name = level.level_name
+        self.level = level
 
         def fullscreen_toggled():
             pygame.display.toggle_fullscreen()
@@ -46,13 +47,18 @@
         def choose_level():
             def load_func(new_level):
                 pygame.event.post(pygame.event.Event(engine.DO_LOAD_LEVEL, level=new_level))
-                self.level_name = new_level.level_name
+                self.level = new_level
                 self.redraw()
             loadlevel.LoadLevelDialog(level, load_func).open()
 
         def load_game():
             savegame.RestoreDialog(gameboard.GameBoard.restore_game).open()
 
+        def scores_pressed():
+            scoreboard = gameover.Scoreboard(self.level)
+            title = gui.Label("High Scores for Level %s" % self.level.level_name)
+            gui.Dialog(title, scoreboard).open()
+
         def help_pressed():
             pygame.event.post(engine.GO_HELP_SCREEN)
 
@@ -79,23 +85,26 @@
         self.tr()
         self.td(loadgame_button, **td_kwargs)
 
-        quit_button = gui.Button("Quit")
-        quit_button.connect(gui.CLICK, quit_pressed)
-
         help_button = gui.Button("Instructions")
         help_button.connect(gui.CLICK, help_pressed)
-
-        fullscreen_toggle = gui.Button("Toggle Fullscreen")
-        fullscreen_toggle.connect(gui.CLICK, fullscreen_toggled)
-
         self.tr()
         self.td(help_button, **td_kwargs)
 
+        scores_button = gui.Button("High Scores")
+        scores_button.connect(gui.CLICK, scores_pressed)
+        self.tr()
+        self.td(scores_button, **td_kwargs)
+
+        quit_button = gui.Button("Quit")
+        quit_button.connect(gui.CLICK, quit_pressed)
+        self.tr()
+        self.td(quit_button, **td_kwargs)
+
+        # fullscreen_toggle = gui.Button("Toggle Fullscreen")
+        # fullscreen_toggle.connect(gui.CLICK, fullscreen_toggled)
         # self.tr()
         # self.td(fullscreen_toggle, **td_kwargs)
 
-        self.tr()
-        self.td(quit_button, **td_kwargs)
 
     def redraw(self):
-        self.start_button.value = self.level_name
+        self.start_button.value = self.level.level_name