# HG changeset patch # User Jeremy Thurgood # Date 1378122504 -7200 # Node ID bce9cd8a4a8c4ca9274cc5e22e22bcc07fc21f0b # Parent 0131e4606e1aaf812dac1dd921897d9a0f2d3863 FloorLight, linked to a FloorSwitch. diff -r 0131e4606e1a -r bce9cd8a4a8c nagslang/game_object.py --- a/nagslang/game_object.py Mon Sep 02 13:29:30 2013 +0200 +++ b/nagslang/game_object.py Mon Sep 02 13:48:24 2013 +0200 @@ -8,13 +8,29 @@ from nagslang.options import options +class PuzzleGlue(object): + """Glue that holds bits of a puzzle together. + """ + def __init__(self): + self._components = {} + + def add_component(self, name, puzzler): + self._components[name] = puzzler + puzzler.set_glue(self) + + def get_state_of(self, name): + return self._components[name].get_state() + + class Puzzler(object): - def get_state(self, space): + """Behaviour specific to a puzzle component. + """ + def set_glue(self, glue): + self.glue = glue + + def get_state(self): raise NotImplementedError() - def notify(self): - pass - class FloorSwitchPuzzler(Puzzler): def __init__(self, space, shape): @@ -28,6 +44,14 @@ return False +class StateProxyPuzzler(Puzzler): + def __init__(self, state_source): + self._state_source = state_source + + def get_state(self): + return self.glue.get_state_of(self._state_source) + + class Physicser(object): def __init__(self, space): self.space = space @@ -185,3 +209,24 @@ else: self.shape.color = pygame.color.THECOLORS['red'] super(FloorSwitch, self).render(surface) + + +class FloorLight(GameObject): + def __init__(self, space, position, state_source): + body = pymunk.Body() + body.position = position + self.shape = pymunk.Circle(body, 10) + self.shape.collision_type = COLLISION_TYPE_SWITCH + self.shape.sensor = True + super(FloorLight, self).__init__( + SingleShapePhysicser(space, self.shape), + ShapeRenderer(self.shape), + StateProxyPuzzler(state_source), + ) + + def render(self, surface): + if self.puzzler.get_state(): + self.shape.color = pygame.color.THECOLORS['green'] + else: + self.shape.color = pygame.color.THECOLORS['red'] + super(FloorLight, self).render(surface) diff -r 0131e4606e1a -r bce9cd8a4a8c nagslang/screens/area.py --- a/nagslang/screens/area.py Mon Sep 02 13:29:30 2013 +0200 +++ b/nagslang/screens/area.py Mon Sep 02 13:48:24 2013 +0200 @@ -5,7 +5,7 @@ import pymunk.pygame_util from nagslang.events import ScreenChange -from nagslang.game_object import FloorSwitch +from nagslang.game_object import FloorSwitch, FloorLight, PuzzleGlue from nagslang.level import Level from nagslang.protagonist import Protagonist from nagslang.screens.base import Screen @@ -53,7 +53,13 @@ self.add_walls() self.add_protagonist() # TODO: Put this in a level instead: - self._drawables.append(FloorSwitch(self.space, (300, 400))) + glue = PuzzleGlue() + switch = FloorSwitch(self.space, (300, 400)) + light = FloorLight(self.space, (300, 500), 'switch') + glue.add_component('switch', switch.puzzler) + glue.add_component('light', light.puzzler) + self._drawables.append(switch) + self._drawables.append(light) def add_walls(self): self.walls = []