from pygame import Surface
import pygame.locals as pgl
from ..loaders.levelloader import levels
-from .base import Scene, ChangeSceneEvent, MoveViewportEvent, WorldEvent, defer_to_update
+from .base import (
+ Scene, ChangeSceneEvent, MoveViewportEvent, WorldEvent, defer_to_update)
from ..constants import TILE_SIZE, WIDTH, HEIGHT
+from ..gamelib.items import clone_old_item
from ..roaches import build_roach
from ..vehicles.base import Vehicle
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)
+ # 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):
def _can_move(self, x, y):
if self._mode == 'walk':
- return self._level.can_walk(x, y, self._level_layer)
+ if not self._level.enemy_at(x, y):
+ return self._level.can_walk(x, y, self._level_layer)
+ return False
elif self._mode == 'fly':
return self._level.can_fly(x, y, self._level_layer)
elif self._mode == 'crawl':
world.roaches.append(build_roach(world))
self._vehicle_changed()
+ @defer_to_update
+ def _gain_item(self, world, item):
+ if item.item_type == "serum":
+ world.serums.append(item.item_data["serum"])
+ elif item.item_type == "weapon":
+ old_weapon = world.weapons.current
+ world.weapons.current = item.item_data["weapon"]
+ if old_weapon != "spit":
+ clone = clone_old_item(item, weapon=old_weapon)
+ self._level.items.append(clone)
+ self._items.add(clone)
+ self._vehicle_changed()
+
@defer_to_update
def _change_vehicle(self, world):
vehicle = Vehicle.random()
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()
+ for enemy in self._enemies:
+ enemy.pos = self.calc_offset(
+ enemy.game_pos[0] * TILE_SIZE, enemy.game_pos[1] * TILE_SIZE)
more = self._check_held_keys(dt)
if more:
events.extend(more)
return events
+ def _check_enemies(self):
+ 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)
+
def _check_held_keys(self, dt):
for key in self._held_keys:
self._last_key_down += dt
(keys.RIGHT, (1, 0), -90),
):
if key == k:
- if self._angle == angle and self._last_key_down > self._key_rate:
+ if (self._angle == angle and
+ self._last_key_down > self._key_rate):
nx, ny = x + dp[0], y + dp[1]
if self._can_move(nx, ny):
self._set_pos(nx, ny)
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)
+ self._gain_item(item)
elif self._level.is_exit(x, y):
next_level = self._level.get_exit_level()
- return [WorldEvent('set', {'level.name': next_level}), ChangeSceneEvent(GameLevelScene())]
+ return [
+ WorldEvent('set', {'level.name': next_level}),
+ ChangeSceneEvent(GameLevelScene())]
def _fire_key(self, dt):
if self._last_key_down > self._key_rate:
if key in (keys.DOWN, keys.UP, keys.LEFT, keys.RIGHT):
self._held_keys.clear()
self._held_keys.add(key)
- # We do this so pressing the key has an instant effect, and can then be held
+ # We do this so pressing the key has an instant effect, and can
+ # then be held
self._last_key_down = self._key_rate + 0.01
return self._movement_key(key, 0.01)
elif key == keys.C: