Refactor
[erdslangetjie.git] / erdslangetjie / level.py
index e4bc0e09a58072ea9c28dccdd2e4f8a790d9a6fb..c722b563873c76034e73548e2a723c1ba0cfdf14 100644 (file)
@@ -43,10 +43,6 @@ class Level(object):
             self._tiles.append(tile_line)
 
     def _get_tile_image(self, pos, c):
-        if pos in self._gates:
-            del self._gates[pos]
-        if pos in self._buttons:
-            del self._buttons[pos]
         image = None
         if c == FLOOR:
             image = load_image('tiles/floor.png')
@@ -59,8 +55,25 @@ class Level(object):
             self.exit_pos.append(pos)
             image = load_image('tiles/door.png')
         elif c == GATE:
-            image = load_image('tiles/gate_down.png')
-            self._gates[pos] = -1  # down
+            if pos not in self._gates:
+                self._gates[pos] = -1  # down
+                image = load_image('tiles/gate_down.png')
+            else:
+                state = self._gates[pos]
+                if state == -1:
+                    image = load_image('tiles/gate_down.png')
+                elif state == 0:
+                    # destroyed
+                    image = load_image('tiles/floor.png')
+                elif state == 1:
+                    # badly damaged
+                    image = load_image('tiles/gate_dented.png')
+                elif state == 2:
+                    # lightly damaged
+                    image = load_image('tiles/gate_bent.png')
+                else:
+                    # gate up
+                    image = load_image('tiles/gate_up.png')
         elif c == BUTTON:
             image = load_image('tiles/button.png')
             self._buttons[pos] = 'active'
@@ -93,6 +106,11 @@ class Level(object):
         return self._data[pos[1]][pos[0]]
 
     def set_tile_type(self, pos, new_type):
+        # Setting the type resets any state anyway, so
+        if pos in self._gates:
+            del self._gates[pos]
+        if pos in self._buttons:
+            del self._buttons[pos]
         self._data[pos[1]][pos[0]] = new_type
         new_tile = self._get_tile_image(pos, new_type)
         self._tiles[pos[1]][pos[0]] = new_tile
@@ -193,7 +211,7 @@ class Level(object):
         if tile == WALL or tile == ENTRY:
             return True
         if tile == GATE:
-            if self._gates[pos] != 'down':
+            if self._gates[pos] != -1:
                 return True
         return False
 
@@ -236,6 +254,7 @@ class LevelList(object):
 
     def __init__(self):
         self.levels = []
+        self.errors = []
         level_list = load(self.LEVELS)
         for line in level_list:
             line = line.strip()
@@ -245,12 +264,13 @@ class LevelList(object):
                 level_file.close()
                 try:
                     level.validate()
+                    self.levels.append(level)
                 except RuntimeError as err:
-                    raise RuntimeError(
+                    self.errors.append(
                             'Invalid level %s in level_list: %s' % (line, err))
-                self.levels.append(level)
             else:
-                raise RuntimeError('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
 
@@ -260,6 +280,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()