use anyhow::Result; use cgmath::Deg; pub(super) mod syntax { use serde::Deserialize; // Raw serde syntax structs. // These are never seen by code outside this crate. #[derive(Debug, Deserialize)] pub struct Gun { pub projectile: Projectile, pub spread: f32, pub rate: f32, pub rate_rng: f32, } #[derive(Debug, Deserialize)] pub struct Projectile { pub sprite: String, pub size: f32, pub size_rng: f32, pub speed: f32, pub speed_rng: f32, pub lifetime: f32, pub lifetime_rng: f32, } } #[derive(Debug, Clone)] pub struct Gun { pub name: String, pub projectile: Projectile, pub spread: Deg, pub rate: f32, pub rate_rng: f32, } #[derive(Debug, Clone)] pub struct Projectile { pub sprite: String, pub size: f32, pub size_rng: f32, pub speed: f32, pub speed_rng: f32, pub lifetime: f32, pub lifetime_rng: f32, } impl super::Build for Gun { fn build(root: &super::syntax::Root) -> Result> { let gun = if let Some(gun) = &root.gun { gun } else { return Ok(vec![]); }; let mut out = Vec::new(); for (gun_name, gun) in gun { out.push(Self { name: gun_name.to_owned(), spread: Deg(gun.spread), rate: gun.rate, rate_rng: gun.rate_rng, projectile: Projectile { sprite: gun.projectile.sprite.to_owned(), size: gun.projectile.size, size_rng: gun.projectile.size_rng, speed: gun.projectile.speed, speed_rng: gun.projectile.speed_rng, lifetime: gun.projectile.lifetime, lifetime_rng: gun.projectile.lifetime_rng, }, }); } return Ok(out); } }