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() }