# HG changeset patch # User Simon Cross # Date 1259430822 0 # Node ID 296c73dcd2866364f09db4ccb5ac1309adb2e395 # Parent 46fa3cdfddf483f7b57a7e1681f9996d6ca717d8 Add high score dialog to main menu. diff -r 46fa3cdfddf4 -r 296c73dcd286 gamelib/engine.py --- 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) diff -r 46fa3cdfddf4 -r 296c73dcd286 gamelib/gameover.py --- 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)) + diff -r 46fa3cdfddf4 -r 296c73dcd286 gamelib/mainmenu.py --- 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