X-Git-Url: https://git.ctpug.org.za/?p=erdslangetjie.git;a=blobdiff_plain;f=erdslangetjie%2Flevel.py;h=fc23cc626238bb965d69eea370098cffad96293f;hp=c722b563873c76034e73548e2a723c1ba0cfdf14;hb=fc96c547809f3929f08f963435fc3f90ecc6e88c;hpb=034f4f8a7792ab7f4777d3a13e2ab139b3d7be4a diff --git a/erdslangetjie/level.py b/erdslangetjie/level.py index c722b56..fc23cc6 100644 --- a/erdslangetjie/level.py +++ b/erdslangetjie/level.py @@ -75,8 +75,13 @@ class Level(object): # gate up image = load_image('tiles/gate_up.png') elif c == BUTTON: - image = load_image('tiles/button.png') - self._buttons[pos] = 'active' + if not pos in self._buttons: + image = load_image('tiles/button.png') + self._buttons[pos] = 'active' + elif self._buttons[pos] == 'active': + image = load_image('tiles/button.png') + else: + image = load_image('tiles/floor.png') if image is None: raise RuntimeError('Unknown tile type %s at %s' % (c, pos)) return image @@ -84,17 +89,25 @@ class Level(object): def validate(self): entry_points = 0 exit_points = 0 + gates = 0 + buttons = 0 for line in self._data: if ENTRY in line: entry_points += line.count(ENTRY) if EXIT in line: exit_points += line.count(EXIT) + if BUTTON in line: + buttons += line.count(BUTTON) + if GATE in line: + gates += line.count(GATE) if entry_points == 0: raise RuntimeError('No entry point') if entry_points > 1: raise RuntimeError('Multiple entry points') if exit_points == 0: raise RuntimeError('No exit') + if gates != buttons: + raise RuntimeError('The number of buttons and gates differ') def get_tiles(self): return self._tiles @@ -122,10 +135,14 @@ class Level(object): (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(new_pos, tile) - self._tiles[new_pos[1]][new_pos[0]] = new_tile - self._changed.append((new_pos, new_tile)) + # Update display to changed status + self._fix_tile(new_pos) + + def _fix_tile(self, pos): + tile = self._data[pos[1]][pos[0]] + new_tile = self._get_tile_image(pos, tile) + self._tiles[pos[1]][pos[0]] = new_tile + self._changed.append((pos, new_tile)) def get_size(self): return len(self._tiles[0]), len(self._tiles) @@ -211,10 +228,14 @@ 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: return True return False + def calc_dist(self, pos1, pos2): + return abs(pos1[0] - pos2[0]) + abs(pos1[1] - pos2[1]) + def is_gate(self, pos): return self._data[pos[1]][pos[0]] == GATE @@ -227,10 +248,18 @@ class Level(object): if not self._buttons[pos] == 'active': return False # Find the closest gate down gate and trigger it - gate_pos = pos - - self._changed.append((pos, self.get_single_tile(pos))) - self._changed.append((gate_pos, self.get_single_tile(pos))) + mindist = 99999 + gate_pos = None + for cand in self._gates: + dist = self.calc_dist(pos, cand) + if dist < mindist: + gate_pos = cand + mindist = dist + if gate_pos: + 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):