# HG changeset patch # User Simon Cross # Date 1259407556 0 # Node ID 27c09c58d89d9a213e5cb823cd1badf2bfcc11ff # Parent 1456bf2ff02e5e5130cbbccaacf5cc8c5af7ec8f Remove gameboard and dialog event flow hacks. diff -r 1456bf2ff02e -r 27c09c58d89d gamelib/engine.py --- 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") diff -r 1456bf2ff02e -r 27c09c58d89d gamelib/gameboard.py --- 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: diff -r 1456bf2ff02e -r 27c09c58d89d gamelib/misc.py --- 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 diff -r 1456bf2ff02e -r 27c09c58d89d gamelib/toolbar.py --- 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):