summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-02-17 02:24:14 +0100
committertroido <troido@protonmail.com>2020-02-17 02:24:14 +0100
commitc921686355c86afb5bf47e4b6c696057ede01b1f (patch)
treecb55b0d464010e44aeeca16f0f734ac3464da600
parent625ab5bb37cbe35fd9662a33bc92f73520e59c81 (diff)
persistently save the room state
-rw-r--r--src/main.rs13
-rw-r--r--src/persistence.rs8
-rw-r--r--src/room.rs14
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));
+ }
}