Merge branch 'master' of ctpug.org.za:koperkapel
authorSimon Cross <hodgestar@gmail.com>
Sat, 5 Mar 2016 12:13:18 +0000 (14:13 +0200)
committerSimon Cross <hodgestar@gmail.com>
Sat, 5 Mar 2016 12:13:18 +0000 (14:13 +0200)
koperkapel/gamelib/door.py [new file with mode: 0644]
koperkapel/gamelib/keypad.py [new file with mode: 0644]
koperkapel/gamelib/level.py
koperkapel/levels/level1.json
koperkapel/loaders/levelloader.py
koperkapel/scenes/base.py
koperkapel/scenes/level.py
koperkapel/scenes/roach_management.py

diff --git a/koperkapel/gamelib/door.py b/koperkapel/gamelib/door.py
new file mode 100644 (file)
index 0000000..9b6e563
--- /dev/null
@@ -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 (file)
index 0000000..4667fcd
--- /dev/null
@@ -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()
index 01c260e7d5859cd836cbc52a336116f8fe7398c6..39e456588e2a2a9a2186a8475f226af3b9f14573 100644 (file)
@@ -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
index 38a872aa092c13e1119dfe052144d769c9c0b70b..1dea2c4f03755d02719ddd04465cb18e719e036e 100644 (file)
    "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
+}
index 0addeccf5c54d678dadbaa8d796e904e26ebf01e..9bb85e41ebf89fd57084d00cdd7f01522e318d23 100644 (file)
@@ -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):
index 481850b2533153afa5ccbb12ea090aae5995bcf9..ade4d8bfddede638919ab9eb884423d38a9e55c6 100644 (file)
@@ -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):
index 2484119350570d93fdfb49b37f5d0c02106876d6..70dd7be23931d70ff129952598c525c7c1bf65fd 100644 (file)
@@ -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':
index 7dc9c5eaff4952fb37e2e33f9cb57b415189ad6c..e7dcd7c66b8c188b81cfd585ad6181fe1c7fe0d8 100644 (file)
@@ -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)