import os
from data import load_image, load, filepath
+
+from kivy.logger import Logger
+
WALL = '.'
FLOOR = ' '
ENTRY = 'E'
class Level(object):
- def __init__(self, levelfile):
+ def __init__(self, levelfile, name):
self._data = []
self.exit_pos = []
self.enter_pos = None
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)
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 = {}
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
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
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[:]
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