diff options
Diffstat (limited to 'server/editor/src/save.rs')
-rw-r--r-- | server/editor/src/save.rs | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/server/editor/src/save.rs b/server/editor/src/save.rs new file mode 100644 index 00000000..a77cd609 --- /dev/null +++ b/server/editor/src/save.rs @@ -0,0 +1,69 @@ +use crate::{State, TILES}; +use hurrycurry_protocol::glam::{IVec2, ivec2}; +use serde::Serialize; +use std::collections::{HashMap, HashSet}; + +#[rustfmt::skip] +#[derive(Debug, Clone, Serialize)] +pub struct MapDecl { + map: Vec<String>, + tiles: HashMap<char, String>, + items: HashMap<char, String>, + collider: Vec<String>, + walkable: Vec<String>, + chef_spawn: char, + customer_spawn: char, + score_baseline: i64, +} + +pub fn export_state(state: &State) -> String { + let mut cmin = IVec2::MAX; + let mut cmax = IVec2::MIN; + for pos in state.tiles.keys().copied() { + cmin = cmin.min(pos); + cmax = cmax.max(pos); + } + + let mut map = Vec::new(); + let mut tiles = HashMap::new(); + let mut collider = HashSet::new(); + let mut walkable = HashSet::new(); + for y in cmin.y..=cmax.y { + let mut line = String::new(); + for x in cmin.x..=cmax.x { + let p = ivec2(x, y); + line.push(if let Some(t) = state.tiles.get(&p) { + let c = if p == state.chef_spawn { + '~' + } else if p == state.customer_spawn { + '!' + } else { + TILES[t.0].1 + }; + if TILES[t.0].2 == 2 { + collider.insert(TILES[t.0].0.to_string()); + } + if TILES[t.0].2 == 1 { + walkable.insert(TILES[t.0].0.to_string()); + } + tiles.insert(c, TILES[t.0].0.to_string()); + c + } else { + ' ' + }) + } + map.push(line); + } + + let decl: MapDecl = MapDecl { + map, + tiles, + items: HashMap::new(), + collider: collider.into_iter().collect(), + walkable: walkable.into_iter().collect(), + chef_spawn: '~', + customer_spawn: '!', + score_baseline: 200, + }; + serde_yml::to_string(&decl).unwrap() +} |