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.

102 satır
2.7 KiB

  1. use specs::{
  2. saveload::MarkedBuilder, world::EntitiesRes, Builder, Entity, LazyUpdate, World, WorldExt,
  3. WriteStorage,
  4. };
  5. use crate::{
  6. components::{Fleet, FleetMoving, FleetOrbiting, PlayerOwned},
  7. misc::{Persistence, WorldPersistence},
  8. };
  9. use super::Error;
  10. #[derive(Default, Clone)]
  11. pub struct FleetBuilder {
  12. player: Option<Entity>,
  13. state: Option<State>,
  14. }
  15. #[derive(Clone)]
  16. enum State {
  17. Orbiting(Entity),
  18. Moving(Entity),
  19. }
  20. impl FleetBuilder {
  21. pub fn build(&self, world: &mut World) -> Result<Entity, Error> {
  22. let player = self.player.ok_or(Error::MissingValue("player"))?;
  23. let state = self.state.as_ref().ok_or(Error::MissingValue("state"))?;
  24. let player_owned = PlayerOwned::new(player);
  25. let fleet = Fleet::new();
  26. let builder = world
  27. .create_entity()
  28. .marked::<<WorldPersistence as Persistence>::Marker>()
  29. .with(player_owned)
  30. .with(fleet);
  31. let builder = match state {
  32. State::Moving(target) => builder.with(FleetMoving::new(*target)),
  33. State::Orbiting(meeting_point) => builder.with(FleetOrbiting::new(*meeting_point)),
  34. };
  35. let entity = builder.build();
  36. Ok(entity)
  37. }
  38. pub fn lazy(
  39. &self,
  40. lazy: &LazyUpdate,
  41. entities: &EntitiesRes,
  42. players_owned: &mut WriteStorage<'_, PlayerOwned>,
  43. fleets: &mut WriteStorage<'_, Fleet>,
  44. fleets_moving: &mut WriteStorage<'_, FleetMoving>,
  45. fleets_orbiting: &mut WriteStorage<'_, FleetOrbiting>,
  46. ) -> Result<Entity, Error> {
  47. let player = self.player.ok_or(Error::MissingValue("player"))?;
  48. let state = self.state.as_ref().ok_or(Error::MissingValue("state"))?;
  49. let player_owned = PlayerOwned::new(player);
  50. let fleet = Fleet::new();
  51. let entity = lazy
  52. .create_entity(entities)
  53. .marked::<<WorldPersistence as Persistence>::Marker>()
  54. .build();
  55. players_owned.insert(entity, player_owned)?;
  56. fleets.insert(entity, fleet)?;
  57. match state {
  58. State::Moving(target) => {
  59. fleets_moving.insert(entity, FleetMoving::new(*target))?;
  60. }
  61. State::Orbiting(meeting_point) => {
  62. fleets_orbiting.insert(entity, FleetOrbiting::new(*meeting_point))?;
  63. }
  64. };
  65. Ok(entity)
  66. }
  67. pub fn player(mut self, player: Entity) -> Self {
  68. self.player = Some(player);
  69. self
  70. }
  71. pub fn orbiting(mut self, meeting_point: Entity) -> Self {
  72. self.state = Some(State::Orbiting(meeting_point));
  73. self
  74. }
  75. pub fn moving(mut self, target: Entity) -> Self {
  76. self.state = Some(State::Moving(target));
  77. self
  78. }
  79. }