- if key == keys.DOWN:
- if self._can_move(x, y + 1):
- self._set_pos(x, y + 1)
- offset = (0, TILE_SIZE)
- self._set_angle(180)
- elif key == keys.UP:
- if self._can_move(x, y - 1):
- self._set_pos(x, y - 1)
- offset = (0, -TILE_SIZE)
- self._set_angle(0)
- elif key == keys.LEFT:
- if self._can_move(x - 1, y):
- self._set_pos(x - 1, y)
- offset = (-TILE_SIZE, 0)
- self._set_angle(90)
- elif key == keys.RIGHT:
- if self._can_move(x + 1, y):
- self._set_pos(x + 1, y)
- offset = (TILE_SIZE, 0)
- self._set_angle(270)
- elif key == keys.S:
- if self._level_layer == 'floor' and self._level.can_crawl(x, y, 'floor'):
- # We're probably on a grate
+
+ old_vehicle = world.vehicles.current
+
+ item = self._level.item_at(x, y)
+
+ if item and item.item_type == "vehicle":
+ world.vehicles.current = item.item_data["vehicle"]
+ self._level.remove_item(item)
+ self._items.remove(item)
+ else:
+ world.vehicles.current = "walking"
+
+ if old_vehicle != "walking":
+ dropped_vehicle = create_new_item(
+ "vehicle", (x, y), vehicle=old_vehicle)
+ self._level.items.append(dropped_vehicle)
+ self._items.add(dropped_vehicle)
+
+ self._vehicle_changed()
+
+ def update(self, world, engine, dt):
+ super().update(world, engine, dt)
+ 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()
+ 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
+ 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')):