# HG changeset patch # User Neil Muller # Date 1302192831 -7200 # Node ID 5bbf90e6a94bed2267a3cb9b5431a83d98d8ad05 # Parent 4050e77dade6f0535e7c724f81f1df98eb8537b0 Add minimal support for player death diff -r 4050e77dade6 -r 5bbf90e6a94b data/game.json --- a/data/game.json Thu Apr 07 16:42:54 2011 +0200 +++ b/data/game.json Thu Apr 07 18:13:51 2011 +0200 @@ -2,7 +2,8 @@ "fox": { "item": null, "tails" : [], - "health" : 80 + "cur_health" : 40, + "max_health" : 40 }, "missions": { "monk_tea": {} diff -r 4050e77dade6 -r 5bbf90e6a94b skaapsteker/engine.py --- a/skaapsteker/engine.py Thu Apr 07 16:42:54 2011 +0200 +++ b/skaapsteker/engine.py Thu Apr 07 18:13:51 2011 +0200 @@ -94,3 +94,11 @@ @classmethod def post(cls, next_scene): super(ChangeScene, cls).post(next_scene=next_scene) + +class PlayerDied(UserEvent): + + utype = "PLAYER_DIED" + + @classmethod + def post(cls): + super(PlayerDied, cls).post() diff -r 4050e77dade6 -r 5bbf90e6a94b skaapsteker/levelscene.py --- a/skaapsteker/levelscene.py Thu Apr 07 16:42:54 2011 +0200 +++ b/skaapsteker/levelscene.py Thu Apr 07 18:13:51 2011 +0200 @@ -1,7 +1,7 @@ """Scene wrapping a level object.""" from pygame.locals import (KEYDOWN, KEYUP, K_DOWN, K_ESCAPE, K_LEFT, K_RIGHT, - K_SEMICOLON, K_UP, K_p, K_q, K_x, K_z) + K_SEMICOLON, K_UP, K_p, K_q, K_x, K_z, K_RETURN) from . import options import engine @@ -18,6 +18,8 @@ self._player = sprites.player.Player(game_state.world) self._level = level.Level(leveldef, self._player) + self._leveldef = leveldef + self._player_dead = False self._level_surface = self._level.get_surface() self._clip_rect = None @@ -35,6 +37,9 @@ def _build_action_map(self): action = lambda s: getattr(self._player, 'action_%s' % s) + self._quit_keys = set([K_q, K_ESCAPE]) + self._restart_keys = set([K_x, K_z, K_RETURN]) + self._fast_key_map = { K_LEFT: action('left'), K_RIGHT: action('right'), @@ -55,9 +60,21 @@ self._slow_key_map[K_z] = action('fire2') self._slow_key_map[K_q] = self._quit - def _quit(self): + def _quit(self, pause=True): import menuscene # avoid circular import - engine.ChangeScene.post(menuscene.MenuScene(self.game_state, self)) + if pause: + engine.ChangeScene.post(menuscene.MenuScene(self.game_state, self)) + else: + # FIXME: When starting the game, we shoudl ensure we have sane + # states + if self._player_dead: + self._player.restore() + engine.ChangeScene.post(menuscene.MenuScene(self.game_state, None)) + + def _restart(self): + if self._player_dead: + self._player.restore() + engine.ChangeScene.post(LevelScene(self.game_state, self._leveldef)) def _toggle_pause(self): if self._paused: @@ -101,6 +118,11 @@ paused_text = Text('Paused', paused_text_pos) paused_text.draw(self._level_surface) + if self._player_dead: + death_text_pos = self._clip_rect.centerx - 100, self._clip_rect.centery - 100 + death_text = Text("You've died.\nPress Escape to exit or Return to restart the level", death_text_pos) + death_text.draw(self._level_surface) + screen_surface.blit(self._level_surface, (0, 0), self._clip_rect) def _update_clip_rect(self): @@ -109,8 +131,17 @@ cr.center = self._player.collide_rect.move(0, -level.TILE_SIZE[0]).midbottom cr.clamp_ip(lr) + def dispatch(self, ev): - if ev.type is KEYDOWN: + if engine.PlayerDied.matches(ev): + self._player_dead = True + elif ev.type is KEYDOWN: + if self._player_dead: + if ev.key in self._restart_keys: + self._restart() + elif ev.key in self._quit_keys: + self._quit(False) + return if ev.key in self._fast_key_map: self._fast_keys_down.add(ev.key) action = self._slow_key_map.get(ev.key) diff -r 4050e77dade6 -r 5bbf90e6a94b skaapsteker/sprites/player.py --- a/skaapsteker/sprites/player.py Thu Apr 07 16:42:54 2011 +0200 +++ b/skaapsteker/sprites/player.py Thu Apr 07 18:13:51 2011 +0200 @@ -7,6 +7,7 @@ from skaapsteker.physics import Sprite from skaapsteker.constants import Layers from skaapsteker.data import get_files, load_image +from skaapsteker.engine import PlayerDied class Player(Sprite): @@ -30,7 +31,6 @@ self._load_images() # We muck with these in load for convience, so ensure they're right self.the_world = the_world - self.health = the_world.fox.health self.set_facing('left') self.set_image() self.set_pos((0, 0)) @@ -148,14 +148,17 @@ self._collisions_seen += 1 if hasattr(other, 'collided_player'): other.collided_player(self) - print 'Health', self.the_world.fox.health + print 'Health', self.the_world.fox.cur_health def damage(self, damage): - self.the_world.fox.health -= damage - if self.the_world.fox.health < 0: - print 'You should have dided' + self.the_world.fox.cur_health -= damage + if self.the_world.fox.cur_health <= 0: + PlayerDied.post() + def restore(self): + """Restore player to max health (for restarting levels, etc.)""" + self.the_world.fox.cur_health = self.the_world.fox.max_health def set_pos(self, pos): self.rect.midbottom = pos[0] * TILE_SIZE[0] + self.rect_offset[0], (pos[1] + 1) * TILE_SIZE[1] + self.rect_offset[1]