diff options
Diffstat (limited to 'server/src/game.rs')
-rw-r--r-- | server/src/game.rs | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/server/src/game.rs b/server/src/game.rs index 838a71e4..13ee5410 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -18,6 +18,7 @@ use crate::{ customer::DemandState, data::Gamedata, + entity::{construct_entity, DynEntity}, interaction::{interact, tick_slot, InteractEffect, TickEffect}, protocol::{ ItemIndex, ItemLocation, Message, PacketC, PacketS, PlayerID, RecipeIndex, TileIndex, @@ -68,6 +69,7 @@ pub struct Game { packet_out: VecDeque<PacketC>, demand: Option<DemandState>, pub points: i64, + entities: Vec<DynEntity>, end: Option<Instant>, } @@ -76,10 +78,11 @@ impl Game { Self { data: Gamedata::default().into(), packet_out: Default::default(), - players: Default::default(), - tiles: Default::default(), + players: HashMap::new(), + tiles: HashMap::new(), demand: None, end: None, + entities: vec![], points: 0, } } @@ -112,6 +115,12 @@ impl Game { self.data = gamedata.into(); self.points = 0; self.end = timer.map(|dur| Instant::now() + dur); + self.entities = self + .data + .entities + .iter() + .map(|decl| construct_entity(decl)) + .collect(); for (&p, (tile, item)) in &self.data.initial_map { self.tiles.insert( @@ -476,6 +485,18 @@ impl Game { } } + for entity in &mut self.entities { + if let Err(e) = entity.tick( + &self.data, + &mut self.points, + &mut self.packet_out, + &mut self.tiles, + dt, + ) { + warn!("entity tick failed: {e}") + } + } + return self.end.map(|t| t < Instant::now()).unwrap_or_default(); } } @@ -486,7 +507,7 @@ impl From<TileIndex> for Tile { } } -fn interact_effect( +pub fn interact_effect( data: &Gamedata, edge: bool, this: &mut Option<Item>, |