The enemies are a threat (sort of)
[koperkapel.git] / koperkapel / scenes / level.py
index 22662a2513017d5fea8c9848cc762f2cfea0fa18..54041baa7cc20e863e0c0457ba8a9cbe70a77b47 100644 (file)
@@ -1,5 +1,6 @@
 """Render a level"""
 
+import random
 from pgzero.constants import keys
 from pygame import Surface
 import pygame.locals as pgl
@@ -128,6 +129,7 @@ class GameLevelScene(BaseLevelScene):
         self._init_generators()
         self._key_rate = 0.2
         self._last_key_down = 0
+        self._last_dmg = 0
         return self._init_roaches(world)
 
     def _init_items(self):
@@ -196,6 +198,21 @@ 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._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":
@@ -282,6 +299,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:
@@ -290,7 +311,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)
@@ -309,12 +330,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: