components.rs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. extern crate specs;
  2. use specs::prelude::*;
  3. extern crate specs_derive;
  4. extern crate rltk;
  5. use rltk::{RGB};
  6. use serde::{Serialize, Deserialize};
  7. use specs::saveload::{Marker, ConvertSaveload};
  8. use specs::error::NoError;
  9. #[derive(Component, Serialize, Deserialize, Clone)]
  10. pub struct Position {
  11. pub x: i32,
  12. pub y: i32,
  13. }
  14. #[derive(Component, Serialize, Deserialize, Clone)]
  15. pub struct Renderable {
  16. pub glyph: u8,
  17. pub fg: RGB,
  18. pub bg: RGB,
  19. pub render_order : i32
  20. }
  21. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  22. pub struct Player {}
  23. #[derive(Component, Serialize, Deserialize, Clone)]
  24. pub struct Viewshed {
  25. pub visible_tiles : Vec<rltk::Point>,
  26. pub range : i32,
  27. pub dirty : bool
  28. }
  29. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  30. pub struct Monster {}
  31. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  32. pub struct Name {
  33. pub name : String
  34. }
  35. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  36. pub struct BlocksTile {}
  37. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  38. pub struct CombatStats {
  39. pub max_hp : i32,
  40. pub hp : i32,
  41. pub defense : i32,
  42. pub power : i32
  43. }
  44. // See wrapper below for serialization
  45. #[derive(Component, Debug)]
  46. pub struct WantsToMelee {
  47. pub target : Entity
  48. }
  49. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  50. pub struct SufferDamage {
  51. pub amount : i32
  52. }
  53. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  54. pub struct Item {}
  55. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  56. pub struct Consumable {}
  57. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  58. pub struct Ranged {
  59. pub range : i32
  60. }
  61. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  62. pub struct InflictsDamage {
  63. pub damage : i32
  64. }
  65. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  66. pub struct AreaOfEffect {
  67. pub radius : i32
  68. }
  69. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  70. pub struct Confusion {
  71. pub turns : i32
  72. }
  73. #[derive(Component, Debug, Serialize, Deserialize, Clone)]
  74. pub struct ProvidesHealing {
  75. pub heal_amount : i32
  76. }
  77. // See wrapper below for serialization
  78. #[derive(Component, Debug)]
  79. pub struct InBackpack {
  80. pub owner : Entity
  81. }
  82. // See wrapper below for serialization
  83. #[derive(Component, Debug)]
  84. pub struct WantsToPickupItem {
  85. pub collected_by : Entity,
  86. pub item : Entity
  87. }
  88. // See wrapper below for serialization
  89. #[derive(Component, Debug)]
  90. pub struct WantsToUseItem {
  91. pub item : Entity,
  92. pub target : Option<rltk::Point>
  93. }
  94. // See wrapper below for serialization
  95. #[derive(Component, Debug)]
  96. pub struct WantsToDropItem {
  97. pub item : Entity
  98. }
  99. // Serialization helper code. We need to implement ConvertSaveLoad for each type that contains an
  100. // Entity.
  101. pub struct SerializeMe;
  102. // WantsToMelee wrapper
  103. #[derive(Serialize, Deserialize, Clone)]
  104. pub struct WantsToMeleeData<M>(M);
  105. impl<M: Marker + Serialize> ConvertSaveload<M> for WantsToMelee
  106. where
  107. for<'de> M: Deserialize<'de>,
  108. {
  109. type Data = WantsToMeleeData<M>;
  110. type Error = NoError;
  111. fn convert_into<F>(&self, mut ids: F) -> Result<Self::Data, Self::Error>
  112. where
  113. F: FnMut(Entity) -> Option<M>,
  114. {
  115. let marker = ids(self.target).unwrap();
  116. Ok(WantsToMeleeData(marker))
  117. }
  118. fn convert_from<F>(data: Self::Data, mut ids: F) -> Result<Self, Self::Error>
  119. where
  120. F: FnMut(M) -> Option<Entity>,
  121. {
  122. let entity = ids(data.0).unwrap();
  123. Ok(WantsToMelee{target: entity})
  124. }
  125. }
  126. // InBackpack wrapper
  127. #[derive(Serialize, Deserialize, Clone)]
  128. pub struct InBackpackData<M>(M);
  129. impl<M: Marker + Serialize> ConvertSaveload<M> for InBackpack
  130. where
  131. for<'de> M: Deserialize<'de>,
  132. {
  133. type Data = InBackpackData<M>;
  134. type Error = NoError;
  135. fn convert_into<F>(&self, mut ids: F) -> Result<Self::Data, Self::Error>
  136. where
  137. F: FnMut(Entity) -> Option<M>,
  138. {
  139. let marker = ids(self.owner).unwrap();
  140. Ok(InBackpackData(marker))
  141. }
  142. fn convert_from<F>(data: Self::Data, mut ids: F) -> Result<Self, Self::Error>
  143. where
  144. F: FnMut(M) -> Option<Entity>,
  145. {
  146. let entity = ids(data.0).unwrap();
  147. Ok(InBackpack{owner: entity})
  148. }
  149. }
  150. // WantsToPickupItem wrapper
  151. #[derive(Serialize, Deserialize, Clone)]
  152. pub struct WantsToPickupItemData<M>(M, M);
  153. impl<M: Marker + Serialize> ConvertSaveload<M> for WantsToPickupItem
  154. where
  155. for<'de> M: Deserialize<'de>,
  156. {
  157. type Data = WantsToPickupItemData<M>;
  158. type Error = NoError;
  159. fn convert_into<F>(&self, mut ids: F) -> Result<Self::Data, Self::Error>
  160. where
  161. F: FnMut(Entity) -> Option<M>,
  162. {
  163. let marker = ids(self.collected_by).unwrap();
  164. let marker2 = ids(self.item).unwrap();
  165. Ok(WantsToPickupItemData(marker, marker2))
  166. }
  167. fn convert_from<F>(data: Self::Data, mut ids: F) -> Result<Self, Self::Error>
  168. where
  169. F: FnMut(M) -> Option<Entity>,
  170. {
  171. let collected_by = ids(data.0).unwrap();
  172. let item = ids(data.1).unwrap();
  173. Ok(WantsToPickupItem{collected_by, item})
  174. }
  175. }
  176. // WantsToUseItem wrapper
  177. #[derive(Serialize, Deserialize, Clone)]
  178. pub struct WantsToUseItemData<M>(M, Option<rltk::Point>);
  179. impl<M: Marker + Serialize> ConvertSaveload<M> for WantsToUseItem
  180. where
  181. for<'de> M: Deserialize<'de>,
  182. {
  183. type Data = WantsToUseItemData<M>;
  184. type Error = NoError;
  185. fn convert_into<F>(&self, mut ids: F) -> Result<Self::Data, Self::Error>
  186. where
  187. F: FnMut(Entity) -> Option<M>,
  188. {
  189. let marker = ids(self.item).unwrap();
  190. Ok(WantsToUseItemData(marker, self.target))
  191. }
  192. fn convert_from<F>(data: Self::Data, mut ids: F) -> Result<Self, Self::Error>
  193. where
  194. F: FnMut(M) -> Option<Entity>,
  195. {
  196. let item = ids(data.0).unwrap();
  197. let target = data.1;
  198. Ok(WantsToUseItem{item, target})
  199. }
  200. }
  201. // WantsToDropItem wrapper
  202. #[derive(Serialize, Deserialize, Clone)]
  203. pub struct WantsToDropItemData<M>(M);
  204. impl<M: Marker + Serialize> ConvertSaveload<M> for WantsToDropItem
  205. where
  206. for<'de> M: Deserialize<'de>,
  207. {
  208. type Data = WantsToDropItemData<M>;
  209. type Error = NoError;
  210. fn convert_into<F>(&self, mut ids: F) -> Result<Self::Data, Self::Error>
  211. where
  212. F: FnMut(Entity) -> Option<M>,
  213. {
  214. let marker = ids(self.item).unwrap();
  215. Ok(WantsToDropItemData(marker))
  216. }
  217. fn convert_from<F>(data: Self::Data, mut ids: F) -> Result<Self, Self::Error>
  218. where
  219. F: FnMut(M) -> Option<Entity>,
  220. {
  221. let entity = ids(data.0).unwrap();
  222. Ok(WantsToDropItem{item: entity})
  223. }
  224. }