""" Class holding the level info """
+import random
+
class Level(object):
def __init__(self):
self.width = self.height = 0
self.tiles = []
+ self.keypads = []
+ self.doors = []
+ self.grates = []
self.tileset = None
- self.start_pos = None
+ self.start_pos = (0, 0)
+ self.exit = None
+ self.enemies = []
+ self.enemy_generators = []
+ self.friends = []
def get_neighbors(self, x, y):
# 4 -connected neighbors
return [self.tiles[y][x-1] if x > 0 else None,
self.tiles[y][x+1] if x < self.width - 1 else None,
self.tiles[y-1][x] if y > 0 else None,
- self.tiles[y+1][x] if y < self.height- 1 else None,
- ]
+ self.tiles[y+1][x] if y < self.height - 1 else None]
def can_walk(self, x, y, layer):
- return 'walk' in self.tiles[y][x][layer]['behaviour']
+ if 'walk' in self.tiles[y][x][layer]['behaviour']:
+ # check doors
+ for door in self.doors:
+ if (x, y) == door.game_pos and door.is_closed():
+ return False
+ return True
+ return False
def can_fly(self, x, y, layer):
- return 'fly' in self.tiles[y][x][layer]['behaviour']
+ if 'fly' in self.tiles[y][x][layer]['behaviour']:
+ for door in self.doors:
+ if (x, y) == door.game_pos and door.is_closed():
+ return False
+ return True
+
+ return False
+
+ def can_crawl(self, x, y, layer):
+ return 'crawl' in self.tiles[y][x][layer]['behaviour']
+
+ def can_bullet(self, x, y, layer):
+ if self.tiles[y][x][layer]['behaviour']:
+ for door in self.doors:
+ if (x, y) == door.game_pos and door.is_closed():
+ return False
+ return True
+ return False
+
+ def is_keypad(self, x, y):
+ for keypad in self.keypads:
+ if (x, y) == keypad.game_pos:
+ return True
+ return False
+
+ def is_grate(self, x, y):
+ if (x, y) in self.grates:
+ return True
+ return False
+
+ def press_keypad(self, x, y, smart):
+ for keypad in self.keypads:
+ if (x, y) == keypad.game_pos:
+ keypad.activate(smart)
+
+ def get_friends(self):
+ return self._friends[:]
+
+ def friend_at(self, x, y):
+ for f in self.friends:
+ if f.game_pos == (x, y):
+ return f
+
+ def remove_friend(self, friend):
+ self.friends.remove(friend)
+
+ def item_at(self, x, y):
+ for i in self.items:
+ if i.game_pos == (x, y):
+ return i
+
+ def remove_item(self, item):
+ self.items.remove(item)
+
+ def is_exit(self, x, y):
+ return self.exit and (x, y) == tuple(self.exit["pos"])
+
+ def get_exit_level(self):
+ return self.exit["next level"]
+
+ def enemy_at(self, x, y):
+ for enemy in self.enemies:
+ if (x, y) == enemy.game_pos:
+ return True
+ return False
+
+ def get_enemy(self, x, y):
+ for enemy in self.enemies:
+ if (x, y) == enemy.game_pos:
+ return enemy
+ return None
+
+ def remove_enemy(self, enemy):
+ self.enemies.remove(enemy)
+ for generator in self.enemy_generators:
+ generator.killed(enemy)
+
+ def add_enemy(self, enemy, x, y):
+ """Add an enemy to an empty floor space near x, y"""
+ added = False
+ while not added:
+ if self.can_walk(x, y, 'floor'):
+ if not self.friend_at(x, y):
+ if not self.enemy_at(x, y):
+ added = True
+ enemy.game_pos = (x, y)
+ self.enemies.append(enemy)
+ added = True
+ x += random.randint(-1, 1)
+ y += random.randint(-1, 1)