summaryrefslogtreecommitdiff
path: root/server/src/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/game.rs')
-rw-r--r--server/src/game.rs24
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 {