Fix enemy respawning. Slow rate a bit
[koperkapel.git] / koperkapel / gamelib / level.py
index 01c260e7d5859cd836cbc52a336116f8fe7398c6..34487af920d67e5ce59f97ddc5b8d0d1bb085fa2 100644 (file)
 """ 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 = (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 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, roaches):
+        for keypad in self.keypads:
+            if (x, y) == keypad.game_pos:
+                keypad.activate(roaches)
+
+    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)