Door hacking
[koperkapel.git] / koperkapel / scenes / level.py
index 9dd8b61e3d7958ab67f7f25ae62b9467de770c7a..a16e99f9fec60ba6427faa011dd511edf6411624 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=15)
+        self._keypads = self.actors.add_layer("keypads", level=16)
+        # These are already Actors
+        for door in self._level.doors:
+            self._doors.append(door)
+        for keypad in self._level.keypads:
+            self._keypads.append(keypads)
 
     def _render(self, layer):
         # We cache the rendered surface to avoid doing a large number
@@ -62,6 +69,7 @@ class GameLevelScene(BaseLevelScene):
     def enter(self, world):
         super().enter(world)
         self._roaches = self.actors.add_layer("roaches", level=10)
+        self._mode = 'walk'
         return self._init_roaches(world.roaches)
 
     def _init_roaches(self, roaches):
@@ -77,33 +85,53 @@ 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':
+            return self._level.can_walk(x, y, self._level_layer)
+        elif self._mode == 'fly':
+            return self._level.can_fly(x, y, self._level_layer)
+        elif self._mode == 'crawl':
+            return self._level.can_crawl(x, y, self._level_layer)
+
+    def _set_angle(self, angle):
+        for roach in self._roaches:
+            roach.angle = angle
 
     def on_key_down(self, key, mod, unicode):
         offset = None
         x, y = self._player_pos
         if key == keys.DOWN:
-            if self._level.can_walk(x, y + 1, self._level_layer):
+            if self._can_move(x, y + 1):
                 self._set_pos(x, y + 1)
                 offset = (0, TILE_SIZE)
+                self._set_angle(180)
         elif key == keys.UP:
-            if self._level.can_walk(x, y - 1, self._level_layer):
+            if self._can_move(x, y - 1):
                 self._set_pos(x, y - 1)
                 offset = (0, -TILE_SIZE)
+                self._set_angle(0)
         elif key == keys.LEFT:
-            if self._level.can_walk(x - 1, y, self._level_layer):
+            if self._can_move(x - 1, y):
                 self._set_pos(x - 1, y)
                 offset = (-TILE_SIZE, 0)
+                self._set_angle(90)
         elif key == keys.RIGHT:
-            if self._level.can_walk(x + 1, y, self._level_layer):
+            if self._can_move(x + 1, y):
                 self._set_pos(x + 1, y)
                 offset = (TILE_SIZE, 0)
+                self._set_angle(270)
         elif key == keys.S:
-            if self._level_layer == 'floor':
-                if self._level.can_walk(x, y, 'tunnels'):
+            if self._level_layer == 'floor' and self._level.can_crawl(x, y, 'floor'):
+                # We're probably on a grate
+                if self._level.can_crawl(x, y, 'tunnels'):
                     self._level_layer = 'tunnels'
-            elif self._level.can_walk(x, y, 'floor'):
+                    self._mode = 'crawl'
+            elif self._level.can_crawl(x, y, 'floor'):
                 # Must be in the tunnels already
                 self._level_layer = 'floor'
+                self._mode = 'walk'
             return
         if offset:
             return [MoveViewportEvent(offset)]