From 6ca4b3377a08fa30a13835d59f9558419f7f5cd1 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 25 Dec 2024 23:13:12 +0100 Subject: editor save and play features --- server/editor/src/save.rs | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 server/editor/src/save.rs (limited to 'server/editor/src/save.rs') 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, + tiles: HashMap, + items: HashMap, + collider: Vec, + walkable: Vec, + 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() +} -- cgit v1.2.3-70-g09d2