aboutsummaryrefslogtreecommitdiff
path: root/server/src/data.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/data.rs')
-rw-r--r--server/src/data.rs20
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,