Mercurial > nagslang
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