diff options
| -rw-r--r-- | src/main.rs | 14 | ||||
| -rw-r--r-- | src/persistence.rs | 17 | ||||
| -rw-r--r-- | src/playerid.rs | 8 | ||||
| -rw-r--r-- | src/playerstate.rs | 35 | ||||
| -rw-r--r-- | src/room.rs | 22 | ||||
| -rw-r--r-- | src/roomid.rs | 15 |
6 files changed, 72 insertions, 39 deletions
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<SaveState>; + fn load_room(&self, id: RoomId) -> Result<SaveState>; fn load_player(&self, id: PlayerId) -> Result<PlayerState>; - 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<SaveState> { + fn load_room(&self, id: RoomId) -> Result<SaveState> { 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<PlayerState> { 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<RoomId>, pub inventory_capacity: usize, pub inventory: Vec<Template>, pub health: i64, @@ -20,10 +21,10 @@ pub struct PlayerState { impl PlayerState { - pub fn new(name: String) -> Self { + pub fn new(id: PlayerId) -> Self { Self{ - name: name, - room: String::new(), + id: id, + room: None, inventory: Vec::new(), inventory_capacity: 10, health: 9, @@ -31,10 +32,10 @@ impl PlayerState { } } - pub fn create(name: String, room: String, inventory: Vec<Template>, inventory_capacity: usize, health: i64, maximum_health: i64) -> Self { + pub fn create(id: PlayerId, room: RoomId, inventory: Vec<Template>, inventory_capacity: usize, health: i64, maximum_health: i64) -> Self { Self { - name, - room, + id, + room: Some(room), inventory, health, inventory_capacity, @@ -44,8 +45,11 @@ impl PlayerState { pub fn to_json(&self) -> Value { json!({ - "name": self.name, - "roomname": self.room, + "name": self.id.name, + "roomname": match &self.room { + Some(id) => json!(id.to_string()), + None => json!(null) + }, "inventory": { "capacity": self.inventory_capacity, "items": self.inventory.iter().map(Template::to_json).collect::<Vec<Value>>() @@ -66,8 +70,11 @@ impl PlayerState { items.push(Template::from_json(item)?); } Some(Self { - name: val.get("name")?.as_str()?.to_string(), - room: val.get("roomname")?.as_str()?.to_string(), + id: PlayerId{name: val.get("name")?.as_str()?.to_string()}, + room: match val.get("roomname")? { + Value::String(name) => Some(RoomId::from_str(name)), + _ => None + }, inventory: items, health: val.get("health")?.as_i64()?, inventory_capacity: inventory.get("capacity")?.as_i64()? as usize, @@ -75,10 +82,10 @@ impl PlayerState { }) } - pub fn construct(&self, id: PlayerId) -> PreEntity { + pub fn construct(&self) -> PreEntity { vec![ ComponentWrapper::Visible(Visible{sprite: "player".to_string(), height: 1.0}), - ComponentWrapper::Player(Player::new(id)), + ComponentWrapper::Player(Player::new(self.id.clone())), ComponentWrapper::Inventory(Inventory{ items: self.inventory.iter().map( |template| Item{ent: template.clone(), name: template.name.clone()} diff --git a/src/room.rs b/src/room.rs index 83702fe..00decce 100644 --- a/src/room.rs +++ b/src/room.rs @@ -44,7 +44,7 @@ use crate::roomtemplate::RoomTemplate; use crate::savestate::SaveState; use crate::template::Template; use crate::playerstate::PlayerState; -use crate::{Pos, PlayerId, aerr}; +use crate::{Pos, PlayerId, RoomId, aerr}; use crate::util::Result; @@ -52,12 +52,12 @@ use crate::util::Result; pub struct Room<'a, 'b> { world: World, dispatcher: Dispatcher<'a, 'b>, - pub name: String + pub id: RoomId } impl <'a, 'b>Room<'a, 'b> { - pub fn new(name: &str, encyclopedia: Encyclopedia) -> Room<'a, 'b> { + pub fn new(id: RoomId, encyclopedia: Encyclopedia) -> Room<'a, 'b> { let mut world = World::new(); world.insert(NewEntities::new(encyclopedia)); world.insert(Players::default()); @@ -80,7 +80,7 @@ impl <'a, 'b>Room<'a, 'b> { Room { world, dispatcher, - name: name.to_string() + id } } @@ -115,8 +115,8 @@ impl <'a, 'b>Room<'a, 'b> { self.world.fetch_mut::<Input>().actions = actions; } - pub fn add_player(&mut self, id: PlayerId, state: &PlayerState){ - let pre_player = state.construct(id.clone()); + pub fn add_player(&mut self, state: &PlayerState){ + let pre_player = state.construct(); let spawn = self.world.fetch::<Spawn>().pos; let mut builder = self.world.create_entity(); let ent = builder.entity; @@ -124,7 +124,7 @@ impl <'a, 'b>Room<'a, 'b> { builder = comp.build(builder); } builder.with(Position::new(spawn)).with(New).build(); - self.world.fetch_mut::<Players>().entities.insert(id, ent); + self.world.fetch_mut::<Players>().entities.insert(state.id.clone(), ent); } pub fn remove_player(&mut self, id: PlayerId) -> Result<PlayerState>{ @@ -158,8 +158,8 @@ impl <'a, 'b>Room<'a, 'b> { let mut saved = HashMap::new(); for (player, inventory, health) in (&players, &inventories, &healths).join() { saved.insert(player.id.clone(), PlayerState::create( - player.id.name.clone(), - self.name.clone(), + player.id.clone(), + self.id.clone(), inventory.items.iter().map(|item| item.ent.clone()).collect(), inventory.capacity, health.health, @@ -177,8 +177,8 @@ impl <'a, 'b>Room<'a, 'b> { let healths = self.world.read_component::<Health>(); let health = healths.get(ent)?; Some(PlayerState::create( - player.id.name.clone(), - self.name.clone(), + player.id.clone(), + self.id.clone(), inventory.items.iter().map(|item| item.ent.clone()).collect(), inventory.capacity, health.health, diff --git a/src/roomid.rs b/src/roomid.rs new file mode 100644 index 0000000..1f356fa --- /dev/null +++ b/src/roomid.rs @@ -0,0 +1,15 @@ + +#[derive(Debug, PartialEq, Eq, Clone, Hash)] +pub struct RoomId { + pub name: String +} + +impl RoomId { + pub fn from_str(name: &str) -> Self { + Self {name: name.to_string()} + } + pub fn to_string(&self) -> String { + self.name.clone() + } +} + |
