diff options
Diffstat (limited to 'server/src/data.rs')
| -rw-r--r-- | server/src/data.rs | 20 | 
1 files changed, 17 insertions, 3 deletions
| diff --git a/server/src/data.rs b/server/src/data.rs index a1c7e894..c667e760 100644 --- a/server/src/data.rs +++ b/server/src/data.rs @@ -16,7 +16,7 @@  */  use crate::{ -    entity::EntityDecl, +    entity::{construct_entity, Entity, EntityDecl},      interaction::Recipe,      protocol::{DemandIndex, ItemIndex, RecipeIndex, TileIndex},  }; @@ -73,6 +73,8 @@ pub struct InitialMap {      customer_spawn: char,      #[serde(default)]      entities: Vec<EntityDecl>, +    #[serde(default)] +    tile_entities: HashMap<char, EntityDecl>,  }  #[derive(Debug, Clone, Serialize, Deserialize)] @@ -104,7 +106,7 @@ pub struct Gamedata {      #[serde(skip)] pub initial_map: HashMap<IVec2, (TileIndex, Option<ItemIndex>)>,      #[serde(skip)] pub chef_spawn: Vec2,      #[serde(skip)] pub customer_spawn: Vec2, -    #[serde(skip)] pub entities: Vec<EntityDecl>, +    #[serde(skip)] pub entities: Vec<Entity>,  }  #[derive(Debug, Deserialize, Default)] @@ -170,6 +172,7 @@ impl Gamedata {          let tile_names = RwLock::new(Vec::new());          let mut recipes = Vec::new();          let mut demands = Vec::new(); +        let mut entities = Vec::new();          for mut r in recipes_in {              let r2 = r.clone(); @@ -238,6 +241,9 @@ impl Gamedata {                      .get(&tile)                      .ok_or(anyhow!("tile {tile} is undefined"))?                      .clone(); +                if let Some(ent) = map_in.tile_entities.get(&tile) { +                    entities.push(construct_entity(Some(pos), ent)?); +                }                  let itemname = map_in.items.get(&tile).cloned();                  let tile = TileIndex(register(&tile_names, tilename));                  let item = itemname.map(|i| ItemIndex(register(&item_names, i))); @@ -257,6 +263,14 @@ impl Gamedata {              .map(|i| !map_in.collider.contains(i) && !map_in.walkable.contains(i))              .collect(); +        entities.extend( +            map_in +                .entities +                .iter() +                .map(|decl| construct_entity(None, decl)) +                .try_collect::<Vec<_>>()?, +        ); +          Ok(Gamedata {              demands,              tile_collide, @@ -265,7 +279,7 @@ impl Gamedata {              map_names: HashSet::new(),              initial_map,              item_names, -            entities: map_in.entities, +            entities,              tile_names,              chef_spawn,              customer_spawn, | 
