Tweak and resize floor and door tiles
[erdslangetjie.git] / erdslangetjie / level.py
index a2c2a2dadc1b8044676574d8c60d9134e84b6b5a..d42cc71ea4b92f5eaf748a8633a1627eda3ef762 100644 (file)
@@ -1,30 +1,91 @@
 # The level object
 
-from data import load_image
+import os
+from data import load_image, load, filepath
 
 
 class Level(object):
 
-    def __init__(self):
-        self.data = []
-
-    def load(self, levelfile):
-        """Load the level"""
+    def __init__(self, levelfile):
         self.data = []
-        for line in levelfile.readlines():
-            self.data.append(list(line))
+        self.exit_pos = []
+        self.enter_pos = None
+        self.tiles = []
+        # Because of how kivy's coordinate system works,
+        # we reverse the lines so things match up between
+        # the file and the display (top of file == top of display)
+        for line in reversed(levelfile.readlines()):
+            self.data.append(list(line.strip('\n')))
 
-    def get_tiles(self):
-        """Return a list of tiles for the level"""
-        tiles = []
+    def load_tiles(self):
+        """Load the list of tiles for the level"""
+        self.tiles = []
+        self.exit_pos = []
+        self.enter_pos = None
         for j, line in enumerate(self.data):
             tile_line = []
             for i, c in enumerate(line):
                 if c == ' ':
-                    tile_line.append(load_image('tiles/floor.bmp'))
+                    tile_line.append(load_image('tiles/floor.png'))
                 elif c == '.':
                     tile_line.append(load_image('tiles/wall.bmp'))
                 elif c == 'E' or c == 'X':
-                    tile_line.append(load_image('tiles/door.bmp'))
-            tiles.append(tile_line)
-        return tiles
+                    if c == 'E':
+                        if self.enter_pos:
+                            raise RuntimeError('Multiple entry points')
+                        self.enter_pos = (i, j)
+                    else:
+                        self.exit_pos.append((i, j))
+                    tile_line.append(load_image('tiles/door.png'))
+            self.tiles.append(tile_line)
+
+    def get_tiles(self):
+        return self.tiles
+
+    def get_size(self):
+        return len(self.tiles[0]), len(self.tiles)
+
+    def at_exit(self, pos):
+        return pos in self.exit_pos
+
+    def blocked(self, pos):
+        if pos[0] < 0:
+            return True
+        if pos[1] < 0:
+            return True
+        try:
+            tile = self.data[pos[1]][pos[0]]
+        except IndexError:
+            return True
+        if tile == '.':
+            return True
+        return False
+
+
+class LevelList(object):
+
+    LEVELS = 'level_list'
+
+    def __init__(self):
+        self.levels = []
+        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_file.close()
+            else:
+                print 'Level list includes non-existant level %s' % line
+        level_list.close()
+        self._cur_level = 0
+
+    def get_current_level(self):
+        if self._cur_level < len(self.levels):
+            return self.levels[self._cur_level]
+        else:
+            return None
+
+    def advance_to_next_level(self):
+        self._cur_level += 1
+        return self.get_current_level()