aboutsummaryrefslogtreecommitdiff
path: root/server
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
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')
-rw-r--r--server/game-core/src/lib.rs9
-rw-r--r--server/src/server.rs16
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 {