use std::ops::{Index, IndexMut}; use glc::{matrix::Angle, vector::Vector2f}; use serde::{Deserialize, Serialize}; use specs::{Component, VecStorage}; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Ship { pub type_: Type, pub agility: Angle, pub target_pos: Vector2f, pub target_dir: Vector2f, } #[derive(Clone, Debug, Default)] pub struct Count { pub fighter: usize, pub bomber: usize, pub transporter: usize, } #[derive(Copy, Clone, Debug, Serialize, Deserialize)] pub enum Type { Fighter, Bomber, Transporter, } impl Component for Ship { type Storage = VecStorage; } impl Index for Count { type Output = usize; fn index(&self, index: Type) -> &Self::Output { match index { Type::Fighter => &self.fighter, Type::Bomber => &self.bomber, Type::Transporter => &self.transporter, } } } impl IndexMut for Count { fn index_mut(&mut self, index: Type) -> &mut Self::Output { match index { Type::Fighter => &mut self.fighter, Type::Bomber => &mut self.bomber, Type::Transporter => &mut self.transporter, } } }