2024-01-11 11:28:11 -08:00

58 lines
1.3 KiB
Rust

use galactica_content::{FactionHandle, Projectile};
use rand::Rng;
use rapier2d::{dynamics::RigidBodyHandle, geometry::ColliderHandle};
/// A single projectile in this sim
#[derive(Debug, Clone)]
pub struct SySimProjectile {
/// This projectile's game data
pub content: Projectile,
/// The remaining lifetime of this projectile, in seconds
pub lifetime: f32,
/// The faction this projectile belongs to
pub faction: FactionHandle,
/// This projectile's rigidbody
pub rigid_body: RigidBodyHandle,
/// This projectile's collider
pub collider: ColliderHandle,
/// This projectile's size variation
pub size_rng: f32,
}
impl SySimProjectile {
/// Create a new projectile
pub fn new(
content: Projectile, // TODO: use a handle
rigid_body: RigidBodyHandle,
faction: FactionHandle,
collider: ColliderHandle,
) -> Self {
let mut rng = rand::thread_rng();
let size_rng = content.size_rng;
let lifetime = content.lifetime;
SySimProjectile {
rigid_body,
collider,
content,
lifetime,
faction,
size_rng: rng.gen_range(-size_rng..=size_rng),
}
}
/// Process this projectile's state after `t` seconds
pub fn tick(&mut self, t: f32) {
self.lifetime -= t;
}
/// Has this projectile expired?
pub fn is_expired(&self) -> bool {
return self.lifetime < 0.0;
}
}