diff options
Diffstat (limited to 'server/src/entity/mod.rs')
-rw-r--r-- | server/src/entity/mod.rs | 157 |
1 files changed, 22 insertions, 135 deletions
diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs index 928910bc..47d37f3d 100644 --- a/server/src/entity/mod.rs +++ b/server/src/entity/mod.rs @@ -27,26 +27,19 @@ pub mod player_portal; pub mod tram; pub mod tutorial; -use crate::{ - data::{ItemTileRegistry, Serverdata}, - entity::pedestrians::Pedestrians, - scoreboard::ScoreboardStore, -}; -use anyhow::{anyhow, Result}; +use crate::{entity::pedestrians::Pedestrians, scoreboard::ScoreboardStore}; +use anyhow::Result; use book::Book; -use campaign::{Gate, GateCondition, Map}; +use campaign::{Gate, Map}; use conveyor::Conveyor; use customers::Customers; -use environment_effect::{EnvironmentController, EnvironmentEffect, EnvironmentEffectController}; +use environment_effect::{EnvironmentController, EnvironmentEffectController}; use hurrycurry_client_lib::Game; +use hurrycurry_data::{entities::EntityDecl, Serverdata}; use hurrycurry_locale::TrError; -use hurrycurry_protocol::{ - glam::{IVec2, Vec2}, - Character, PacketC, PacketS, PlayerID, -}; +use hurrycurry_protocol::{glam::IVec2, Character, Gamedata, PacketC, PacketS, PlayerID}; use item_portal::ItemPortal; use player_portal::PlayerPortal; -use serde::{Deserialize, Serialize}; use std::{ any::Any, collections::{HashMap, VecDeque}, @@ -87,135 +80,29 @@ pub trait Entity: Any { } } -// macro_rules! entities { -// ($($e:ident),*) => { -// pub enum DynEntity { $($e($e)),* } -// impl Entity for DynEntity { -// fn tick(&mut self, c: EntityContext<'_>) -> Result<()> { -// match self { $(DynEntity::$e(x) => x.tick(c)),*, } -// } -// fn destructor(&mut self, c: EntityContext<'_>) { -// match self { $(DynEntity::$e(x) => x.destructor(c)),*, } -// } -// } -// }; -// } -// entities!( -// Conveyor, -// ItemPortal, -// PlayerPortal, -// Customers, -// EnvironmentEffectController, -// EnvironmentController -// ); - -#[derive(Debug, Clone, Deserialize, Serialize)] -#[serde(rename_all = "snake_case")] -pub enum EntityDecl { - Conveyor { - from: Option<IVec2>, - to: Option<IVec2>, - filter_dir: Option<IVec2>, - filter: Option<String>, - dir: Option<IVec2>, - speed: Option<f32>, - }, - ItemPortal { - from: Option<IVec2>, - to: IVec2, - }, - PlayerPortal { - from: Option<Vec2>, - to: Vec2, - }, - Customers { - scaling_factor: Option<f32>, - }, - Map { - name: String, - location: Option<Vec2>, - }, - EnvironmentEffect(EnvironmentEffect), - Environment(Vec<String>), - Gate { - location: Option<IVec2>, - condition: GateCondition, - }, - Tram { - length: usize, - color: Option<i32>, - points: Vec<Vec2>, - spacing: f32, - smoothing: f32, - }, - Book, - Pedestrians { - spawn_delay: f32, - spawn_delay_stdev: Option<f32>, - speed: Option<f32>, - points: Vec<Vec2>, - }, -} - -pub fn construct_entity( - pos: Option<IVec2>, - decl: &EntityDecl, - reg: &ItemTileRegistry, -) -> Result<DynEntity> { - Ok(match decl.to_owned() { - EntityDecl::Book => Box::new(Book(pos.ok_or(anyhow!("book is tile entity"))?)), - EntityDecl::ItemPortal { from, to } => Box::new(ItemPortal { - from: from - .or(pos) - .ok_or(anyhow!("Item portal start without start"))?, - to, - }), - EntityDecl::PlayerPortal { from, to } => Box::new(PlayerPortal { - from: from - .or(pos.map(|v| v.as_vec2())) - .ok_or(anyhow!("Player portal without start"))?, - to, - }), - EntityDecl::Conveyor { +pub fn construct_entity(decl: &EntityDecl, data: &Gamedata) -> DynEntity { + match decl.to_owned() { + EntityDecl::Book { pos } => Box::new(Book(pos)), + EntityDecl::ItemPortal { from, to } => Box::new(ItemPortal { from, to }), + EntityDecl::PlayerPortal { from, to } => Box::new(PlayerPortal { from, to }), + EntityDecl::Conveyor { from, to, speed } => Box::new(Conveyor { from, to, - speed, - dir, - filter, - filter_dir, - } => { - let from = from.or(pos).ok_or(anyhow!("Conveyor has no start"))?; - let to = to - .or(dir.map(|s| s + from)) - .ok_or(anyhow!("Conveyor has no destination"))?; - Box::new(Conveyor { - from, - to, - max_cooldown: 1. / speed.unwrap_or(2.), - filter_tile: filter_dir.map(|o| to + o), - filter_item: filter.map(|name| reg.register_item(name)), - cooldown: 0., - }) - } - EntityDecl::Map { name, location } => Box::new(Map { - location: location - .or(pos.map(|p| p.as_vec2() + 0.5)) - .ok_or(anyhow!("no location"))?, - name, + max_cooldown: 1. / speed.unwrap_or(2.), + cooldown: 0., }), - EntityDecl::Gate { - condition, - location, - } => Box::new(Gate { + EntityDecl::Map { name, pos } => Box::new(Map { pos, name }), + EntityDecl::Gate { condition, pos } => Box::new(Gate { condition, unlocked: false, - location: location.or(pos).ok_or(anyhow!("no location"))?, - blocker_tile: reg.register_tile("fence".to_string()), + pos, + blocker_tile: data + .get_tile_by_name("fence") + .expect("asserted earlier (tm)"), active: true, }), EntityDecl::Customers { scaling_factor } => { - reg.register_item("unknown-order".to_owned()); - Box::new(Customers::new(scaling_factor.unwrap_or(0.5))?) + Box::new(Customers::new(scaling_factor.unwrap_or(0.5))) } EntityDecl::EnvironmentEffect(config) => Box::new(EnvironmentEffectController::new(config)), EntityDecl::Environment(names) => Box::new(EnvironmentController(names)), @@ -254,5 +141,5 @@ pub fn construct_entity( cooldown: 0., speed: speed.unwrap_or(0.6), }), - }) + } } |