25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

134 satır
2.6 KiB

  1. use glc::vector::Vector3f;
  2. use serde::{Deserialize, Serialize};
  3. use specs::{
  4. error::NoError,
  5. saveload::{ConvertSaveload, Marker},
  6. Component, Entity, HashMapStorage,
  7. };
  8. use crate::{
  9. builder::PlayerBuilder,
  10. components::{ShipData, ShipType, ShipsData},
  11. constants::{SHIPS_DATA_FIGHTER, SHIPS_DATA_RESEARCHER, SHIPS_DATA_TRADER},
  12. };
  13. #[derive(Clone, Debug, Serialize, Deserialize)]
  14. pub struct Player {
  15. index: usize,
  16. race: Race,
  17. color: Vector3f,
  18. #[serde(skip)]
  19. ships_data: ShipsData,
  20. }
  21. #[derive(Copy, Clone, Debug, Serialize, Deserialize)]
  22. pub enum Race {
  23. Fighter,
  24. Trader,
  25. Researcher,
  26. }
  27. #[derive(Copy, Clone, Debug)]
  28. pub struct PlayerOwned {
  29. owner: Entity,
  30. }
  31. #[derive(Serialize, Deserialize)]
  32. pub struct PlayerOwnedData<M> {
  33. pub owner: M,
  34. }
  35. /* Player */
  36. impl Player {
  37. #[inline]
  38. pub fn builder() -> PlayerBuilder {
  39. PlayerBuilder::default()
  40. }
  41. #[inline]
  42. pub fn index(&self) -> usize {
  43. self.index
  44. }
  45. #[inline]
  46. pub fn color(&self) -> &Vector3f {
  47. &self.color
  48. }
  49. #[inline]
  50. pub fn ship_data(&self, type_: ShipType) -> &ShipData {
  51. &self.ships_data[type_]
  52. }
  53. #[inline]
  54. pub fn ships_data(&self) -> &ShipsData {
  55. &self.ships_data
  56. }
  57. }
  58. impl Player {
  59. #[inline]
  60. pub(crate) fn new(index: usize, race: Race, color: Vector3f) -> Self {
  61. Self {
  62. index,
  63. race,
  64. color,
  65. ships_data: match race {
  66. Race::Fighter => SHIPS_DATA_FIGHTER,
  67. Race::Trader => SHIPS_DATA_TRADER,
  68. Race::Researcher => SHIPS_DATA_RESEARCHER,
  69. },
  70. }
  71. }
  72. }
  73. impl Component for Player {
  74. type Storage = HashMapStorage<Self>;
  75. }
  76. /* PlayerOwned */
  77. impl PlayerOwned {
  78. pub fn owner(&self) -> Entity {
  79. self.owner
  80. }
  81. }
  82. impl PlayerOwned {
  83. pub(crate) fn new(owner: Entity) -> Self {
  84. Self { owner }
  85. }
  86. }
  87. impl Component for PlayerOwned {
  88. type Storage = HashMapStorage<Self>;
  89. }
  90. impl<M> ConvertSaveload<M> for PlayerOwned
  91. where
  92. for<'de> M: Marker + Serialize + Deserialize<'de>,
  93. {
  94. type Data = PlayerOwnedData<M>;
  95. type Error = NoError;
  96. fn convert_into<F>(&self, mut ids: F) -> Result<Self::Data, Self::Error>
  97. where
  98. F: FnMut(Entity) -> Option<M>,
  99. {
  100. let owner = ids(self.owner).unwrap();
  101. Ok(PlayerOwnedData { owner })
  102. }
  103. fn convert_from<F>(data: Self::Data, mut ids: F) -> Result<Self, Self::Error>
  104. where
  105. F: FnMut(M) -> Option<Entity>,
  106. {
  107. let owner = ids(data.owner).unwrap();
  108. Ok(PlayerOwned { owner })
  109. }
  110. }