diff options
| -rw-r--r-- | server/data/src/entities.rs | 23 | ||||
| -rw-r--r-- | server/data/src/lib.rs | 8 | ||||
| -rw-r--r-- | server/data/src/registry.rs | 9 | ||||
| -rw-r--r-- | server/src/entity/mod.rs | 16 | ||||
| -rw-r--r-- | server/src/server.rs | 2 |
5 files changed, 33 insertions, 25 deletions
diff --git a/server/data/src/entities.rs b/server/data/src/entities.rs index 68dbe479..04d4e1c5 100644 --- a/server/data/src/entities.rs +++ b/server/data/src/entities.rs @@ -16,11 +16,12 @@ */ -use hurrycurry_protocol::glam::{IVec2, Vec2}; +use hurrycurry_protocol::{ + ItemIndex, TileIndex, + glam::{IVec2, Vec2}, +}; use serde::{Deserialize, Serialize}; -use crate::ItemTileRegistry; - #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "snake_case")] pub enum EntityDecl { @@ -39,6 +40,8 @@ pub enum EntityDecl { }, Customers { scaling_factor: Option<f32>, + #[serde(default = "default_item")] + unknown_order: ItemIndex, }, Map { name: String, @@ -49,6 +52,7 @@ pub enum EntityDecl { Gate { condition: GateCondition, pos: IVec2, + blocker_tile: TileIndex, }, Tram { length: usize, @@ -68,16 +72,6 @@ pub enum EntityDecl { }, } -impl EntityDecl { - pub(crate) fn run_register(&self, reg: &ItemTileRegistry) { - match self { - Self::Gate { .. } => drop(reg.register_tile("fence".into())), - Self::Customers { .. } => drop(reg.register_item("unknown-order".into())), - _ => (), - } - } -} - #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub enum GateCondition { @@ -97,3 +91,6 @@ pub struct EnvironmentEffect { fn default_onoff() -> f32 { 40. } +fn default_item() -> ItemIndex { + ItemIndex(usize::MAX) +} diff --git a/server/data/src/lib.rs b/server/data/src/lib.rs index dd462e3b..ed1d03da 100644 --- a/server/data/src/lib.rs +++ b/server/data/src/lib.rs @@ -210,9 +210,11 @@ fn build_data( } } - entities.extend(map_in.entities.clone()); - for e in &entities { - e.run_register(®); + for mut e in map_in.entities.clone() { + if let EntityDecl::Customers { unknown_order, .. } = &mut e { + *unknown_order = reg.register_item("unknown-order".to_owned()) + } + entities.push(e); } debug!("{} entites created", entities.len()); diff --git a/server/data/src/registry.rs b/server/data/src/registry.rs index 952a2e29..e7dc7f77 100644 --- a/server/data/src/registry.rs +++ b/server/data/src/registry.rs @@ -23,7 +23,7 @@ use std::{ sync::RwLock, }; -use crate::Serverdata; +use crate::{Serverdata, entities::EntityDecl}; #[derive(Default)] pub(crate) struct ItemTileRegistry { @@ -78,6 +78,13 @@ pub(crate) fn filter_unused_tiles_and_items(data: &mut Gamedata, serverdata: &mu used_tiles.insert(tile); used_items.extend(item); } + for e in &serverdata.entity_decls { + match e { + EntityDecl::Gate { blocker_tile: blocker, .. } => used_tiles.insert(*blocker), + EntityDecl::Customers { unknown_order, .. } => used_items.insert(*unknown_order), + _ => false, + }; + } let mut item_names = Vec::new(); let mut item_map = HashMap::new(); diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs index ce7cb849..6418d0c7 100644 --- a/server/src/entity/mod.rs +++ b/server/src/entity/mod.rs @@ -37,7 +37,7 @@ use environment_effect::{EnvironmentController, EnvironmentEffectController}; use hurrycurry_client_lib::Game; use hurrycurry_data::{Serverdata, entities::EntityDecl}; use hurrycurry_locale::TrError; -use hurrycurry_protocol::{Character, Gamedata, PacketC, PacketS, PlayerID, glam::IVec2}; +use hurrycurry_protocol::{Character, PacketC, PacketS, PlayerID, glam::IVec2}; use item_portal::ItemPortal; use player_portal::PlayerPortal; use std::{ @@ -80,7 +80,7 @@ pub trait Entity: Any { } } -pub fn construct_entity(decl: &EntityDecl, data: &Gamedata) -> DynEntity { +pub fn construct_entity(decl: &EntityDecl) -> DynEntity { match decl.to_owned() { EntityDecl::Book { pos } => Box::new(Book(pos)), EntityDecl::ItemPortal { from, to } => Box::new(ItemPortal { from, to }), @@ -92,16 +92,18 @@ pub fn construct_entity(decl: &EntityDecl, data: &Gamedata) -> DynEntity { cooldown: 0., }), EntityDecl::Map { name, pos } => Box::new(Map { pos, name }), - EntityDecl::Gate { condition, pos } => Box::new(Gate { + EntityDecl::Gate { + condition, + pos, + blocker_tile, + } => Box::new(Gate { condition, unlocked: false, pos, - blocker_tile: data - .get_tile_by_name("fence") - .expect("asserted earlier (tm)"), + blocker_tile, active: true, }), - EntityDecl::Customers { scaling_factor } => { + EntityDecl::Customers { scaling_factor, .. } => { Box::new(Customers::new(scaling_factor.unwrap_or(0.5))) } EntityDecl::EnvironmentEffect(config) => Box::new(EnvironmentEffectController::new(config)), diff --git a/server/src/server.rs b/server/src/server.rs index 99e7eaf8..c0b32a1c 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -388,7 +388,7 @@ impl Server { self.gamedata_index.update(&self.game.data); self.entities.clear(); for ed in &serverdata.entity_decls { - self.entities.push(construct_entity(ed, &self.game.data)); + self.entities.push(construct_entity(ed)); } self.data = serverdata.into(); for e in &mut self.entities { |