a754f29c80e996d9be2a238393116c9911805a42
[koperkapel.git] / koperkapel / gamelib / level.py
1 """ Class holding the level info """
2
3 from .keypad import Keypad
4 from .door import Door
5
6
7 class Level(object):
8
9     def __init__(self):
10         self.width = self.height = 0
11         self.tiles = []
12         self.keypads = []
13         self.doors = []
14         self.grates = []
15         self.tileset = None
16         self.start_pos = (0, 0)
17         self.exit = None
18         self.enemies = []
19         self.friends = []
20
21     def get_neighbors(self, x, y):
22         # 4 -connected neighbors
23         return [self.tiles[y][x-1] if x > 0 else None,
24                 self.tiles[y][x+1] if x < self.width - 1 else None,
25                 self.tiles[y-1][x] if y > 0 else None,
26                 self.tiles[y+1][x] if y < self.height- 1 else None,
27                ]
28
29     def can_walk(self, x, y, layer):
30         if 'walk' in self.tiles[y][x][layer]['behaviour']:
31             # check doors
32             for door in self.doors:
33                 if (x, y) == door.game_pos and door.is_closed():
34                     return False
35             return True
36         return False
37
38     def can_fly(self, x, y, layer):
39         if 'fly' in self.tiles[y][x][layer]['behaviour']:
40             for door in self.doors:
41                 if (x, y) == door.game_pos and door.is_closed():
42                     return False
43             return True
44
45         return False
46
47     def can_crawl(self, x, y, layer):
48         return 'crawl' in self.tiles[y][x][layer]['behaviour']
49
50     def is_keypad(self, x, y):
51         for keypad in self.keypads:
52             if (x, y) == keypad.game_pos:
53                 return True
54         return False
55
56     def is_grate(self, x, y):
57         if (x, y) in self.grates:
58             return True
59         return False
60
61     def press_keypad(self, x, y, roaches):
62         for keypad in self.keypads:
63             if (x, y) == keypad.game_pos:
64                 keypad.activate(roaches)
65
66     def get_friends(self):
67         return self._friends[:]
68
69     def is_on_friend(self, x, y):
70         return (x, y) in [x.game_pos for x in self.friends]
71
72     def remove_friend(self, x, y):
73         for friend in self.friends[:]:
74             if friend.game_pos == (x, y):
75                 self.friends.remove(friend)
76                 return friend
77         return None
78
79     def is_exit(self, x, y):
80         return self.exit and (x, y) == tuple(self.exit["pos"])
81
82     def get_exit_level(self):
83         return self.exit["next level"]