changeset 319:01e98732de46

Open bulkheads are no longer opaque to furniture
author Stefano Rivera <stefano@rivera.za.net>
date Fri, 06 Sep 2013 02:01:30 +0200
parents 26d1978fa1da
children d13d5425da95
files nagslang/game_object.py nagslang/screens/area.py
diffstat 2 files changed, 18 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/game_object.py	Fri Sep 06 01:48:59 2013 +0200
+++ b/nagslang/game_object.py	Fri Sep 06 02:01:30 2013 +0200
@@ -162,6 +162,9 @@
         """
         return True
 
+    def collide_with_furniture(self, furniture):
+        return True
+
     @classmethod
     def requires(cls):
         """Hints for the level editor"""
@@ -309,6 +312,8 @@
             return False
         return True
 
+    collide_with_furniture = collide_with_protagonist
+
     @classmethod
     def requires(cls):
         return [("name", "string"), ("end1", "coordinates"),
--- a/nagslang/screens/area.py	Fri Sep 06 01:48:59 2013 +0200
+++ b/nagslang/screens/area.py	Fri Sep 06 02:01:30 2013 +0200
@@ -5,7 +5,8 @@
 import pymunk.pygame_util
 
 from nagslang.constants import (
-    COLLISION_TYPE_WALL, COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS)
+    COLLISION_TYPE_WALL, COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS,
+    COLLISION_TYPE_FURNITURE)
 from nagslang.enemies import DeadEnemy
 from nagslang.events import ScreenChange, DoorEvent, FireEvent, \
     EnemyDeathEvent, ClawEvent
@@ -82,7 +83,7 @@
     def teardown(self):
         sound.stop()
 
-    def _collision_pre_solve_handler(self, space, arbiter):
+    def _player_collision_pre_solve_handler(self, space, arbiter):
         gobj = arbiter.shapes[1].physicser.game_object
         result = gobj.collide_with_protagonist(self.protagonist)
         # The collision handler must return `True` or `False`. We don't want to
@@ -92,11 +93,20 @@
             return False
         return True
 
+    def _furniture_collision_pre_solve_handler(self, space, arbiter):
+        furniture = arbiter.shapes[0].physicser.game_object
+        gobj = arbiter.shapes[1].physicser.game_object
+        result = gobj.collide_with_furniture(furniture)
+        return result is not False
+
     def _add_collision_handlers(self):
         for collision_type in CALLBACK_COLLIDERS:
             self.space.add_collision_handler(
                 COLLISION_TYPE_PLAYER, collision_type,
-                pre_solve=self._collision_pre_solve_handler)
+                pre_solve=self._player_collision_pre_solve_handler)
+            self.space.add_collision_handler(
+                COLLISION_TYPE_FURNITURE, collision_type,
+                pre_solve=self._furniture_collision_pre_solve_handler)
 
     def add_walls(self):
         self.walls = []