+ events = world.pop_events()
+ 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)
+ 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)
+ for bullet in list(self._bullets):
+ self._update_bullet(bullet, dt)
+ bullet.pos = self.calc_offset(
+ bullet.game_pos[0] * TILE_SIZE + (TILE_SIZE // 2),
+ bullet.game_pos[1] * TILE_SIZE + (TILE_SIZE // 2))
+ self._check_for_bullet_hits()
+ self._update_player_stats(world)
+ more = self._check_held_keys(dt)
+ if more:
+ events.extend(more)
+ return events
+
+ def _update_player_stats(self, world):
+ self._stats = PlayerStats(world)
+
+ 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
+ if key in (keys.DOWN, keys.UP, keys.LEFT, keys.RIGHT):
+ return self._movement_key(key, dt)
+ elif key == keys.X:
+ return self._fire_key(dt)
+
+ def _movement_key(self, key, dt):
+ x, y = self._player_pos
+ for k, dp, angle in (
+ (keys.DOWN, (0, 1), 180),
+ (keys.UP, (0, -1), 0),
+ (keys.LEFT, (-1, 0), 90),
+ (keys.RIGHT, (1, 0), -90),
+ ):
+ if key == k:
+ 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)
+ offset = (TILE_SIZE * dp[0], TILE_SIZE * dp[1])
+ self._set_angle(angle, dp)
+ self._last_key_down = 0
+ return [MoveViewportEvent(offset)]
+ else:
+ # just turn
+ self._set_angle(angle, dp)
+
+ def _activate_key(self):
+ x, y = self._player_pos
+ if self._level.is_grate(x, y):
+ if (self._level_layer == 'floor' and
+ self._level.can_crawl(x, y, 'floor')):
+ if self._level.can_crawl(x, y, 'tunnels'):
+ self._level_layer = 'tunnels'
+ self._mode = 'crawl'
+ elif self._level.can_crawl(x, y, 'floor'):
+ # Must be in the tunnels already
+ self._level_layer = 'floor'
+ self._mode = 'walk'
+ elif self._level.is_keypad(x, y):
+ self._level.press_keypad(x, y, self._roaches)
+ 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)
+ if item.item_type != "vehicle":
+ 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())]
+
+ def _fire_key(self, dt):
+ if self._last_key_down > self._key_rate:
+ self._last_key_down = 0
+ self._fire_weapon()
+
+ def _vehicle_management_key(self):
+ from .roach_management import RoachesScene
+ return [ChangeSceneEvent(RoachesScene(level_scene=self))]