diff options
Diffstat (limited to 'server/src/game.rs')
| -rw-r--r-- | server/src/game.rs | 52 | 
1 files changed, 40 insertions, 12 deletions
| diff --git a/server/src/game.rs b/server/src/game.rs index c5eb8c9f..c0a03616 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -67,15 +67,39 @@ pub struct Game {  }  impl Game { -    pub fn new(gamedata: Arc<Gamedata>) -> Self { -        let mut g = Self { -            data: gamedata.clone(), +    pub fn new() -> Self { +        Self { +            data: Gamedata::default().into(),              packet_out: Default::default(),              players: Default::default(),              tiles: Default::default(), -        }; -        for (&p, (tile, item)) in &gamedata.initial_map { -            g.tiles.insert( +        } +    } + +    fn unload(&mut self) { +        for (id, _) in self.players.drain() { +            self.packet_out.push_back(PacketC::RemovePlayer { id }) +        } +        for (pos, _) in self.tiles.drain() { +            self.packet_out.push_back(PacketC::UpdateMap { +                tile: pos, +                kind: None, +                neighbors: [None, None, None, None], +            }) +        } +    } +    pub fn load(&mut self, gamedata: Gamedata) { +        let players = self +            .players +            .iter() +            .map(|(id, p)| (*id, (p.name.to_owned(), p.character))) +            .collect::<HashMap<_, _>>(); + +        self.unload(); + +        self.data = gamedata.into(); +        for (&p, (tile, item)) in &self.data.initial_map { +            self.tiles.insert(                  p,                  Tile {                      kind: *tile, @@ -86,7 +110,12 @@ impl Game {                  },              );          } -        g +        for (id, (name, character)) in players { +            self.packet_in(id, PacketS::Join { name, character }) +                .unwrap(); +        } + +        self.packet_out.extend(self.prime_client());      }      pub fn tiles(&self) -> &HashMap<IVec2, Tile> { @@ -97,10 +126,9 @@ impl Game {          self.packet_out.pop_front()      } -    pub fn prime_client(&self, id: PlayerID) -> Vec<PacketC> { +    pub fn prime_client(&self) -> Vec<PacketC> {          let mut out = Vec::new(); -        out.push(PacketC::Init { -            id, +        out.push(PacketC::Data {              data: self.data.deref().to_owned(),          });          for (&id, player) in &self.players { @@ -125,14 +153,14 @@ impl Game {          }          for (&tile, tdata) in &self.tiles {              out.push(PacketC::UpdateMap { -                pos: tile, +                tile,                  neighbors: [                      self.tiles.get(&(tile + IVec2::NEG_Y)).map(|e| e.kind),                      self.tiles.get(&(tile + IVec2::NEG_X)).map(|e| e.kind),                      self.tiles.get(&(tile + IVec2::Y)).map(|e| e.kind),                      self.tiles.get(&(tile + IVec2::X)).map(|e| e.kind),                  ], -                tile: tdata.kind.clone(), +                kind: Some(tdata.kind.clone()),              });              if let Some(item) = &tdata.item {                  out.push(PacketC::SetTileItem { | 
