Merge branch 'master' of ctpug.org.za:koperkapel
[koperkapel.git] / koperkapel / scenes / level.py
index e5de740eac91189febeffd4503ec29193cc3162c..379b8bf705e79ea32127a5681155a0ec28de585e 100644 (file)
@@ -1,6 +1,8 @@
 """Render a level"""
 
+import random
 from pgzero.constants import keys
+from pgzero.loaders import sounds
 from pygame import Surface
 import pygame.locals as pgl
 from ..loaders.levelloader import levels
@@ -139,6 +141,8 @@ class GameLevelScene(BaseLevelScene):
         self._init_generators()
         self._key_rate = 0.2
         self._last_key_down = 0
+        self._last_dmg = 0
+        self._screech = sounds.load("screech")
         return self._init_roaches(world)
 
     def _init_items(self):
@@ -207,6 +211,22 @@ class GameLevelScene(BaseLevelScene):
         world.roaches.append(build_roach(world))
         self._vehicle_changed()
 
+    @defer_to_update
+    def _damage_player(self, world):
+        if not world.roaches:
+            # Skip out if we're already dead
+            return
+        roach = random.choice(world.roaches)
+        roach.health -= self._last_dmg
+        self._screech.play()
+        self._last_dmg = 0
+        if roach.health < 0:
+            index = [x.name for x in world.roaches].index(roach.name)
+            world.roaches.pop(index)
+            # We can't check for empty, because updates will be processed later
+            if len(world.roaches) > 1:
+                self._vehicle_changed()
+
     @defer_to_update
     def _gain_item(self, world, item):
         if item.item_type == "serum":
@@ -293,6 +313,10 @@ class GameLevelScene(BaseLevelScene):
         self._vehicle_changed()
 
     def update(self, world, engine, dt):
+        if not world.roaches:
+            # Catch death here
+            from .menu import MenuScene
+            return [ChangeSceneEvent(MenuScene())]
         super().update(world, engine, dt)
         events = world.pop_events()
         for friend in self._friends:
@@ -301,7 +325,7 @@ class GameLevelScene(BaseLevelScene):
         for item in self._items:
             item.pos = self.calc_offset(
                 item.game_pos[0] * TILE_SIZE, item.game_pos[1] * TILE_SIZE)
-        self._check_enemies()
+        self._check_enemies(dt)
         for enemy in self._enemies:
             enemy.pos = self.calc_offset(
                 enemy.game_pos[0] * TILE_SIZE, enemy.game_pos[1] * TILE_SIZE)
@@ -321,12 +345,18 @@ class GameLevelScene(BaseLevelScene):
     def _update_player_stats(self, world):
         self._stats = PlayerStats(world)
 
-    def _check_enemies(self):
+    def _check_enemies(self, dt):
         if len(self._level.enemies) != len(self._enemies):
             # New nemy has spawned
             for enemy in self._level.enemies:
                 if enemy not in self._enemies:
                     self._enemies.add(enemy)
+        for enemy in self._enemies:
+            dmg = enemy.attack(self._player_pos, self._level_layer, dt)
+            if dmg is not None:
+                self._last_dmg += dmg
+        if self._last_dmg:
+            self._damage_player()
 
     def _check_held_keys(self, dt):
         for key in self._held_keys:
@@ -371,7 +401,7 @@ class GameLevelScene(BaseLevelScene):
                 self._level_layer = 'floor'
                 self._mode = 'walk'
         elif self._level.is_keypad(x, y):
-            self._level.press_keypad(x, y, self._roaches)
+            self._level.press_keypad(x, y, self._stats.smart)
         elif self._level.friend_at(x, y):
             friend = self._level.friend_at(x, y)
             self._level.remove_friend(friend)