X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=erdslangetjie%2Flevel.py;h=c722b563873c76034e73548e2a723c1ba0cfdf14;hb=034f4f8a7792ab7f4777d3a13e2ab139b3d7be4a;hp=8efc539e13a08d6b6ab7cafab4bd7fc1715f5197;hpb=4b54ba10f3412990f36ae5608acf892235b77335;p=erdslangetjie.git diff --git a/erdslangetjie/level.py b/erdslangetjie/level.py index 8efc539..c722b56 100644 --- a/erdslangetjie/level.py +++ b/erdslangetjie/level.py @@ -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' @@ -73,9 +86,9 @@ class Level(object): exit_points = 0 for line in self._data: if ENTRY in line: - entry_points += 1 + entry_points += line.count(ENTRY) if EXIT in line: - exit_points += 1 + exit_points += line.count(EXIT) if entry_points == 0: raise RuntimeError('No entry point') if entry_points > 1: @@ -93,17 +106,24 @@ 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(new_type, pos) + new_tile = self._get_tile_image(pos, new_type) self._tiles[pos[1]][pos[0]] = new_tile self._changed.append((pos, new_tile)) # Also update neighbourhood for wall types, etc. for new_pos in [(pos[0] - 1, pos[1]), (pos[0] + 1, pos[1]), - (pos[0], pos[1] - 1), (pos[0], pos[1] + 1)]: + (pos[0] - 1, pos[1] - 1), (pos[0] + 1, pos[1] + 1), + (pos[0], pos[1] - 1), (pos[0], pos[1] + 1), + (pos[0] - 1, pos[1] + 1), (pos[0] + 1, pos[1] - 1)]: if not self._in_limits(new_pos): continue tile = self._data[new_pos[1]][new_pos[0]] - new_tile = self._get_tile_image(tile, pos) + new_tile = self._get_tile_image(new_pos, tile) self._tiles[new_pos[1]][new_pos[0]] = new_tile self._changed.append((new_pos, new_tile)) @@ -113,6 +133,9 @@ class Level(object): def at_exit(self, pos): return pos in self.exit_pos + def get_level_data(self): + return '\n'.join(reversed([''.join(x) for x in self._data])) + def _get_wall_tile(self, pos): # Is the neighbour in this direction also a wall? x, y = pos @@ -188,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 @@ -231,15 +254,23 @@ class LevelList(object): def __init__(self): self.levels = [] + self.errors = [] 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 = Level(level_file) level_file.close() + try: + level.validate() + self.levels.append(level) + except RuntimeError as err: + self.errors.append( + 'Invalid level %s in level_list: %s' % (line, err)) else: - print '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 @@ -249,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()