From: Simon Cross Date: Sat, 5 Mar 2016 12:13:18 +0000 (+0200) Subject: Merge branch 'master' of ctpug.org.za:koperkapel X-Git-Url: https://git.ctpug.org.za/?a=commitdiff_plain;h=ac587543218e5179289e18a147e7118f10348dfe;hp=73f160f2e18b0fde0bab8490f0e86fe78663b7aa;p=koperkapel.git Merge branch 'master' of ctpug.org.za:koperkapel --- diff --git a/koperkapel/gamelib/door.py b/koperkapel/gamelib/door.py new file mode 100644 index 0000000..9b6e563 --- /dev/null +++ b/koperkapel/gamelib/door.py @@ -0,0 +1,23 @@ +# A doors / keypads set + +import os +from pgzero.loaders import images +from ..actors.orientatedsurf import OrientatedSurfActor +from ..constants import TILE_SIZE + + +class Door(OrientatedSurfActor): + + def __init__(self, x, y, angle): + self._closed = True + self._open_surf = images.load(os.path.join('fixtures', 'door_open')) + self._closed_surf = images.load(os.path.join('fixtures', 'door')) + self.game_pos = (x, y) + super().__init__(self._closed_surf, angle=angle, anchor=(0, 0)) + + def open(self): + self._closed = False + self.surf = self._open_surf + + def is_closed(self): + return self._closed diff --git a/koperkapel/gamelib/keypad.py b/koperkapel/gamelib/keypad.py new file mode 100644 index 0000000..4667fcd --- /dev/null +++ b/koperkapel/gamelib/keypad.py @@ -0,0 +1,20 @@ +# A doors / keypads set + +import os +from pgzero.loaders import images +from ..actors.orientatedsurf import SurfActor +from ..constants import TILE_SIZE + + +class Keypad(SurfActor): + + def __init__(self, x, y, doors): + self._doors = doors + self.game_pos = (x, y) + surf = images.load(os.path.join('fixtures', 'keypad')) + super().__init__(surf, anchor=(0, 0)) + + def activate(self): + # FIXME: Check stats + for door in self._doors: + door.open() diff --git a/koperkapel/gamelib/level.py b/koperkapel/gamelib/level.py index 01c260e..39e4565 100644 --- a/koperkapel/gamelib/level.py +++ b/koperkapel/gamelib/level.py @@ -1,11 +1,16 @@ """ Class holding the level info """ +from .keypad import Keypad +from .door import Door + class Level(object): def __init__(self): self.width = self.height = 0 self.tiles = [] + self.keypads = [] + self.doors = [] self.tileset = None self.start_pos = (0, 0) @@ -18,10 +23,28 @@ class Level(object): ] def can_walk(self, x, y, layer): - return 'walk' in self.tiles[y][x][layer]['behaviour'] + if 'walk' in self.tiles[y][x][layer]['behaviour']: + # check doors + for door in self.doors: + if (x, y) == door.game_pos and door.is_closed(): + return False + return True + return False def can_fly(self, x, y, layer): - return 'fly' in self.tiles[y][x][layer]['behaviour'] + if 'fly' in self.tiles[y][x][layer]['behaviour']: + for door in self.doors: + if (x, y) == door.game_pos and door.is_closed(): + return False + return True + + return False def can_crawl(self, x, y, layer): return 'crawl' in self.tiles[y][x][layer]['behaviour'] + + def keypad_at(self, x, y): + for keypad in self.keypads: + if (x, y) == keypad.game_pos: + return keypad + return None diff --git a/koperkapel/levels/level1.json b/koperkapel/levels/level1.json index 38a872a..1dea2c4 100644 --- a/koperkapel/levels/level1.json +++ b/koperkapel/levels/level1.json @@ -4289,5 +4289,53 @@ "starting pos": [ 5, 6 + ], + "door_info": [ + { + "keypads": [ + [ + 6, + 7 + ] + ], + "doors": [ + [ + 7, + 8 + ] + ] + }, + { + "keypads": [ + [ + 5, + 12 + ] + ], + "doors": [ + [ + 7, + 12 + ], + [ + 4, + 13 + ] + ] + }, + { + "keypads": [ + [ + 18, + 9 + ] + ], + "doors": [ + [ + 19, + 8 + ] + ] + } ] -} \ No newline at end of file +} diff --git a/koperkapel/loaders/levelloader.py b/koperkapel/loaders/levelloader.py index 0addecc..9bb85e4 100644 --- a/koperkapel/loaders/levelloader.py +++ b/koperkapel/loaders/levelloader.py @@ -6,6 +6,8 @@ from pgzero.loaders import ResourceLoader from ..gamelib.tiles import Wall, Floor, Tunnel, Underground, Grate from ..gamelib.level import Level +from ..gamelib.door import Door +from ..gamelib.keypad import Keypad @@ -40,6 +42,23 @@ class LevelLoader(ResourceLoader): for tile in TILES.values(): tile.TILESET = self._level.tileset self._load_tile_images() + for door_info in level_data['door_info']: + # Create the doors first + doors = [] + for door in door_info['doors']: + x, y = door + # is this the right check + if self._level.can_walk(x + 1, y, 'floor') and self._level.can_walk(x - 1, y, 'floor'): + # vertical door + angle = 90 + else: + angle = 0 + new_door = Door(x, y, angle) + self._level.doors.append(new_door) + # Add the keypads + for keypad in door_info['keypads']: + new_keypad = Keypad(keypad[0], keypad[1], doors) + self._level.keypads.append(new_keypad) return self._level def _load_tile_images(self): diff --git a/koperkapel/scenes/base.py b/koperkapel/scenes/base.py index 481850b..ade4d8b 100644 --- a/koperkapel/scenes/base.py +++ b/koperkapel/scenes/base.py @@ -44,9 +44,13 @@ class Engine: self._viewport = (self._viewport[0] + offset[0], self._viewport[1] + offset[1]) + def calc_offset(self, x, y): + """Return a position offset by the viewport""" + return x - self._viewport[0], y - self._viewport[1] + @apply_events def update(self, dt): - return self._scene.update(self._world.proxy(), dt) + return self._scene.update(self._world.proxy(), self, dt) def draw(self): self._scene.draw(self._app.screen, self._viewport) @@ -182,7 +186,7 @@ class Scene: def exit(self, world): pass - def update(self, world, dt): + def update(self, world, engine, dt): pass def draw(self, screen, viewport): diff --git a/koperkapel/scenes/level.py b/koperkapel/scenes/level.py index 2484119..70dd7be 100644 --- a/koperkapel/scenes/level.py +++ b/koperkapel/scenes/level.py @@ -21,6 +21,13 @@ class BaseLevelScene(Scene): for layer in ['floor', 'tunnels']: self._surfaces[layer] = self._render(layer) self._overlay = self._surfaces['floor'].copy() + self._doors = self.actors.add_layer("doors", level=9) + self._keypads = self.actors.add_layer("keypads", level=8) + # These are already Actors + for door in self._level.doors: + self._doors.add(door) + for keypad in self._level.keypads: + self._keypads.add(keypad) def _render(self, layer): # We cache the rendered surface to avoid doing a large number @@ -38,6 +45,13 @@ class BaseLevelScene(Scene): surface.blit(tile[layer_key], pos) return surface.convert_alpha() + def update(self, world, engine, dt): + """Fix the door and keypad positions""" + for door in self._doors: + door.pos = engine.calc_offset(door.game_pos[0] * TILE_SIZE, door.game_pos[1] * TILE_SIZE) + for keypad in self._keypads: + keypad.pos = engine.calc_offset(keypad.game_pos[0] * TILE_SIZE, keypad.game_pos[1] * TILE_SIZE) + def draw(self, screen, viewport): screen.clear() # Viewport is the position of the screen relative to the @@ -78,6 +92,7 @@ class GameLevelScene(BaseLevelScene): def _set_pos(self, x, y): self._player_pos = (x, y) + print('Now at ', x, y) def _can_move(self, x, y): if self._mode == 'walk': diff --git a/koperkapel/scenes/roach_management.py b/koperkapel/scenes/roach_management.py index 7dc9c5e..e7dcd7c 100644 --- a/koperkapel/scenes/roach_management.py +++ b/koperkapel/scenes/roach_management.py @@ -166,7 +166,7 @@ class RoachesScene(Scene): def _eject_roach(self): print("Eject roach.") - def update(self, world, dt): + def update(self, world, engine, dt): self._update_inventory(world) self._update_roaches(world)