From 707a281d5310166300afa250ec041d9cc65f0068 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 30 Oct 2025 14:41:33 +0100 Subject: Determine game end via score's time remaining. Remove end timestamp. fixes #493 --- server/game-core/src/lib.rs | 9 ++++----- server/src/server.rs | 16 ++++++++-------- 2 files changed, 12 insertions(+), 13 deletions(-) (limited to 'server') diff --git a/server/game-core/src/lib.rs b/server/game-core/src/lib.rs index d4b7ed97..25f8600a 100644 --- a/server/game-core/src/lib.rs +++ b/server/game-core/src/lib.rs @@ -29,7 +29,6 @@ use spatial_index::SpatialIndex; use std::{ collections::{BTreeSet, HashMap, HashSet, VecDeque}, sync::Arc, - time::Instant, }; #[derive(Debug, Clone, PartialEq)] @@ -70,7 +69,6 @@ pub struct Game { pub tiles: HashMap, pub players: HashMap, - pub end: Option, pub lobby: bool, pub environment_effects: HashSet, pub score: Score, @@ -198,9 +196,10 @@ impl Game { self.tiles.remove(&pos); self.walkable.remove(&pos); if let Some(prev) = self.tiles.get(&pos) - && let Some(set) = self.tile_index.get_mut(&prev.kind) { - set.remove(&pos); - } + && let Some(set) = self.tile_index.get_mut(&prev.kind) + { + set.remove(&pos); + } if let Some(kind) = kind { self.tiles.insert(pos, Tile { kind, item: None }); if !self.data_index.tile_collide[kind.0] { diff --git a/server/src/server.rs b/server/src/server.rs index 66553640..47f556e2 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -128,6 +128,7 @@ pub trait GameServerExt { serverdata: &Serverdata, timer: Option, packet_out: &mut VecDeque, + is_lobby: bool, ); #[allow(clippy::too_many_arguments)] fn join_player( @@ -160,7 +161,6 @@ impl GameServerExt for Game { }) } self.score = Score::default(); - self.end = None; self.environment_effects.clear(); self.walkable.clear(); self.tile_index.clear(); @@ -172,6 +172,7 @@ impl GameServerExt for Game { serverdata: &Serverdata, timer: Option, packet_out: &mut VecDeque, + is_lobby: bool, ) { let players = self .players @@ -182,14 +183,13 @@ impl GameServerExt for Game { self.unload(packet_out); - self.lobby = gamedata.current_map == "lobby"; + self.lobby = is_lobby; self.data = gamedata.into(); self.data_index.update(&self.data); self.score = Score { time_remaining: timer.map(|dur| dur.as_secs_f64()).unwrap_or(0.), ..Default::default() }; - self.end = timer.map(|dur| Instant::now() + dur); for (&p, (tile, item)) in &serverdata.initial_map { self.tiles.insert( @@ -379,11 +379,13 @@ impl Server { warn!("Internal entity destructor packet errored: {e}"); } } + let is_lobby = gamedata.current_map == self.config.lobby; self.game.load( gamedata, &serverdata, timer.or(serverdata.default_timer), &mut self.packet_out, + is_lobby, ); self.entities.clear(); for ed in &serverdata.entity_decls { @@ -772,11 +774,9 @@ impl Server { } } - let now = Instant::now(); - - if let Some(end) = self.game.end { - self.game.score.time_remaining = (end - now).as_secs_f64(); - if end < now { + if !self.game.lobby { + self.game.score.time_remaining -= dt as f64; + if self.game.score.time_remaining < 0. { let relative_score = (self.game.score.points * 100) / self.data.score_baseline.max(1); self.game.score.stars = match relative_score { -- cgit v1.3