Able to consume items.
[koperkapel.git] / koperkapel / scenes / level.py
index a17de55d70ece5aa8a37e2bf88891580eadf728c..735ed28dadde623962fe417b45920b3b9aeba8d4 100644 (file)
@@ -4,7 +4,7 @@ from pgzero.constants import keys
 from pygame import Surface
 import pygame.locals as pgl
 from ..loaders.levelloader import levels
-from .base import Scene, ChangeSceneEvent, MoveViewportEvent, defer_to_update
+from .base import Scene, ChangeSceneEvent, MoveViewportEvent, WorldEvent, defer_to_update
 from ..constants import TILE_SIZE, WIDTH, HEIGHT
 from ..roaches import build_roach
 from ..vehicles.base import Vehicle
@@ -85,15 +85,42 @@ class GameLevelScene(BaseLevelScene):
 
     def enter(self, world):
         if self._level is not None:
+            for generator in self._generators:
+                generator.unpause()
             return
         super().enter(world)
         self._roaches = self.actors.add_layer("roaches", level=10)
         self._friends = self.actors.add_layer("friendly roaches", level=9)
+        self._items = self.actors.add_layer("items", level=9)
+        self._generators = self.actors.add_layer("enemy generators", level=8)
+        self._enemies = self.actors.add_layer("enemies", level=7)
         self._vehicle = Vehicle.current(world)
         self._mode = 'walk'
         self._angle = 0
+        self._init_items()
+        self._init_friendly_roaches()
+        self._init_generators()
         return self._init_roaches(world)
 
+    def _init_items(self):
+        for item in self._level.items:
+            self._items.add(item)
+
+    def _init_friendly_roaches(self):
+        for friend in self._level.friends:
+            self._friends.add(friend)
+
+    def exit(self, world):
+        for generator in self._generators:
+            # We don't want these running while we're on other levels, but we don't want to delete them
+            # here either (because of the vehicle management view)
+            generator.pause()
+
+    def _init_generators(self):
+        for generator in self._level.enemy_generators:
+            self._generators.add(generator)
+            generator.unpause()
+
     def _init_roaches(self, world):
         x, y = self._level.start_pos
         self._level_layer = 'floor'
@@ -101,8 +128,6 @@ class GameLevelScene(BaseLevelScene):
         self._set_pos(x, y)
         self._avatar.pos = (WIDTH // 2, HEIGHT // 2)
         self._roaches.add(self._avatar)
-        for friend in self._level.friends:
-            self._friends.add(friend)
         # Fix viewport offset
         return [
             MoveViewportEvent((
@@ -151,6 +176,9 @@ class GameLevelScene(BaseLevelScene):
         for friend in self._friends:
             friend.pos = self.calc_offset(
                 friend.game_pos[0] * TILE_SIZE, friend.game_pos[1] * TILE_SIZE)
+        for item in self._items:
+            item.pos = self.calc_offset(
+                item.game_pos[0] * TILE_SIZE, item.game_pos[1] * TILE_SIZE)
         return events
 
     def _movement_key(self, key):
@@ -183,10 +211,20 @@ class GameLevelScene(BaseLevelScene):
                 self._mode = 'walk'
         elif self._level.is_keypad(x, y):
             self._level.press_keypad(x, y, self._roaches)
-        elif self._level.is_on_friend(x, y):
-            friend = self._level.remove_friend(x, y)
+        elif self._level.friend_at(x, y):
+            friend = self._level.friend_at(x, y)
+            self._level.remove_friend(friend)
             self._friends.remove(friend)
             self._add_roach()
+        elif self._level.item_at(x, y):
+            item = self._level.item_at(x, y)
+            self._level.remove_item(item)
+            self._items.remove(item)
+        elif self._level.is_exit(x, y):
+            next_level = self._level.get_exit_level()
+            return [
+                WorldEvent('set', {'level.name': next_level}),
+                ChangeSceneEvent(GameLevelScene())]
 
     def _fire_key(self):
         print('Boom')