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 | |
| 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
| -rw-r--r-- | server/game-core/src/lib.rs | 9 | ||||
| -rw-r--r-- | server/src/server.rs | 16 |
2 files changed, 12 insertions, 13 deletions
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<IVec2, Tile>, pub players: HashMap<PlayerID, Player>, - pub end: Option<Instant>, pub lobby: bool, pub environment_effects: HashSet<String>, 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<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 { |