summaryrefslogtreecommitdiff
path: root/server/src/game.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-06-25 23:34:10 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-25 23:34:10 +0200
commit4dc15a1e86ef1ae985fdf36f1a84d07b1de99ea7 (patch)
tree6a262cd2be9abee480adda3e367c7f8abf8845d6 /server/src/game.rs
parent84c90e84a1e0d6cd2eae36fd8888354b4e23c354 (diff)
downloadhurrycurry-4dc15a1e86ef1ae985fdf36f1a84d07b1de99ea7.tar
hurrycurry-4dc15a1e86ef1ae985fdf36f1a84d07b1de99ea7.tar.bz2
hurrycurry-4dc15a1e86ef1ae985fdf36f1a84d07b1de99ea7.tar.zst
server can change map at runtime
Diffstat (limited to 'server/src/game.rs')
-rw-r--r--server/src/game.rs52
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 {