X-Git-Url: https://git.ctpug.org.za/?p=koperkapel.git;a=blobdiff_plain;f=koperkapel%2Fscenes%2Flevel.py;h=379b8bf705e79ea32127a5681155a0ec28de585e;hp=e5de740eac91189febeffd4503ec29193cc3162c;hb=57cda86d1aa60e04e3dd7567439cd79cd95f3e1a;hpb=6dc9622bbfa588b84a77616b53cc75bb95b1ba16 diff --git a/koperkapel/scenes/level.py b/koperkapel/scenes/level.py index e5de740..379b8bf 100644 --- a/koperkapel/scenes/level.py +++ b/koperkapel/scenes/level.py @@ -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)