diff options
author | metamuffin <metamuffin@disroot.org> | 2024-12-26 10:57:17 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-12-26 10:57:17 +0100 |
commit | 35bb41ad0ef2dcb34f143c0cc066610c29bae455 (patch) | |
tree | 6547a2301e8c9909bf927ed3f324520989d476eb /server/editor/src/save.rs | |
parent | 6ca4b3377a08fa30a13835d59f9558419f7f5cd1 (diff) | |
download | hurrycurry-35bb41ad0ef2dcb34f143c0cc066610c29bae455.tar hurrycurry-35bb41ad0ef2dcb34f143c0cc066610c29bae455.tar.bz2 hurrycurry-35bb41ad0ef2dcb34f143c0cc066610c29bae455.tar.zst |
editor load feature and return to editor command
Diffstat (limited to 'server/editor/src/save.rs')
-rw-r--r-- | server/editor/src/save.rs | 51 |
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(()) +} |