view mamba/habitats/level.py @ 564:6a4f9a2f6820

Include author in caption if available
author Neil Muller <drnlmuller@gmail.com>
date Tue, 18 Oct 2011 12:50:56 +0200
parents dee11e9a37b0
children
line wrap: on
line source

"""Where a level object hides."""

import pygame.display
from pygame.locals import KEYDOWN

from mamba.constants import ESCAPE_KEYS, NAME
from mamba.engine import Habitat, LevelCompletedEvent, SnakeDiedEvent
from mamba.gamestate import level_done
from mamba.widgets.game import GameWidget
from mamba.widgets.messagebox import MessageBox
from mamba.world import World


class LevelHabitat(Habitat):
    def __init__(self, level, go_menu, go_next_level):
        super(LevelHabitat, self).__init__()
        self.go_menu = go_menu
        self.go_next_level = go_next_level
        self.world = World(level)
        self.level_name = level.name
        self.author = level.author
        self.game_widget = GameWidget(self.world)
        self.container.add(self.game_widget)
        self.container.add_callback(KEYDOWN, self.keydown_event)
        self.container.add_callback(LevelCompletedEvent, self.level_completed)
        self.container.add_callback(SnakeDiedEvent, self.snake_died)

    def keydown_event(self, ev, widget):
        if ev.key in ESCAPE_KEYS:
            self.world.pause()
            self.go_menu()
            return True

    def on_enter(self):
        """Set the caption to the level name"""
        super(LevelHabitat, self).on_enter()
        if self.author:
            pygame.display.set_caption('%s: %s by %s' %
                    (NAME, self.level_name, self.author))
        else:
            pygame.display.set_caption('%s: %s' % (NAME, self.level_name))

    def on_exit(self):
        """Fix name"""
        super(LevelHabitat, self).on_exit()
        pygame.display.set_caption(NAME)

    def level_completed(self, ev, widget):
        if not self.world.pause():
            return False
        self.display_dialog(
            MessageBox((300, 200), 'Level complete!', self.go_next_level))
        level_done(self.world.level.unique_name())
        return True

    def snake_died(self, ev, widget):
        if not self.world.pause():
            return False
        self.display_dialog(MessageBox((300, 200), 'You died!\n%s' % ev.reason,
                            self.game_widget.restart))
        self.world.snake.alive = False
        return True