aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-10-30 14:41:33 +0100
committermetamuffin <metamuffin@disroot.org>2025-10-30 14:41:33 +0100
commit707a281d5310166300afa250ec041d9cc65f0068 (patch)
tree8c14b14a7c6b927e83e51d0f770e191b15a61001 /server/src
parentd238e7a3250791e43d1e26e009f5d56cfd200e08 (diff)
downloadhurrycurry-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.rs16
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 {