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.

107 satır
2.5 KiB

  1. use std::any::type_name;
  2. use serde::{de::Deserializer, ser::Serializer};
  3. use shred::{Fetch, FetchMut, Resource};
  4. use shrev::{Event, EventChannel, ReaderId};
  5. use specs::{saveload::SimpleMarker, World};
  6. use crate::{
  7. components::{
  8. Asteroid, FleetOrbiting, FleetOwned, MeetingPoint, Obstacle, Planet, Player, PlayerOwned,
  9. Position, Ship, ShipMoving, ShipOrbiting,
  10. },
  11. Error,
  12. };
  13. use super::Persistence;
  14. /* WorldHelper */
  15. pub trait WorldHelper {
  16. fn resource<R>(&self) -> Result<Fetch<R>, Error>
  17. where
  18. R: Resource;
  19. fn resource_mut<R>(&self) -> Result<FetchMut<R>, Error>
  20. where
  21. R: Resource;
  22. fn register_event_reader<E>(&self) -> Result<ReaderId<E>, Error>
  23. where
  24. E: Event;
  25. fn serialize<T, S>(&self, persistence: T, serializer: S) -> Result<(), S::Error>
  26. where
  27. T: Persistence,
  28. S: Serializer;
  29. fn deserialize<'de, T, D>(&self, persistence: T, deserializer: D) -> Result<(), D::Error>
  30. where
  31. T: Persistence,
  32. D: Deserializer<'de>;
  33. }
  34. impl WorldHelper for World {
  35. fn resource<R>(&self) -> Result<Fetch<R>, Error>
  36. where
  37. R: Resource,
  38. {
  39. self.try_fetch::<R>()
  40. .ok_or_else(|| Error::ResourceNotRegistered(type_name::<R>()))
  41. }
  42. fn resource_mut<R>(&self) -> Result<FetchMut<R>, Error>
  43. where
  44. R: Resource,
  45. {
  46. self.try_fetch_mut::<R>()
  47. .ok_or_else(|| Error::ResourceNotRegistered(type_name::<R>()))
  48. }
  49. fn register_event_reader<E>(&self) -> Result<ReaderId<E>, Error>
  50. where
  51. E: Event,
  52. {
  53. Ok(self.resource_mut::<EventChannel<E>>()?.register_reader())
  54. }
  55. fn serialize<T, S>(&self, persistence: T, serializer: S) -> Result<(), S::Error>
  56. where
  57. T: Persistence,
  58. S: Serializer,
  59. {
  60. persistence.serialize(self, serializer)
  61. }
  62. fn deserialize<'de, T, D>(&self, persistence: T, deserializer: D) -> Result<(), D::Error>
  63. where
  64. T: Persistence,
  65. D: Deserializer<'de>,
  66. {
  67. persistence.deserialize(self, deserializer)
  68. }
  69. }
  70. /* WorldPersistence */
  71. pub struct WorldPersistence;
  72. pub struct PersistWorldMarker;
  73. impl Persistence for WorldPersistence {
  74. type Marker = SimpleMarker<PersistWorldMarker>;
  75. type Components = (
  76. Position,
  77. Player,
  78. PlayerOwned,
  79. FleetOwned,
  80. FleetOrbiting,
  81. Ship,
  82. ShipMoving,
  83. ShipOrbiting,
  84. Obstacle,
  85. MeetingPoint,
  86. Planet,
  87. Asteroid,
  88. );
  89. }