diff options
Diffstat (limited to 'server/src/game.rs')
-rw-r--r-- | server/src/game.rs | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/server/src/game.rs b/server/src/game.rs index 23900559..72f653c4 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -65,6 +65,7 @@ pub struct Game { players: HashMap<PlayerID, Player>, packet_out: VecDeque<PacketC>, demand: Option<DemandState>, + points: i64, } impl Game { @@ -75,11 +76,13 @@ impl Game { players: Default::default(), tiles: Default::default(), demand: None, + points: 0, } } fn unload(&mut self) { - self.packet_out.push_back(PacketC::SetIngame { state: false }); + self.packet_out + .push_back(PacketC::SetIngame { state: false }); for (id, _) in self.players.drain() { self.packet_out.push_back(PacketC::RemovePlayer { id }) } @@ -189,18 +192,22 @@ impl Game { }) } } - out.push(PacketC::Score { + out.push(self.score()); + out.push(PacketC::SetIngame { state: true }); + out + } + + pub fn score(&self) -> PacketC { + PacketC::Score { + points: self.points, demands_failed: self.demand.as_ref().map(|d| d.failed).unwrap_or_default(), demands_completed: self .demand .as_ref() .map(|d| d.completed) .unwrap_or_default(), - }); - out.push(PacketC::SetIngame { state: true }); - out + } } - pub fn packet_in(&mut self, player: PlayerID, packet: PacketS) -> Result<()> { match packet { PacketS::Join { name, character } => { @@ -315,6 +322,7 @@ impl Game { tile.kind, &mut tile.item, &mut player.item, + &mut self.points, ) { match effect { InteractEffect::Put => self.packet_out.push_back(PacketC::PutItem { @@ -363,6 +371,21 @@ impl Game { item: Some(i.kind), }); } + self.packet_out.push_back({ + PacketC::Score { + points: self.points, + demands_failed: self + .demand + .as_ref() + .map(|d| d.failed) + .unwrap_or_default(), + demands_completed: self + .demand + .as_ref() + .map(|d| d.completed) + .unwrap_or_default(), + } + }) } } } @@ -396,11 +419,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) { + if let Err(err) = demand.tick( + &mut packet_out, + &mut self.tiles, + &self.data, + dt, + &mut self.points, + ) { warn!("demand tick {err}"); } if demand.score_changed { self.packet_out.push_back(PacketC::Score { + points: self.points, demands_failed: demand.failed, demands_completed: demand.completed, }); |