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; } }