changeset 244:5bbf90e6a94b

Add minimal support for player death
author Neil Muller <drnlmuller@gmail.com>
date Thu, 07 Apr 2011 18:13:51 +0200
parents 4050e77dade6
children 766d257e7e7f
files data/game.json skaapsteker/engine.py skaapsteker/levelscene.py skaapsteker/sprites/player.py
diffstat 4 files changed, 53 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- 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": {}
--- 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()
--- 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)
--- 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]