58 lines
1.3 KiB
Rust
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;
|
|
}
|
|
}
|