diff options
Diffstat (limited to 'server/src/data')
-rw-r--r-- | server/src/data/mod.rs | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/server/src/data/mod.rs b/server/src/data/mod.rs index 1fab912a..7d3841d1 100644 --- a/server/src/data/mod.rs +++ b/server/src/data/mod.rs @@ -254,6 +254,13 @@ pub fn build_data( assert_eq!(r.points, None, "points specified where not possible") } + let mut tile_specs = BTreeMap::new(); + for (char, tile_spec_raw) in map_in.tiles { + let mut toks = shlex::split(&tile_spec_raw).ok_or(anyhow!("tile spec quoting invalid"))?; + toks.insert(0, "tile-spec".to_string()); // exe name + tile_specs.insert(char, TileArgs::try_parse_from(toks)?); + } + let mut chef_spawn = None; let mut customer_spawn = None; let mut initial_map = HashMap::new(); @@ -262,24 +269,19 @@ pub fn build_data( let mut tile_walkable = HashSet::new(); let mut exclusive_tiles = BTreeSet::new(); for (y, line) in map_in.map.iter().enumerate() { - for (x, tile) in line.chars().enumerate() { - if tile == ' ' { + for (x, char) in line.chars().enumerate() { + if char == ' ' { continue; // space is empty space } let pos = IVec2::new(x as i32, y as i32); - let tile_spec = map_in - .tiles - .get(&tile) - .ok_or(anyhow!("tile {tile} is undefined"))? - .clone(); - let mut toks = shlex::split(&tile_spec).ok_or(anyhow!("tile spec quoting invalid"))?; - toks.insert(0, "tile-spec".to_string()); // exe name - let tile_spec = TileArgs::try_parse_from(toks)?; + let tile_spec = tile_specs + .get(&char) + .ok_or(anyhow!("tile {char} is undefined"))?; - let tile = reg.register_tile(tile_spec.tile_name); + let tile = reg.register_tile(tile_spec.tile_name.clone()); tiles_used.insert(tile); - let item = tile_spec.item.map(|i| reg.register_item(i)); + let item = tile_spec.item.clone().map(|i| reg.register_item(i)); items_used.extend(item); initial_map.insert(pos, (tile, item)); @@ -300,6 +302,13 @@ pub fn build_data( } } } + + for tile in tile_specs.values() { + if !tiles_used.contains(®.register_tile(tile.tile_name.clone())) { + bail!("tile {:?} is unused", tile.tile_name) + } + } + let chef_spawn = chef_spawn.ok_or(anyhow!("map has no chef spawn"))?; entities.extend( |