changeset 440:9eee96966d88

Add Death event to reduce death code duplication
author Stefano Rivera <stefano@rivera.za.net>
date Sat, 07 Sep 2013 14:36:09 +0200
parents 4c60df80b91b
children 707d06a77f39
files nagslang/events.py nagslang/protagonist.py nagslang/screens/area.py
diffstat 3 files changed, 19 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/events.py	Sat Sep 07 14:30:27 2013 +0200
+++ b/nagslang/events.py	Sat Sep 07 14:36:09 2013 +0200
@@ -40,6 +40,12 @@
         super(ScreenChange, cls).post(screen=new_screen)
 
 
+class DeathEvent(UserEvent):
+    @classmethod
+    def post(cls):
+        super(DeathEvent, cls).post()
+
+
 class DoorEvent(UserEvent):
     @classmethod
     def post(cls, destination, dest_pos):
--- a/nagslang/protagonist.py	Sat Sep 07 14:30:27 2013 +0200
+++ b/nagslang/protagonist.py	Sat Sep 07 14:36:09 2013 +0200
@@ -11,10 +11,9 @@
     CMD_TOGGLE_FORM, CMD_ACTION)
 from nagslang.game_object import (
     GameObject, Physicser, Result, Bullet, ClawAttack, make_body)
-from nagslang.level import Level
 from nagslang.mutators import FLIP_H
 from nagslang.resources import resources
-from nagslang.events import ScreenChange
+from nagslang.events import DeathEvent
 from nagslang.utils import vec_from_angle, vec_with_length
 
 
@@ -339,11 +338,8 @@
     def die(self):
         # Handle player death - may be called due to other reasons
         # than zero health
-        self.world.load()
-        self.world.deaths += 1
-        level, pos = Level.game_starting_point()
-        self.set_position(pos)
-        ScreenChange.post(level)
+        self.reset()
+        DeathEvent.post()
 
     def lose_health(self, amount):
         if self.in_human_form():
--- a/nagslang/screens/area.py	Sat Sep 07 14:30:27 2013 +0200
+++ b/nagslang/screens/area.py	Sat Sep 07 14:36:09 2013 +0200
@@ -8,7 +8,7 @@
     COLLISION_TYPE_WALL, COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS,
     COLLISION_TYPE_FURNITURE, COLLISION_TYPE_WEREWOLF_ATTACK,
     CMD_TOGGLE_FORM, CMD_ACTION)
-from nagslang.events import ScreenChange, DoorEvent, QuitEvent
+from nagslang.events import ScreenChange, DoorEvent, QuitEvent, DeathEvent
 from nagslang.level import Level
 from nagslang.screens.base import Screen
 from nagslang.sound import sound
@@ -165,12 +165,7 @@
                 if self._level.is_starting_level():
                     QuitEvent.post()
                     return
-                room, pos = self.game_starting_point
-                self.world.load()
-                self.world.deaths += 1
-                ScreenChange.post(room)
-                self.protagonist.set_position(pos)
-                self._disable_render = True
+                self.protagonist.die()
                 return
             cmd_key = self.keys.get_command_key(ev.key)
             if cmd_key is not None:
@@ -187,6 +182,14 @@
                 return
             # else we're teleporting within the screen, and just the
             # position change is enough
+        elif DeathEvent.matches(ev):
+            self._disable_render = True
+            self.world.load()
+            self.world.deaths += 1
+            level, pos = Level.game_starting_point()
+            self.protagonist.set_position(pos)
+            ScreenChange.post(level)
+
         self.keys.handle_event(ev)
 
     def _calc_viewport(self, level_surface, display_surface):