From 2537e764a359328870c3eabb16ee5238becd3c73 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 11 Jul 2024 16:55:39 +0200 Subject: add conveyor filters --- server/src/entity/mod.rs | 56 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 19 deletions(-) (limited to 'server/src/entity/mod.rs') diff --git a/server/src/entity/mod.rs b/server/src/entity/mod.rs index 925ed5f4..a1f690a3 100644 --- a/server/src/entity/mod.rs +++ b/server/src/entity/mod.rs @@ -16,10 +16,15 @@ */ pub mod conveyor; -use crate::{data::Gamedata, game::Tile}; +pub mod portal; +use crate::{ + data::{Gamedata, ItemTileRegistry}, + game::Tile, +}; use anyhow::{anyhow, Result}; use conveyor::Conveyor; use hurrycurry_protocol::{glam::IVec2, PacketC}; +use portal::Portal; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, VecDeque}; @@ -34,43 +39,54 @@ pub trait EntityT: Clone { ) -> Result<()>; } -#[derive(Debug, Clone)] -pub enum Entity { - Conveyor(Conveyor), -} -impl EntityT for Entity { - fn tick( - &mut self, - data: &Gamedata, - points: &mut i64, - packet_out: &mut VecDeque, - tiles: &mut HashMap, - dt: f32, - ) -> Result<()> { - match self { - Entity::Conveyor(x) => x.tick(data, points, packet_out, tiles, dt), +macro_rules! entities { + ($($e:ident),*) => { + #[derive(Debug, Clone)] + pub enum Entity { $($e($e)),* } + impl EntityT for Entity { + fn tick(&mut self, data: &Gamedata, points: &mut i64, packet_out: &mut VecDeque, tiles: &mut HashMap, dt: f32) -> Result<()> { + match self { $(Entity::$e(x) => x.tick(data, points, packet_out, tiles, dt)),*, } + } } - } + }; } +entities!(Conveyor, Portal); + #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "snake_case")] pub enum EntityDecl { Conveyor { from: Option, to: Option, + filter_dir: Option, + filter: Option, dir: Option, speed: Option, }, + Portal { + from: Option, + to: IVec2, + }, } -pub fn construct_entity(pos: Option, decl: &EntityDecl) -> Result { +pub fn construct_entity( + pos: Option, + decl: &EntityDecl, + reg: &ItemTileRegistry, +) -> Result { Ok(match decl.to_owned() { + EntityDecl::Portal { from, to } => Entity::Portal(Portal { + from: from.or(pos).ok_or(anyhow!("no portla start"))?, + to, + }), EntityDecl::Conveyor { from, to, speed, dir, + filter, + filter_dir, } => { let from = from.or(pos).ok_or(anyhow!("conveyor has no start"))?; let to = to @@ -80,7 +96,9 @@ pub fn construct_entity(pos: Option, decl: &EntityDecl) -> Result from, to, max_cooldown: 1. / speed.unwrap_or(2.), - ..Default::default() + filter_tile: filter_dir.map(|o| to + o), + filter_item: filter.map(|name| reg.register_item(name)), + cooldown: 0., }) } }) -- cgit v1.2.3-70-g09d2