You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.2 KiB

  1. use std::ops::{Index, IndexMut};
  2. use glc::{matrix::Angle, vector::Vector2f};
  3. use serde::{Deserialize, Serialize};
  4. use specs::{Component, VecStorage};
  5. #[derive(Clone, Debug, Serialize, Deserialize)]
  6. pub struct Ship {
  7. pub type_: Type,
  8. pub agility: Angle<f32>,
  9. pub target_pos: Vector2f,
  10. pub target_dir: Vector2f,
  11. }
  12. #[derive(Clone, Debug, Default)]
  13. pub struct Count {
  14. pub fighter: usize,
  15. pub bomber: usize,
  16. pub transporter: usize,
  17. }
  18. #[derive(Copy, Clone, Debug, Serialize, Deserialize)]
  19. pub enum Type {
  20. Fighter,
  21. Bomber,
  22. Transporter,
  23. }
  24. impl Component for Ship {
  25. type Storage = VecStorage<Self>;
  26. }
  27. impl Index<Type> for Count {
  28. type Output = usize;
  29. fn index(&self, index: Type) -> &Self::Output {
  30. match index {
  31. Type::Fighter => &self.fighter,
  32. Type::Bomber => &self.bomber,
  33. Type::Transporter => &self.transporter,
  34. }
  35. }
  36. }
  37. impl IndexMut<Type> for Count {
  38. fn index_mut(&mut self, index: Type) -> &mut Self::Output {
  39. match index {
  40. Type::Fighter => &mut self.fighter,
  41. Type::Bomber => &mut self.bomber,
  42. Type::Transporter => &mut self.transporter,
  43. }
  44. }
  45. }