The first steps towards enemy generators
[koperkapel.git] / koperkapel / loaders / levelloader.py
index 190319e451bbffd235678a2ddc3a6e21510f5b4c..a775838dc54b1b02c18734ab69709d4a34c16230 100644 (file)
@@ -4,20 +4,23 @@ import json
 
 from pgzero.loaders import ResourceLoader
 
-from ..gamelib.tiles import Wall, Floor, Tunnel, Underground, Grate
+from ..gamelib.tiles import Wall, Floor, Tunnel, Underground, Grate, Exit
 from ..gamelib.level import Level
 from ..gamelib.door import Door
 from ..gamelib.keypad import Keypad
+from ..gamelib.friendlyroach import get_friendly_roach
+from ..gamelib.items import get_item
+from ..gamelib.enemy_generator import EnemyGenerator
 
-        
 
 TILES = {
-    "cwall": Wall, # rename this everywhere
+    "cwall": Wall,  # rename this everywhere
     "floor": Floor,
     "tunnel": Tunnel,
     "underground": Underground,
 }
 
+
 class LevelLoader(ResourceLoader):
     """ Level loader. """
 
@@ -34,6 +37,10 @@ class LevelLoader(ResourceLoader):
         self._level.tiles = level_data['tiles']
         self._level.tileset = level_data['tileset']
         self._level.start_pos = level_data["starting pos"]
+        self._level.exit = level_data["exit"]
+        self._level.enemy_generators = []
+        self._level.friends = []
+        self._level.items = []
         # Consistency check, so we can assume things are correct
         # in the level renderer
         for row, row_data in enumerate(self._level.tiles):
@@ -46,13 +53,28 @@ class LevelLoader(ResourceLoader):
             # Create the doors first
             doors = []
             for door in door_info['doors']:
-                # Sort out angle
-                new_door = Door(door[0], door[1], 0)
+                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)
+                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)
+        for pos in level_data['friendly roaches']:
+            roach = get_friendly_roach(pos[0], pos[1])
+            self._level.friends.append(roach)
+        for item in level_data['items']:
+            self._level.items.append(get_item(item))
+        for generator in level_data['enemy generators']:
+            enemy = EnemyGenerator(generator)
+            self._level.enemy_generators.append(enemy)
         return self._level
 
     def _load_tile_images(self):
@@ -62,12 +84,14 @@ class LevelLoader(ResourceLoader):
                 neighborhood = self._level.get_neighbors(x, y)
                 for layer in ['floor', 'tunnels']:
                     neighbors = [x[layer] if x else None for x in neighborhood]
-                    tile['%s image' % layer] = \
-                            TILES[tile[layer]['base']].image(neighbors)
+                    tile['%s image' % layer] = (
+                            TILES[tile[layer]['base']].image(neighbors))
                     # Hack this for now
-                    if layer == 'floor' and 'crawl' in tile[layer]['behaviour']:
-                        print('Here')
+                    if self._level.is_exit(x, y):
+                        tile['floor image'] = Exit.image(neighbors)
+                    elif layer == 'floor' and 'crawl' in tile[layer]['behaviour']:
                         tile['floor image'] = Grate.image(neighbors)
+                        self._level.grates.append((x, y))
 
 
 levels = LevelLoader('levels')