69 lines
1.5 KiB
Rust
69 lines
1.5 KiB
Rust
|
use rand::Rng;
|
||
|
|
||
|
use crate::{OutfitSet, Projectile};
|
||
|
use galactica_content as content;
|
||
|
|
||
|
#[derive(Debug)]
|
||
|
pub struct Ship {
|
||
|
pub handle: content::ShipHandle,
|
||
|
pub faction: content::FactionHandle,
|
||
|
pub outfits: OutfitSet,
|
||
|
|
||
|
// TODO: unified ship stats struct, like space
|
||
|
// TODO: unified outfit stats struct: check
|
||
|
pub hull: f32,
|
||
|
}
|
||
|
|
||
|
impl Ship {
|
||
|
pub fn new(
|
||
|
ct: &content::Content,
|
||
|
handle: content::ShipHandle,
|
||
|
faction: content::FactionHandle,
|
||
|
outfits: OutfitSet,
|
||
|
) -> Self {
|
||
|
let s = ct.get_ship(handle);
|
||
|
Ship {
|
||
|
handle: handle,
|
||
|
faction,
|
||
|
outfits,
|
||
|
hull: s.hull,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub fn handle_projectile_collision(&mut self, ct: &content::Content, p: &Projectile) -> bool {
|
||
|
let f = ct.get_faction(self.faction);
|
||
|
let r = f.relationships.get(&p.faction).unwrap();
|
||
|
match r {
|
||
|
content::Relationship::Hostile => {
|
||
|
// TODO: implement death and spawning, and enable damage
|
||
|
//s.hull -= p.damage;
|
||
|
return true;
|
||
|
}
|
||
|
_ => return false,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub fn fire_guns(&mut self) -> Vec<(Projectile, content::GunPoint)> {
|
||
|
self.outfits
|
||
|
.iter_guns_points()
|
||
|
.filter(|(g, _)| g.cooldown > 0.0)
|
||
|
.map(|(g, p)| {
|
||
|
let mut rng = rand::thread_rng();
|
||
|
g.cooldown = g.kind.rate + &rng.gen_range(-g.kind.rate_rng..=g.kind.rate_rng);
|
||
|
|
||
|
(
|
||
|
Projectile {
|
||
|
content: g.kind.projectile.clone(),
|
||
|
lifetime: g.kind.projectile.lifetime
|
||
|
+ rng.gen_range(
|
||
|
-g.kind.projectile.lifetime_rng..=g.kind.projectile.lifetime_rng,
|
||
|
),
|
||
|
faction: self.faction,
|
||
|
},
|
||
|
p.clone(),
|
||
|
)
|
||
|
})
|
||
|
.collect()
|
||
|
}
|
||
|
}
|