X-Git-Url: https://git.ctpug.org.za/?p=erdslangetjie.git;a=blobdiff_plain;f=erdslangetjie%2Flevel.py;h=925974cf5dcdd6bdff124027a0ac10a0a582310b;hp=a2c2a2dadc1b8044676574d8c60d9134e84b6b5a;hb=7226f363830b124ffc4f6b9a8a1a254a07b54be2;hpb=bbbe943d8b35fd351814aaef8f73a171c0f600b3 diff --git a/erdslangetjie/level.py b/erdslangetjie/level.py index a2c2a2d..925974c 100644 --- a/erdslangetjie/level.py +++ b/erdslangetjie/level.py @@ -1,30 +1,150 @@ # 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): - self.data = [] +class Level(object): - 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')) - 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 == 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.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