From 32dd60bca02cf2cfccc8d4309691df9f2f84398c Mon Sep 17 00:00:00 2001 From: troido Date: Tue, 18 Feb 2020 02:27:21 +0100 Subject: refactoring: roomid is now a type, not string anymore --- src/main.rs | 14 ++++++++------ src/persistence.rs | 17 +++++++++-------- src/playerid.rs | 8 ++++++++ src/playerstate.rs | 35 +++++++++++++++++++++-------------- src/room.rs | 22 +++++++++++----------- src/roomid.rs | 15 +++++++++++++++ 6 files changed, 72 insertions(+), 39 deletions(-) create mode 100644 src/roomid.rs diff --git a/src/main.rs b/src/main.rs index 73c26ca..6b92077 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,13 +24,15 @@ mod encyclopedia; mod template; mod roomtemplate; mod savestate; +mod playerid; mod defaultencyclopedia; mod playerstate; -mod playerid; +mod roomid; mod persistence; pub use self::pos::Pos; pub use self::playerid::PlayerId; +pub use self::roomid::RoomId; use self::gameserver::GameServer; use self::server::unixserver::UnixServer; @@ -63,7 +65,7 @@ fn main() { let mut room = gen_room(); let storage = FileStorage::new(FileStorage::savedir().expect("couldn't find any save directory")); - if let Ok(state) = storage.load_room("room".to_string()) { + if let Ok(state) = storage.load_room(RoomId::from_str("room")) { room.load_saved(&state); println!("loaded saved state successfully"); } else { @@ -83,9 +85,9 @@ fn main() { Action::Join(player) => { let state = match storage.load_player(player.clone()) { Ok(state) => state, - Err(_) => PlayerState::new(player.name.clone()) + Err(_) => PlayerState::new(player.clone()) }; - room.add_player(player.clone(), &state); + room.add_player(&state); } Action::Leave(player) => { if let Err(err) = storage.save_player(player.clone(), room.remove_player(player).unwrap()) { @@ -97,7 +99,7 @@ fn main() { room.set_input(inputs); room.update(); if count % 50 == 0 { - if let Err(err) = storage.save_room(room.name.clone(), room.save()) { + if let Err(err) = storage.save_room(room.id.clone(), room.save()) { println!("{:?}",err); } else { println!("{}", room.save().to_json()); @@ -122,7 +124,7 @@ fn main() { fn gen_room<'a, 'b>() -> Room<'a, 'b> { let assemblages = default_encyclopedia(); - let mut room = Room::new("room", assemblages); + let mut room = Room::new(RoomId::from_str("room"), assemblages); let roomtemplate = RoomTemplate::from_json(&json!({ "width": 42, diff --git a/src/persistence.rs b/src/persistence.rs index 7c15ec0..07ff89b 100644 --- a/src/persistence.rs +++ b/src/persistence.rs @@ -6,6 +6,7 @@ use serde_json; use serde_json::Value; use crate::{ PlayerId, + RoomId, savestate::SaveState, playerstate::PlayerState, util::Result, @@ -14,11 +15,11 @@ use crate::{ pub trait PersistentStorage { - fn load_room(&self, name: String) -> Result; + fn load_room(&self, id: RoomId) -> Result; fn load_player(&self, id: PlayerId) -> Result; - fn save_room(&self, name: String, state: SaveState) -> Result<()>; + fn save_room(&self, id: RoomId, state: SaveState) -> Result<()>; fn save_player(&self, id: PlayerId, sate: PlayerState) -> Result<()>; @@ -57,10 +58,10 @@ impl FileStorage { impl PersistentStorage for FileStorage { - fn load_room(&self, name: String) -> Result { + fn load_room(&self, id: RoomId) -> Result { let mut path = self.directory.clone(); path.push("rooms"); - let fname = name + ".save.json"; + let fname = id.to_string() + ".save.json"; path.push(fname); let text = fs::read_to_string(path)?; let json: Value = serde_json::from_str(&text)?; @@ -70,18 +71,18 @@ impl PersistentStorage for FileStorage { fn load_player(&self, id: PlayerId) -> Result { let mut path = self.directory.clone(); path.push("players"); - let fname = id.name + ".save.json"; + let fname = id.to_string() + ".save.json"; path.push(fname); let text = fs::read_to_string(path)?; let json: Value = serde_json::from_str(&text)?; PlayerState::from_json(&json).ok_or(aerr!("not a valid save state")) } - fn save_room(&self, name: String, state: SaveState) -> Result<()> { + fn save_room(&self, id: RoomId, state: SaveState) -> Result<()> { let mut path = self.directory.clone(); path.push("rooms"); fs::create_dir_all(&path)?; - let fname = name + ".save.json"; + let fname = id.to_string() + ".save.json"; path.push(fname); let text = state.to_json().to_string(); // todo: write to a temp file first @@ -93,7 +94,7 @@ impl PersistentStorage for FileStorage { let mut path = self.directory.clone(); path.push("players"); fs::create_dir_all(&path)?; - let fname = id.name + ".save.json"; + let fname = id.to_string() + ".save.json"; path.push(fname); let text = state.to_json().to_string(); // todo: write to a temp file first diff --git a/src/playerid.rs b/src/playerid.rs index 8402a1c..dcb1f40 100644 --- a/src/playerid.rs +++ b/src/playerid.rs @@ -4,3 +4,11 @@ pub struct PlayerId { pub name: String } +impl PlayerId { + pub fn from_str(name: &str) -> Self { + Self {name: name.to_string()} + } + pub fn to_string(&self) -> String { + self.name.clone() + } +} diff --git a/src/playerstate.rs b/src/playerstate.rs index e68e890..d06e3e7 100644 --- a/src/playerstate.rs +++ b/src/playerstate.rs @@ -5,13 +5,14 @@ use crate::template::Template; use crate::{ componentwrapper::{ComponentWrapper, PreEntity}, PlayerId, + RoomId, components::{Visible, Player, Inventory, Health, Item} }; #[derive(Debug, Clone)] pub struct PlayerState { - pub name: String, - pub room: String, + pub id: PlayerId, + pub room: Option, pub inventory_capacity: usize, pub inventory: Vec