summaryrefslogtreecommitdiff
path: root/server/editor/src/save.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-12-25 23:13:12 +0100
committermetamuffin <metamuffin@disroot.org>2024-12-25 23:13:12 +0100
commit6ca4b3377a08fa30a13835d59f9558419f7f5cd1 (patch)
tree711c5fd11a86a2f228f2f14912357f46ad7d7b73 /server/editor/src/save.rs
parent31507963a05dffb3327b62dd54629420061d6c4d (diff)
downloadhurrycurry-6ca4b3377a08fa30a13835d59f9558419f7f5cd1.tar
hurrycurry-6ca4b3377a08fa30a13835d59f9558419f7f5cd1.tar.bz2
hurrycurry-6ca4b3377a08fa30a13835d59f9558419f7f5cd1.tar.zst
editor save and play features
Diffstat (limited to 'server/editor/src/save.rs')
-rw-r--r--server/editor/src/save.rs69
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()
+}