aboutsummaryrefslogtreecommitdiff
path: root/server/editor/src/save.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/editor/src/save.rs')
-rw-r--r--server/editor/src/save.rs51
1 files changed, 47 insertions, 4 deletions
diff --git a/server/editor/src/save.rs b/server/editor/src/save.rs
index a77cd609..c8ff350a 100644
--- a/server/editor/src/save.rs
+++ b/server/editor/src/save.rs
@@ -1,10 +1,17 @@
use crate::{State, TILES};
-use hurrycurry_protocol::glam::{IVec2, ivec2};
-use serde::Serialize;
-use std::collections::{HashMap, HashSet};
+use anyhow::{Result, anyhow};
+use hurrycurry_protocol::{
+ TileIndex,
+ glam::{IVec2, ivec2},
+};
+use serde::{Deserialize, Serialize};
+use std::{
+ collections::{HashMap, HashSet},
+ hash::RandomState,
+};
#[rustfmt::skip]
-#[derive(Debug, Clone, Serialize)]
+#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MapDecl {
map: Vec<String>,
tiles: HashMap<char, String>,
@@ -67,3 +74,39 @@ pub fn export_state(state: &State) -> String {
};
serde_yml::to_string(&decl).unwrap()
}
+
+pub fn import_state(state: &mut State, s: &str) -> Result<()> {
+ let decl: MapDecl = serde_yml::from_str(s)?;
+
+ let name_to_tile = HashMap::<_, _, RandomState>::from_iter(
+ TILES
+ .iter()
+ .enumerate()
+ .map(|(i, (name, _, _))| ((*name).to_owned(), i)),
+ );
+
+ for (y, line) in decl.map.iter().enumerate() {
+ for (x, char) in line.chars().enumerate() {
+ let pos = ivec2(x as i32, y as i32);
+ if char == ' ' {
+ continue;
+ }
+ if char == decl.customer_spawn {
+ state.customer_spawn = pos;
+ }
+ if char == decl.chef_spawn {
+ state.chef_spawn = pos;
+ }
+ let tile = decl
+ .tiles
+ .get(&char)
+ .ok_or(anyhow!("char undefined {char:?}"))?;
+ let tile = name_to_tile
+ .get(tile)
+ .ok_or(anyhow!("unknown tile {tile:?}"))?;
+ state.set_tile(pos, TileIndex(*tile));
+ }
+ }
+
+ Ok(())
+}