Tweak and resize floor and door tiles
[erdslangetjie.git] / erdslangetjie / level.py
1 # The level object
2
3 import os
4 from data import load_image, load, filepath
5
6
7 class Level(object):
8
9     def __init__(self, levelfile):
10         self.data = []
11         self.exit_pos = []
12         self.enter_pos = None
13         self.tiles = []
14         # Because of how kivy's coordinate system works,
15         # we reverse the lines so things match up between
16         # the file and the display (top of file == top of display)
17         for line in reversed(levelfile.readlines()):
18             self.data.append(list(line.strip('\n')))
19
20     def load_tiles(self):
21         """Load the list of tiles for the level"""
22         self.tiles = []
23         self.exit_pos = []
24         self.enter_pos = None
25         for j, line in enumerate(self.data):
26             tile_line = []
27             for i, c in enumerate(line):
28                 if c == ' ':
29                     tile_line.append(load_image('tiles/floor.png'))
30                 elif c == '.':
31                     tile_line.append(load_image('tiles/wall.bmp'))
32                 elif c == 'E' or c == 'X':
33                     if c == 'E':
34                         if self.enter_pos:
35                             raise RuntimeError('Multiple entry points')
36                         self.enter_pos = (i, j)
37                     else:
38                         self.exit_pos.append((i, j))
39                     tile_line.append(load_image('tiles/door.png'))
40             self.tiles.append(tile_line)
41
42     def get_tiles(self):
43         return self.tiles
44
45     def get_size(self):
46         return len(self.tiles[0]), len(self.tiles)
47
48     def at_exit(self, pos):
49         return pos in self.exit_pos
50
51     def blocked(self, pos):
52         if pos[0] < 0:
53             return True
54         if pos[1] < 0:
55             return True
56         try:
57             tile = self.data[pos[1]][pos[0]]
58         except IndexError:
59             return True
60         if tile == '.':
61             return True
62         return False
63
64
65 class LevelList(object):
66
67     LEVELS = 'level_list'
68
69     def __init__(self):
70         self.levels = []
71         level_list = load(self.LEVELS)
72         for line in level_list:
73             line = line.strip()
74             if os.path.exists(filepath(line)):
75                 level_file = load(line)
76                 self.levels.append(Level(level_file))
77                 level_file.close()
78             else:
79                 print 'Level list includes non-existant level %s' % line
80         level_list.close()
81         self._cur_level = 0
82
83     def get_current_level(self):
84         if self._cur_level < len(self.levels):
85             return self.levels[self._cur_level]
86         else:
87             return None
88
89     def advance_to_next_level(self):
90         self._cur_level += 1
91         return self.get_current_level()