From 35bb41ad0ef2dcb34f143c0cc066610c29bae455 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 26 Dec 2024 10:57:17 +0100 Subject: editor load feature and return to editor command --- server/editor/src/save.rs | 51 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) (limited to 'server/editor/src/save.rs') 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, tiles: HashMap, @@ -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(()) +} -- cgit v1.2.3-70-g09d2