changeset 444:547320870aed

Herd ALL THE SHEEPS.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 07 Sep 2013 14:47:34 +0200
parents fffb9becf608
children 79ba44e04b57
files data/levels/sheep nagslang/constants.py nagslang/game_object.py nagslang/puzzle.py
diffstat 4 files changed, 92 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/levels/sheep	Sat Sep 07 14:47:34 2013 +0200
@@ -0,0 +1,42 @@
+base_tile: tiles/floor.png
+enemies:
+- args:
+  - [1000, 600]
+  classname: Sheep
+- args:
+  - [1000, 500]
+  classname: Sheep
+- args:
+  - [1000, 400]
+  classname: Sheep
+- args:
+  - [1000, 300]
+  classname: Sheep
+game_objects:
+- args:
+  - [800, 500]
+  - - [700, 450]
+    - [700, 850]
+    - [1150, 850]
+    - [1150, 450]
+  - 3
+  classname: SheepPen
+  name: sheep_pen
+- args:
+  - [900, 400]
+  - sheep_pen
+  classname: FloorLight
+  name: sheep_light
+lines:
+- - [700, 850]
+  - [700, 450]
+- - [700, 450]
+  - [960, 450]
+polygons:
+  1:
+  - [50, 50]
+  - [1150, 50]
+  - [1150, 850]
+  - [50, 850]
+  - [50, 50]
+size: [1200, 900]
--- a/nagslang/constants.py	Sat Sep 07 14:42:21 2013 +0200
+++ b/nagslang/constants.py	Sat Sep 07 14:47:34 2013 +0200
@@ -25,6 +25,7 @@
 COLLISION_TYPE_PROJECTILE = 7
 COLLISION_TYPE_WEREWOLF_ATTACK = 8
 COLLISION_TYPE_SHEEP = 9
+COLLISION_TYPE_SHEEP_PEN = 10
 
 SWITCH_PUSHERS = [COLLISION_TYPE_PLAYER, COLLISION_TYPE_FURNITURE]
 
--- a/nagslang/game_object.py	Sat Sep 07 14:42:21 2013 +0200
+++ b/nagslang/game_object.py	Sat Sep 07 14:47:34 2013 +0200
@@ -9,8 +9,9 @@
 from nagslang.mutators import FLIP_H, ImageOverlay
 from nagslang.constants import (
     COLLISION_TYPE_DOOR, COLLISION_TYPE_FURNITURE, COLLISION_TYPE_PROJECTILE,
-    COLLISION_TYPE_SWITCH, COLLISION_TYPE_WEREWOLF_ATTACK,
-    SWITCH_PUSHERS, ZORDER_FLOOR, ZORDER_LOW, ZORDER_HIGH)
+    COLLISION_TYPE_SWITCH, COLLISION_TYPE_SHEEP, COLLISION_TYPE_SHEEP_PEN,
+    COLLISION_TYPE_WEREWOLF_ATTACK, SWITCH_PUSHERS, ZORDER_FLOOR, ZORDER_LOW,
+    ZORDER_HIGH)
 from nagslang.resources import resources
 from nagslang.events import DoorEvent
 
@@ -683,3 +684,26 @@
     def requires(cls):
         return [("name", "string"), ("position", "coordinates"),
                 ("outline", "polygon (convex)")]
+
+
+class SheepPen(GameObject):
+    zorder = ZORDER_FLOOR
+
+    def __init__(self, space, position, outline, sheep_count):
+        body = make_body(None, None, position)
+        # Adjust shape relative to position
+        shape_outline = [(p[0] - position[0], p[1] - position[1]) for
+                         p in outline]
+        self.shape = pymunk.Poly(body, shape_outline)
+        self.shape.collision_type = COLLISION_TYPE_SHEEP_PEN
+        self.shape.sensor = True
+        super(SheepPen, self).__init__(
+            SingleShapePhysicser(space, self.shape),
+            render.Renderer(),
+            puzzle.MultiCollidePuzzler(sheep_count, COLLISION_TYPE_SHEEP),
+        )
+
+    @classmethod
+    def requires(cls):
+        return [("name", "string"), ("position", "coordinates"),
+                ("outline", "polygon (convex)"), ("sheep_count", "int")]
--- a/nagslang/puzzle.py	Sat Sep 07 14:42:21 2013 +0200
+++ b/nagslang/puzzle.py	Sat Sep 07 14:47:34 2013 +0200
@@ -70,18 +70,36 @@
             collision_types = (COLLISION_TYPE_PLAYER,)
         self._collision_types = collision_types
 
-    def get_state(self):
+    def get_colliders(self):
         space = self.game_object.get_space()
-        for shape in space.shape_query(self.game_object.get_shape()):
-            if shape.collision_type in self._collision_types:
-                return True
-        return False
+        my_shape = self.game_object.get_shape()
+        shapes = [shape for shape in space.shapes
+                  if shape.collision_type in self._collision_types]
+        return [shape for shape in shapes
+                if my_shape in space.point_query(shape.body.position)]
+
+    def get_state(self):
+        return bool(self.get_colliders())
 
     @classmethod
     def requires(cls):
         return [("name", "string"), ("collision_types", "list of ints")]
 
 
+class MultiCollidePuzzler(CollidePuzzler):
+    def __init__(self, min_count, *collision_types):
+        self._min_count = min_count
+        super(MultiCollidePuzzler, self).__init__(*collision_types)
+
+    def get_state(self):
+        return len(self.get_colliders()) >= self._min_count
+
+    @classmethod
+    def requires(cls):
+        return [("name", "string"), ("min_count", "int"),
+                ("collision_types", "list of ints")]
+
+
 class ParentAttrPuzzler(Puzzler):
     def __init__(self, attr_name):
         self._attr_name = attr_name