X-Git-Url: https://git.ctpug.org.za/?p=erdslangetjie.git;a=blobdiff_plain;f=erdslangetjie%2Flevel.py;h=9ebb6f4912525a3f0f34c7589badbb80cf3525af;hp=fc23cc626238bb965d69eea370098cffad96293f;hb=HEAD;hpb=fc96c547809f3929f08f963435fc3f90ecc6e88c diff --git a/erdslangetjie/level.py b/erdslangetjie/level.py index fc23cc6..9ebb6f4 100644 --- a/erdslangetjie/level.py +++ b/erdslangetjie/level.py @@ -3,6 +3,9 @@ import os from data import load_image, load, filepath + +from kivy.logger import Logger + WALL = '.' FLOOR = ' ' ENTRY = 'E' @@ -13,7 +16,7 @@ BUTTON = 'B' class Level(object): - def __init__(self, levelfile): + def __init__(self, levelfile, name): self._data = [] self.exit_pos = [] self.enter_pos = None @@ -21,6 +24,7 @@ class Level(object): self._changed = [] self._gates = {} self._buttons = {} + self._name = name # 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) @@ -29,6 +33,7 @@ class Level(object): def load_tiles(self): """Load the list of tiles for the level""" + Logger.info('%s: load tiles' % self._name) self._tiles = [] self._gates = {} self._buttons = {} @@ -228,8 +233,7 @@ class Level(object): if tile == WALL or tile == ENTRY: return True if tile == GATE: - print tile, pos, self._gates[pos] - if self._gates[pos] != -1: + if self._gates[pos] > 0: return True return False @@ -237,11 +241,20 @@ class Level(object): return abs(pos1[0] - pos2[0]) + abs(pos1[1] - pos2[1]) def is_gate(self, pos): + if not self._in_limits(pos): + return False return self._data[pos[1]][pos[0]] == GATE def is_button(self, pos): + if not self._in_limits(pos): + return False return self._data[pos[1]][pos[0]] == BUTTON + def is_wall(self, pos): + if not self._in_limits(pos): + return True + return self._data[pos[1]][pos[0]] == WALL + def trigger_button(self, pos): if not self.is_button(pos): return False @@ -256,20 +269,18 @@ class Level(object): gate_pos = cand mindist = dist if gate_pos: - self._buttons[pos] == 'pressed' + self._buttons[pos] = 'pressed' self._gates[gate_pos] = 3 # Raise gate self._fix_tile(pos) self._fix_tile(gate_pos) def damage_gate(self, pos): if not self.is_gate(pos): - return False + return if self._gates[pos] == -1 or self._gates[pos] == 0: - return False + return self._gates[pos] = self._gates[pos] - 1 - self._fix_gate_tile(pos) - self._changed.append((pos, self.get_single_tile(pos))) - return True + self._fix_tile(pos) def get_changed_tiles(self): ret = self._changed[:] @@ -282,35 +293,44 @@ class LevelList(object): LEVELS = 'level_list' def __init__(self): - self.levels = [] - self.errors = [] + self._levels = [] + self._level_names = [] + 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) - level = Level(level_file) + level = Level(level_file, line) level_file.close() try: level.validate() - self.levels.append(level) + self._levels.append(level) + self._level_names.append(line) except RuntimeError as err: - self.errors.append( + self._errors.append( 'Invalid level %s in level_list: %s' % (line, err)) else: - self.errors.append( + self._errors.append( '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] + if self._cur_level < len(self._levels): + return self._levels[self._cur_level] else: return None def get_errors(self): - return self.errors + return self._errors + + def get_level_names(self): + return self._level_names + + def set_level_to(self, level_name): + if level_name in self._level_names: + self._cur_level = self._level_names.index(level_name) def advance_to_next_level(self): self._cur_level += 1