diff options
Diffstat (limited to 'server/src/game.rs')
-rw-r--r-- | server/src/game.rs | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/server/src/game.rs b/server/src/game.rs index defaf7bf..595816e1 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -16,14 +16,14 @@ */ use crate::{ - customer::movement::PLAYER_SPEED_LIMIT, + customer::{movement::PLAYER_SPEED_LIMIT, DemandState}, data::Gamedata, interaction::{interact, tick_tile, InteractEffect, TickEffect}, protocol::{ItemIndex, Message, PacketC, PacketS, PlayerID, RecipeIndex, TileIndex}, }; use anyhow::{anyhow, bail, Result}; use glam::{IVec2, Vec2}; -use log::info; +use log::{info, warn}; use std::{ collections::{HashMap, VecDeque}, ops::Deref, @@ -64,6 +64,7 @@ pub struct Game { tiles: HashMap<IVec2, Tile>, players: HashMap<PlayerID, Player>, packet_out: VecDeque<PacketC>, + demand: Option<DemandState>, } impl Game { @@ -73,6 +74,7 @@ impl Game { packet_out: Default::default(), players: Default::default(), tiles: Default::default(), + demand: None, } } @@ -87,6 +89,7 @@ impl Game { neighbors: [None, None, None, None], }) } + self.demand = None; } pub fn load(&mut self, gamedata: Gamedata) { let players = self @@ -99,6 +102,7 @@ impl Game { self.unload(); self.data = gamedata.into(); + for (&p, (tile, item)) in &self.data.initial_map { self.tiles.insert( p, @@ -126,6 +130,10 @@ impl Game { ); } + if !self.data.demands.is_empty() { + self.demand = Some(DemandState::new(self.data.clone(), &self.tiles)) + } + self.packet_out.extend(self.prime_client()); } @@ -375,6 +383,18 @@ impl Game { } pub fn tick(&mut self, dt: f32) { + if let Some(demand) = &mut self.demand { + let mut packet_out = Vec::new(); + if let Err(err) = demand.tick(&mut packet_out, &mut self.tiles, &self.data, dt) { + warn!("demand tick {err}"); + } + for (player, packet) in packet_out { + if let Err(err) = self.packet_in(player, packet) { + warn!("demand packet {err}"); + } + } + } + for (&pos, tile) in &mut self.tiles { if let Some(effect) = tick_tile(dt, &self.data, tile) { match effect { |