Door hacking
[koperkapel.git] / koperkapel / scenes / level.py
index a800ba0d842d0f5c3d130b16acbef92f6c0aa958..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,46 +69,69 @@ class GameLevelScene(BaseLevelScene):
     def enter(self, world):
         super().enter(world)
         self._roaches = self.actors.add_layer("roaches", level=10)
-        self._init_roaches(world.roaches)
+        self._mode = 'walk'
+        return self._init_roaches(world.roaches)
 
     def _init_roaches(self, roaches):
-        x, y = self._level.start_pos
         for roach in roaches:
             roach_actor = self._roaches.add(default_roaches.assemble(roach))
             roach_actor.anchor = (0, 0)
-            roach_actor.pos = (x * TILE_SIZE, y * TILE_SIZE)
+            roach_actor.pos = (WIDTH // 2, HEIGHT // 2)
+        x, y = self._level.start_pos
         self._set_pos(x, y)
         self._level_layer = 'floor'
+        # Fix viewport offset
+        return [MoveViewportEvent((x * TILE_SIZE - WIDTH // 2, y * TILE_SIZE - HEIGHT // 2))]
 
     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)]