diff options
Diffstat (limited to 'server/src/data/mod.rs')
| -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( | 
