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 ..gamelib.items import clone_old_item, create_new_item
from ..roaches import build_roach
from ..vehicles.base import Vehicle
from ..weapons import weapon_by_name
if len(self._bullets) >= 10:
return
bullet.game_pos = pos
+ bullet.game_dp = dp
+ bullet.dt = 0
+ bullet.level_layer = self._level_layer
self._bullets.add(bullet)
+ def _check_for_bullet_hits(self):
+ for bullet in list(self._bullets):
+ for enemy in list(self._enemies):
+ if enemy.collidepoint(bullet.pos):
+ self._hit_enemy(enemy, bullet.weapon)
+ self._bullets.remove(bullet)
+
+ def _update_bullet(self, bullet, dt):
+ bullet.dt += dt
+ if bullet.dt > 0.1:
+ bullet.dt = 0
+ bullet.game_pos = pos = (
+ bullet.game_pos[0] + bullet.game_dp[0],
+ bullet.game_pos[1] + bullet.game_dp[1])
+ if not self._level.can_bullet(pos[0], pos[1], bullet.level_layer):
+ self._bullets.remove(bullet)
+
@defer_to_update
def _fire_weapon(self, world):
weapon = weapon_by_name(world.weapons.current)
@defer_to_update
def _change_vehicle(self, world):
- vehicle = Vehicle.random()
- world.vehicles.current = vehicle
+ x, y = self._player_pos
+
+ 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):
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 self._bullets:
+ 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[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)
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)
+ 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 [