smartness now required for keypads
[koperkapel.git] / koperkapel / loaders / levelloader.py
index 524769535fccd97b87396f056146ac364a352f26..9c3b6cfc19fc57c31af97b1c4337bb016131d7f8 100644 (file)
@@ -4,20 +4,23 @@ import json
 
 from pgzero.loaders import ResourceLoader
 
 
 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.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 = {
 
 TILES = {
-    "cwall": Wall, # rename this everywhere
+    "cwall": Wall,  # rename this everywhere
     "floor": Floor,
     "tunnel": Tunnel,
     "underground": Underground,
 }
 
     "floor": Floor,
     "tunnel": Tunnel,
     "underground": Underground,
 }
 
+
 class LevelLoader(ResourceLoader):
     """ Level loader. """
 
 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.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):
         # Consistency check, so we can assume things are correct
         # in the level renderer
         for row, row_data in enumerate(self._level.tiles):
@@ -58,8 +65,16 @@ class LevelLoader(ResourceLoader):
                 doors.append(new_door)
             # Add the keypads
             for keypad in door_info['keypads']:
                 doors.append(new_door)
             # Add the keypads
             for keypad in door_info['keypads']:
-                new_keypad = Keypad(keypad[0], keypad[1], doors)
+                new_keypad = Keypad(keypad[0], keypad[1], doors, keypad[2])
                 self._level.keypads.append(new_keypad)
                 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)
+            self._level.enemy_generators.append(enemy)
         return self._level
 
     def _load_tile_images(self):
         return self._level
 
     def _load_tile_images(self):
@@ -69,10 +84,12 @@ 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]
                 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
                     # Hack this for now
-                    if layer == 'floor' and 'crawl' in tile[layer]['behaviour']:
+                    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))
 
                         tile['floor image'] = Grate.image(neighbors)
                         self._level.grates.append((x, y))