changeset 548:27c09c58d89d

Remove gameboard and dialog event flow hacks.
author Simon Cross <hodgestar@gmail.com>
date Sat, 28 Nov 2009 11:25:56 +0000
parents 1456bf2ff02e
children 45e03793d41e
files gamelib/engine.py gamelib/gameboard.py gamelib/misc.py gamelib/toolbar.py
diffstat 4 files changed, 44 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/gamelib/engine.py	Sat Nov 28 11:12:45 2009 +0000
+++ b/gamelib/engine.py	Sat Nov 28 11:25:56 2009 +0000
@@ -1,7 +1,7 @@
 """Game engine and states."""
 from pgu.engine import Game, State, Quit
 import pygame
-from pygame.locals import USEREVENT, QUIT, KEYDOWN, K_ESCAPE, K_n, K_d, K_s, K_i
+from pygame.locals import USEREVENT, QUIT, KEYDOWN, K_ESCAPE, K_s, K_i
 
 import gameboard
 import gameover
@@ -10,7 +10,6 @@
 import mainmenu
 import helpscreen
 import level
-from misc import check_exit
 
 class Engine(Game):
     def __init__(self, main_app, level_name):
@@ -141,33 +140,20 @@
         # disable timer
         pygame.time.set_timer(MOVE_FOX_ID, 0)
         sound.background_music("daytime.ogg")
-        self.dialog = None
 
     def event(self, e):
-        if self.dialog and self.dialog.running:
-            if self.dialog.event(e):
-                return
-        elif self.dialog:
-            if self.dialog.do_quit:
-                self.dialog = None
-                self.game.gameboard.reset_states()
-                return GameOver(self.game)
-            self.dialog = None
-            return
         if events_equal(e, START_NIGHT):
             self.game.gameboard.reset_states()
             return NightState(self.game)
-        elif e.type is KEYDOWN and e.key == K_ESCAPE:
-            self.dialog = check_exit()
-        elif e.type is KEYDOWN and e.key == K_n:
-            return pygame.event.post(START_NIGHT)
+        elif events_equal(e, GO_GAME_OVER):
+            return GameOver(self.game)
         elif events_equal(e, GO_MAIN_MENU):
             return MainMenuState(self.game)
         elif e.type is DO_LOAD_SAVEGAME:
             self.game.switch_gameboard(e.gameboard)
             return
-        elif e.type is not QUIT:
-            self.game.main_app.event(e)
+
+        self.game.main_app.event(e)
 
     def paint(self, screen):
         self.game.main_app.paint(screen)
@@ -198,29 +184,19 @@
         self.dialog = None
 
     def event(self, e):
-        if self.dialog and self.dialog.running:
-            if self.dialog.event(e):
-                return
-        elif self.dialog:
-            if self.dialog.do_quit:
-                self.dialog = None
-                self.game.gameboard.reset_states()
-                return GameOver(self.game)
-            self.dialog=None
-            return
         if events_equal(e, START_DAY):
             if self.game.gameboard.level.is_game_over(self.game.gameboard):
                 return GameOver(self.game)
             return DayState(self.game)
-        elif (e.type is KEYDOWN and e.key == K_d) or \
-                events_equal(e, FAST_FORWARD):
+        elif events_equal(e, GO_GAME_OVER):
+            return GameOver(self.game)
+        elif events_equal(e, FAST_FORWARD):
             if self.cycle_time > FAST__SPEED:
                 self.cycle_time = FAST__SPEED
             else:
                 self.cycle_time = SLOW__SPEED
             pygame.time.set_timer(MOVE_FOX_ID, self.cycle_time)
-        elif e.type is KEYDOWN and e.key == K_ESCAPE:
-            self.dialog = check_exit()
+            return
         elif e.type is MOVE_FOX_ID:
             # ensure no timers trigger while we're running
             pygame.time.set_timer(MOVE_FOX_ID, 0)
@@ -240,8 +216,9 @@
             if time_left <= 0:
                 time_left = self.cycle_time
             pygame.time.set_timer(MOVE_FOX_ID, time_left)
-        elif e.type is not QUIT:
-            self.game.main_app.event(e)
+            return
+
+        self.game.main_app.event(e)
 
     def loop(self):
         self.game.gameboard.loop()
@@ -290,6 +267,7 @@
 START_NIGHT = pygame.event.Event(USEREVENT, name="START_NIGHT")
 GO_MAIN_MENU = pygame.event.Event(USEREVENT, name="GO_MAIN_MENU")
 GO_HELP_SCREEN = pygame.event.Event(USEREVENT, name="GO_HELP_SCREEN")
+GO_GAME_OVER = pygame.event.Event(USEREVENT, name="GO_GAME_OVER")
 FAST_FORWARD = pygame.event.Event(USEREVENT, name="FAST_FORWARD")
 MOVE_FOX_ID = USEREVENT + 1
 MOVE_FOXES = pygame.event.Event(MOVE_FOX_ID, name="MOVE_FOXES")
--- a/gamelib/gameboard.py	Sat Nov 28 11:12:45 2009 +0000
+++ b/gamelib/gameboard.py	Sat Nov 28 11:25:56 2009 +0000
@@ -3,7 +3,7 @@
 import pygame
 from pygame.locals import MOUSEBUTTONDOWN, MOUSEMOTION, KEYDOWN, K_UP, K_DOWN, \
         K_LEFT, K_RIGHT, KMOD_SHIFT, K_0, K_1, K_2, K_3, K_4, K_5, K_6, K_7, \
-        K_8, K_9, KMOD_CTRL, KMOD_ALT, KEYUP
+        K_8, K_9, K_ESCAPE, K_n, K_d, KMOD_CTRL, KMOD_ALT, KEYUP
 from pgu import gui
 
 import tiles
@@ -41,8 +41,7 @@
         elif e.type == MOUSEMOTION and self.gameboard.sprite_cursor:
             self.gameboard.update_sprite_cursor(e)
         else:
-            return self.gameboard.event(e)
-        return True
+            return False
 
 
 class AnimalPositionCache(object):
@@ -192,6 +191,15 @@
         tbl.td(self.toolbar, valign=-1)
         self.tvw = VidWidget(self, self.tv, width=width-constants.TOOLBAR_WIDTH, height=height)
         tbl.td(self.tvw)
+
+        # we should probably create a custom widget to be the top widget
+        # if we want to flow some events to the gameboard
+        def event(e):
+            if gui.Table.event(tbl, e):
+                return True
+            return self.event(e)
+        tbl.event = event
+
         self.top_widget = tbl
         self.redraw_counters()
 
@@ -820,7 +828,23 @@
         dialog = self.open_dialog(tbl, x=x, y=y)
 
     def event(self, e):
-        if e.type == KEYDOWN and e.key in [K_UP, K_DOWN, K_LEFT, K_RIGHT]:
+        if e.type == KEYDOWN and e.key == K_ESCAPE:
+            def sure(val):
+                if val:
+                    import engine
+                    pygame.event.post(engine.GO_GAME_OVER)
+            dialog = misc.CheckDialog(sure)
+            self.disp.open(dialog)
+            return True
+        elif e.type == KEYDOWN and e.key == K_n and self.day:
+            import engine
+            pygame.event.post(engine.START_NIGHT)
+            return True
+        elif e.type == KEYDOWN and e.key == K_d and self.night:
+            import engine
+            pygame.event.post(engine.FAST_FORWARD)
+            return True
+        elif e.type == KEYDOWN and e.key in [K_UP, K_DOWN, K_LEFT, K_RIGHT]:
             if e.key == K_UP:
                 self.tvw.move_view(0, -constants.TILE_DIMENSIONS[1])
             if e.key == K_DOWN:
--- a/gamelib/misc.py	Sat Nov 28 11:12:45 2009 +0000
+++ b/gamelib/misc.py	Sat Nov 28 11:25:56 2009 +0000
@@ -82,10 +82,9 @@
             roll -= weight
 
 class CheckDialog(gui.Dialog):
-    def __init__(self, **params):
+    def __init__(self, sure_func, **params):
+        self._sure_func = sure_func
         title = gui.Label('Are You Sure?')
-        self.do_quit = False
-        self.running = True
         tbl = gui.Table()
         tbl.tr()
         tbl.td(gui.Label("Do you REALLY want to exit this game?"), colspan=2)
@@ -101,8 +100,7 @@
         gui.Dialog.__init__(self, title, tbl, **params)
 
     def clicked(self, val):
-        self.do_quit = val
-        self.running = False
+        self._sure_func(val)
         self.close()
 
     def event(self, e):
@@ -111,10 +109,6 @@
             return True
         return gui.Dialog.event(self, e)
 
-def check_exit():
-    dialog = CheckDialog()
-    dialog.open()
-    return dialog
 
 # Utility layout functions
 
--- a/gamelib/toolbar.py	Sat Nov 28 11:12:45 2009 +0000
+++ b/gamelib/toolbar.py	Sat Nov 28 11:25:56 2009 +0000
@@ -260,10 +260,6 @@
         width = constants.TOOLBAR_WIDTH
         return width, height
 
-    def event(self, e):
-        if not gui.Table.event(self, e):
-            return self.gameboard.event(e)
-        return True
 
 class DefaultToolBar(BaseToolBar):