# The level object
-from data import load_image
+import os
+from data import load_image, load, filepath
+
+WALL = '.'
+FLOOR = ' '
+ENTRY = 'E'
+EXIT = 'X'
class Level(object):
- def __init__(self):
+ def __init__(self, levelfile):
self.data = []
self.exit_pos = []
self.enter_pos = None
self.tiles = []
-
- def load(self, levelfile):
- """Load the level"""
- self.data = []
- for line in levelfile.readlines():
+ # 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 load_tiles(self):
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'))
- elif c == '.':
- tile_line.append(load_image('tiles/wall.bmp'))
- elif c == 'E' or c == 'X':
- if c == 'E':
+ if c == FLOOR:
+ tile_line.append(load_image('tiles/floor.png'))
+ elif c == WALL:
+ tile_line.append(self.get_wall_tile(i, j))
+ elif c == ENTRY or c == EXIT:
+ if c == ENTRY:
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.bmp'))
+ 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 get_wall_tile(self, x, y):
+ # Is the neighbour in this direction also a wall?
+ left = right = top = bottom = False
+ if x == 0:
+ left = True
+ elif self.data[y][x - 1] == WALL:
+ left = True
+ if x == len(self.data[0]) - 1:
+ right = True
+ elif self.data[y][x + 1] == WALL:
+ right = True
+ if y == 0:
+ top = True
+ elif self.data[y - 1][x] == WALL:
+ top = True
+ if y == len(self.data) - 1:
+ bottom = True
+ elif self.data[y + 1][x] == WALL:
+ bottom = True
+ if top and bottom and left and right:
+ return load_image('tiles/cwall.png')
+ elif bottom and left and right:
+ return load_image('tiles/bottom_wall.png')
+ elif top and left and right:
+ return load_image('tiles/top_wall.png')
+ elif top and bottom and right:
+ return load_image('tiles/left_wall.png')
+ elif top and bottom and left:
+ return load_image('tiles/right_wall.png')
+ elif top and bottom:
+ return load_image('tiles/vert_wall.png')
+ elif left and right:
+ return load_image('tiles/horiz_wall.png')
+ elif left and top:
+ return load_image('tiles/corner_lt.png')
+ elif left and bottom:
+ return load_image('tiles/corner_lb.png')
+ elif right and top:
+ return load_image('tiles/corner_rt.png')
+ elif right and bottom:
+ return load_image('tiles/corner_rb.png')
+ elif top:
+ return load_image('tiles/end_top.png')
+ elif bottom:
+ return load_image('tiles/end_bottom.png')
+ elif left:
+ return load_image('tiles/end_right.png')
+ elif right:
+ return load_image('tiles/end_left.png')
+ return load_image('tiles/pillar.png')
+
+ 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()
+
+ def reset(self):
+ self._cur_level = 0