Merge branch 'master' of ctpug.org.za:koperkapel
authorSimon Cross <hodgestar@gmail.com>
Sat, 5 Mar 2016 22:56:13 +0000 (00:56 +0200)
committerSimon Cross <hodgestar@gmail.com>
Sat, 5 Mar 2016 22:56:13 +0000 (00:56 +0200)
1  2 
koperkapel/scenes/level.py

index e5de740eac91189febeffd4503ec29193cc3162c,3b3b315fbbbeb9ac5e11308dd2b29690cfd6b0d6..379b8bf705e79ea32127a5681155a0ec28de585e
@@@ -1,6 -1,8 +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
@@@ -8,7 -10,6 +10,7 @@@ from .base import 
      Scene, ChangeSceneEvent, MoveViewportEvent, WorldEvent, defer_to_update)
  from ..constants import TILE_SIZE, WIDTH, HEIGHT
  from ..gamelib.items import clone_old_item, create_new_item
 +from ..hud import HudActor
  from ..roaches import build_roach
  from ..vehicles.base import Vehicle
  from ..weapons import weapon_by_name
@@@ -26,13 -27,6 +28,13 @@@ class PlayerStats
          return "<PlayerStats health=%d smart=%d fast=%d strong=%d>" % (
              self.health, self.smart, self.fast, self.strong)
  
 +    def __eq__(self, other):
 +        if not isinstance(other, PlayerStats):
 +            return NotImplemented
 +        return all(
 +            (self.health == other.health, self.smart == other.smart,
 +             self.fast == other.fast, self.strong == other.strong))
 +
      def _count_attr(self, attr, roaches):
          attrs = [r[attr] for r in roaches]
          attrs = [a for a in attrs if a]
@@@ -127,9 -121,6 +129,9 @@@ class GameLevelScene(BaseLevelScene)
          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=11)
 +        self._hud = self.actors.add_layer("hud", level=12)
 +        self._hud.add(HudActor(
 +            self._stats, anchor=("right", "bottom"), pos=(WIDTH, HEIGHT)))
          self._vehicle = Vehicle.current(world)
          self._mode = 'walk'
          self._angle = 0  # up
          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):
          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":
          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:
          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)
                  bullet.game_pos[1] * TILE_SIZE + (TILE_SIZE // 2))
          self._check_for_bullet_hits()
          self._update_player_stats(world)
 +        self._hud[0].stats = self._stats
          more = self._check_held_keys(dt)
          if more:
              events.extend(more)
      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:
                  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)