Add placeholder images for button and grate
[erdslangetjie.git] / erdslangetjie / level.py
index 8efc539e13a08d6b6ab7cafab4bd7fc1715f5197..2974b88b349adddc1bda0e41e072b0978f0d177b 100644 (file)
@@ -73,9 +73,9 @@ class Level(object):
         exit_points = 0
         for line in self._data:
             if ENTRY in line:
-                entry_points += 1
+                entry_points += line.count(ENTRY)
             if EXIT in line:
-                exit_points += 1
+                exit_points += line.count(EXIT)
         if entry_points == 0:
             raise RuntimeError('No entry point')
         if entry_points > 1:
@@ -94,16 +94,18 @@ class Level(object):
 
     def set_tile_type(self, pos, new_type):
         self._data[pos[1]][pos[0]] = new_type
-        new_tile = self._get_tile_image(new_type, pos)
+        new_tile = self._get_tile_image(pos, new_type)
         self._tiles[pos[1]][pos[0]] = new_tile
         self._changed.append((pos, new_tile))
         # Also update neighbourhood for wall types, etc.
         for new_pos in [(pos[0] - 1, pos[1]), (pos[0] + 1, pos[1]),
-                (pos[0], pos[1] - 1), (pos[0], pos[1] + 1)]:
+                (pos[0] - 1, pos[1] - 1), (pos[0] + 1, pos[1] + 1),
+                (pos[0], pos[1] - 1), (pos[0], pos[1] + 1),
+                (pos[0] - 1, pos[1] + 1), (pos[0] + 1, pos[1] - 1)]:
             if not self._in_limits(new_pos):
                 continue
             tile = self._data[new_pos[1]][new_pos[0]]
-            new_tile = self._get_tile_image(tile, pos)
+            new_tile = self._get_tile_image(new_pos, tile)
             self._tiles[new_pos[1]][new_pos[0]] = new_tile
             self._changed.append((new_pos, new_tile))
 
@@ -113,6 +115,9 @@ class Level(object):
     def at_exit(self, pos):
         return pos in self.exit_pos
 
+    def get_level_data(self):
+        return '\n'.join(reversed([''.join(x) for x in self._data]))
+
     def _get_wall_tile(self, pos):
         # Is the neighbour in this direction also a wall?
         x, y = pos
@@ -231,15 +236,23 @@ class LevelList(object):
 
     def __init__(self):
         self.levels = []
+        self.errors = []
         level_list = load(self.LEVELS)
         for line in level_list:
             line = line.strip()
             if os.path.exists(filepath(line)):
                 level_file = load(line)
-                self.levels.append(Level(level_file))
+                level = Level(level_file)
                 level_file.close()
+                try:
+                    level.validate()
+                    self.levels.append(level)
+                except RuntimeError as err:
+                    self.errors.append(
+                            'Invalid level %s in level_list: %s' % (line, err))
             else:
-                print 'Level list includes non-existant level %s' % line
+                self.errors.append(
+                    'Level list includes non-existant level %s' % line)
         level_list.close()
         self._cur_level = 0
 
@@ -249,6 +262,9 @@ class LevelList(object):
         else:
             return None
 
+    def get_errors(self):
+        return self.errors
+
     def advance_to_next_level(self):
         self._cur_level += 1
         return self.get_current_level()