changeset 308:3dee86b6c216

Enemies leave corpses
author Stefano Rivera <stefano@rivera.za.net>
date Fri, 06 Sep 2013 00:36:14 +0200
parents c2bbb1e70d6f
children 2b0494b3ce6a
files nagslang/enemies.py nagslang/events.py nagslang/screens/area.py
diffstat 3 files changed, 39 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/enemies.py	Fri Sep 06 00:32:38 2013 +0200
+++ b/nagslang/enemies.py	Fri Sep 06 00:36:14 2013 +0200
@@ -4,7 +4,9 @@
 import pymunk.pygame_util
 
 from nagslang import render
-from nagslang.constants import COLLISION_TYPE_ENEMY, ZORDER_MID
+from nagslang.constants import (COLLISION_TYPE_ENEMY, COLLISION_TYPE_BOX,
+                                ZORDER_MID)
+from nagslang.events import EnemyDeathEvent
 from nagslang.game_object import GameObject, SingleShapePhysicser, make_body
 from nagslang.mutators import FLIP_H
 from nagslang.resources import resources
@@ -21,6 +23,7 @@
 
 class Enemy(GameObject):
     """A base class for mobile enemies"""
+    enemy_type = None  # Image to use for dead Enemy
 
     def __init__(self, space, world, position):
         self._setup_physics(space, position)
@@ -51,13 +54,32 @@
     def lose_health(self, amount):
         self.health -= amount
         if self.health < 0:
-            self.world.kills += 1
             self.physicser.remove_from_space()
             self.remove = True
+            EnemyDeathEvent.post(self.physicser.position, 'A')
+
+
+class DeadEnemy(GameObject):
+    def __init__(self, space, world, position, enemy_type='A'):
+        body = make_body(10, 10000, position, damping=0.5)
+        self.shape = pymunk.Poly(
+            body, [(-20, -20), (20, -20), (20, 20), (-20, 20)])
+        self.shape.friction = 0.5
+        self.shape.collision_type = COLLISION_TYPE_BOX
+        super(DeadEnemy, self).__init__(
+            SingleShapePhysicser(space, self.shape),
+            render.ImageRenderer(resources.get_image(
+                'creatures', 'alien_%s_dead.png' % enemy_type)),
+        )
+
+    @classmethod
+    def requires(cls):
+        return [("name", "string"), ("position", "coordinates")]
 
 
 class PatrollingAlien(Enemy):
     is_moving = True  # Always walking.
+    enemy_type = 'A'
 
     def __init__(self, space, world, position, end_position):
         # An enemy that patrols between the two points
@@ -150,6 +172,7 @@
 class ChargingAlien(Enemy):
     # Simplistic charging of the protagonist
     is_moving = False
+    enemy_type = 'B'
 
     def __init__(self, space, world, position, attack_range=100):
         super(ChargingAlien, self).__init__(space, world, position)
--- a/nagslang/events.py	Fri Sep 06 00:32:38 2013 +0200
+++ b/nagslang/events.py	Fri Sep 06 00:36:14 2013 +0200
@@ -52,3 +52,10 @@
         super(FireEvent, cls).post(source=source, impulse=impulse,
                                    damage=damage,
                                    source_collision_type=source_collision_type)
+
+
+class EnemyDeathEvent(UserEvent):
+    @classmethod
+    def post(cls, position, enemy_type):
+        super(EnemyDeathEvent, cls).post(position=position,
+                                         enemy_type=enemy_type)
--- a/nagslang/screens/area.py	Fri Sep 06 00:32:38 2013 +0200
+++ b/nagslang/screens/area.py	Fri Sep 06 00:36:14 2013 +0200
@@ -6,7 +6,8 @@
 
 from nagslang.constants import (
     COLLISION_TYPE_WALL, COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS)
-from nagslang.events import ScreenChange, DoorEvent, FireEvent
+from nagslang.enemies import DeadEnemy
+from nagslang.events import ScreenChange, DoorEvent, FireEvent, EnemyDeathEvent
 from nagslang.level import Level
 from nagslang.screens.base import Screen
 from nagslang.game_object import Bullet
@@ -150,6 +151,11 @@
             bullet = Bullet(self.space, ev.source, ev.impulse, ev.damage,
                             ev.source_collision_type)
             self._drawables.add(bullet)
+        elif EnemyDeathEvent.matches(ev):
+            self.world.kills += 1
+            dead_enemy = DeadEnemy(self.space, self.world, ev.position,
+                                   ev.enemy_type)
+            self._drawables.add(dead_enemy)
         self.keys.handle_event(ev)
 
     def _calc_viewport(self, level_surface, display_surface):