diff options
| -rw-r--r-- | src/main.rs | 13 | ||||
| -rw-r--r-- | src/persistence.rs | 8 | ||||
| -rw-r--r-- | src/room.rs | 14 |
3 files changed, 32 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs index 4301a07..5b2bc8a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -40,6 +40,7 @@ use self::room::Room; use self::util::ToJson; use self::roomtemplate::RoomTemplate; use self::defaultencyclopedia::default_encyclopedia; +use self::persistence::{FileStorage, PersistentStorage}; @@ -57,9 +58,16 @@ fn main() { let mut gameserver = GameServer::new(servers); - let mut room = gen_room(); + let storage = FileStorage::new("~/.rustifarm/saves"); + if let Ok(state) = storage.load_room("room".to_string()) { + room.load_saved(&state); + println!("loaded saved state successfully"); + } else { + println!("loading saved state failed"); + } + println!("asciifarm started"); @@ -69,7 +77,8 @@ fn main() { room.set_input(actions); room.update(); - if count % 20 == 0 { + if count % 50 == 0 { + storage.save_room("room".to_string(), room.save()); println!("{}", room.save().to_json()); } let messages = room.view(); diff --git a/src/persistence.rs b/src/persistence.rs index fc04378..1808652 100644 --- a/src/persistence.rs +++ b/src/persistence.rs @@ -28,6 +28,14 @@ pub struct FileStorage { directory: PathBuf } +impl FileStorage { + pub fn new(path: &str) -> Self { + Self { + directory: PathBuf::from(path) + } + } +} + impl PersistentStorage for FileStorage { fn load_room(&self, name: String) -> Result<SaveState> { diff --git a/src/room.rs b/src/room.rs index 501b587..28abfa7 100644 --- a/src/room.rs +++ b/src/room.rs @@ -31,6 +31,7 @@ use crate::components::{Position, Serialise}; use crate::encyclopedia::Encyclopedia; use crate::roomtemplate::RoomTemplate; use crate::savestate::SaveState; +use crate::template::Template; use crate::{Pos, PlayerId}; @@ -82,7 +83,7 @@ impl <'a, 'b>Room<'a, 'b> { let y = (idx as i64) / width; for template in templates { - self.world.fetch_mut::<NewEntities>().templates.push((Pos{x, y}, template.clone().unsaved())); + self.create_entity(template.clone().unsaved(), Pos{x, y}); } } } @@ -110,6 +111,17 @@ impl <'a, 'b>Room<'a, 'b> { state } + pub fn load_saved(&mut self, state: &SaveState) { + for (pos, templates) in state.changes.iter() { + for template in templates { + self.create_entity(template.clone(), *pos); + } + } + } + + fn create_entity(&mut self, template: Template, pos: Pos){ + self.world.fetch_mut::<NewEntities>().templates.push((pos, template)); + } } |
