Skip to content

Commit

Permalink
made tracking bullets time out by explode
Browse files Browse the repository at this point in the history
  • Loading branch information
mkhan45 committed Apr 20, 2020
1 parent fd532b0 commit c532320
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 18 deletions.
2 changes: 0 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@ opt-level = 3

[profile.release]
lto = "fat"
default-features = false

[features]
default = ["print_fps"]
draw_hitboxes = []
print_fps = []
10 changes: 5 additions & 5 deletions src/ecs/components.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ pub enum BulletType {
BasicBullet,
AimedBullet,
PredictBullet,
TrackingBullet,
TrackingBullet(u16),
BouncingBullet(u8),
}

Expand Down Expand Up @@ -141,15 +141,15 @@ pub fn new_bullet(ty: BulletType, pos: Point, vel: Vector, damages_who: DamagesW
BulletType::BasicBullet => 1,
BulletType::AimedBullet => 1,
BulletType::PredictBullet => 1,
BulletType::TrackingBullet => 1,
BulletType::TrackingBullet(_) => 1,
BulletType::BouncingBullet(_) => 1,
};

let sprite_index = match ty {
BulletType::BasicBullet => 0,
BulletType::AimedBullet => 1,
BulletType::PredictBullet => 2,
BulletType::TrackingBullet => 3,
BulletType::TrackingBullet(_) => 3,
BulletType::PlayerBullet => 1,
BulletType::BouncingBullet(_) => 4,
};
Expand All @@ -159,7 +159,7 @@ pub fn new_bullet(ty: BulletType, pos: Point, vel: Vector, damages_who: DamagesW
| BulletType::BasicBullet
| BulletType::AimedBullet
| BulletType::PredictBullet
| BulletType::TrackingBullet
| BulletType::TrackingBullet(_)
| BulletType::BouncingBullet(_) => (Point::new(5.0, 5.0), 15.0, 15.0),
};

Expand Down Expand Up @@ -224,7 +224,7 @@ pub fn new_enemy(ty: EnemyType, pos: Point, movement: MovementType) -> EnemyTupl
EnemyType::BasicEnemy2 => (5, (55.0, 43.0), BulletType::BasicBullet, 90),
EnemyType::AimEnemy => (3, (55.0, 43.0), BulletType::AimedBullet, 180),
EnemyType::PredictEnemy => (3, (55.0, 43.0), BulletType::PredictBullet, 90),
EnemyType::TrackingEnemy => (3, (55.0, 43.0), BulletType::TrackingBullet, 180),
EnemyType::TrackingEnemy => (3, (55.0, 43.0), BulletType::TrackingBullet(5 * 60), 180),
EnemyType::AimEnemy2 => (5, (55.0, 43.0), BulletType::AimedBullet, 90),
EnemyType::BounceEnemy => (3, (55.0, 43.0), BulletType::BouncingBullet(2), 180),
};
Expand Down
4 changes: 2 additions & 2 deletions src/ecs/systems/enemy_systems.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,10 @@ impl<'a> System<'a> for EnemyShootSys {
let vel = match bullet_type {
BulletType::PlayerBullet => unreachable!(),
BulletType::BasicBullet => [0.0, 8.0].into(),
BulletType::AimedBullet | BulletType::TrackingBullet => {
BulletType::AimedBullet | BulletType::TrackingBullet(_) => {
let speed = match bullet_type {
BulletType::AimedBullet => 9.0,
BulletType::TrackingBullet => 5.0,
BulletType::TrackingBullet(_) => 5.0,
_ => unreachable!(),
};
(player_pos - pos).normalize() * speed
Expand Down
66 changes: 57 additions & 9 deletions src/ecs/systems/misc_systems.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,21 +154,69 @@ impl<'a> System<'a> for BulletTrackingSys {
type SystemData = (
WriteStorage<'a, Velocity>,
ReadStorage<'a, Position>,
ReadStorage<'a, Bullet>,
WriteStorage<'a, Bullet>,
Read<'a, PlayerEntity>,
Read<'a, AnimatedSprites>,
Read<'a, Sounds>,
Write<'a, QueuedSounds>,
Entities<'a>,
Read<'a, LazyUpdate>,
);

fn run(&mut self, (mut vels, positions, bullets, player_entity): Self::SystemData) {
fn run(
&mut self,
(
mut vels,
positions,
mut bullets,
player_entity,
animated_sprites,
sounds,
mut queued_sounds,
entities,
lazy_update,
): Self::SystemData,
) {
if let Some(player_pos) = positions.get(player_entity.0) {
let player_pos = player_pos.0;
(&mut vels, &positions, &bullets)
.par_join()
.filter(|(_, _, bullet)| bullet.ty == BulletType::TrackingBullet)
.for_each(|(vel, pos, _)| {
let direction = (player_pos - pos.0).normalize();
let target_vel = direction * 8.0;
vel.0 += (target_vel - vel.0) * 0.02;
let mut atleast_one_explosion = std::sync::atomic::AtomicBool::new(false);
let explosion_sprite = animated_sprites
.0
.get("explosion")
.expect("error getting explosion sprite");

(&mut vels, &positions, &mut bullets, &entities)
.join()
.for_each(|(vel, pos, bullet, entity)| {
let mut new_ty: Option<BulletType> = None;
if let BulletType::TrackingBullet(frames_remaining) = bullet.ty {
if frames_remaining == 0 {
let explosion_entity = entities.create();
lazy_update.insert(explosion_entity, *pos);
lazy_update.insert(explosion_entity, explosion_sprite.clone());
entities
.delete(entity)
.expect("error deleting dead tracking bullet");
*atleast_one_explosion.get_mut() = true;
return;
}
new_ty = Some(BulletType::TrackingBullet(frames_remaining - 1));
let direction = (player_pos - pos.0).normalize();
let target_vel = direction * 8.0;
vel.0 += (target_vel - vel.0) * 0.02;
}
if let Some(ty) = new_ty {
bullet.ty = ty;
}
});

if atleast_one_explosion.into_inner() {
if let Some(explosion_sound) = sounds.0.get("boom") {
queued_sounds.0.push(explosion_sound.clone());
} else {
log::warn!("error getting explosion sound");
}
}
}
}
}
Expand Down

0 comments on commit c532320

Please sign in to comment.