diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-10-30 14:41:33 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-10-30 14:41:33 +0100 |
| commit | 707a281d5310166300afa250ec041d9cc65f0068 (patch) | |
| tree | 8c14b14a7c6b927e83e51d0f770e191b15a61001 /server/src | |
| parent | d238e7a3250791e43d1e26e009f5d56cfd200e08 (diff) | |
| download | hurrycurry-707a281d5310166300afa250ec041d9cc65f0068.tar hurrycurry-707a281d5310166300afa250ec041d9cc65f0068.tar.bz2 hurrycurry-707a281d5310166300afa250ec041d9cc65f0068.tar.zst | |
Determine game end via score's time remaining. Remove end timestamp. fixes #493
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/server.rs | 16 |
1 files changed, 8 insertions, 8 deletions
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<Duration>, packet_out: &mut VecDeque<PacketC>, + 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<Duration>, packet_out: &mut VecDeque<PacketC>, + 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 { |