diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-07 21:17:21 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-07 21:17:21 +0200 |
commit | 1406127825e30514dc13909c583895fd682c7107 (patch) | |
tree | 483ccbfd98eb7ef47d7684562f0adbbee51a67e6 /server/src/data.rs | |
parent | f88a296aac8840f713031b5b716b8d9fa3e18b8c (diff) | |
download | hurrycurry-1406127825e30514dc13909c583895fd682c7107.tar hurrycurry-1406127825e30514dc13909c583895fd682c7107.tar.bz2 hurrycurry-1406127825e30514dc13909c583895fd682c7107.tar.zst |
add bus map and tile entities
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, |