summaryrefslogtreecommitdiff
path: root/server/src/state.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-01 16:24:21 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-01 16:24:21 +0200
commitcd41deaf64d5b5f4f6e2488396fbf29778c4f91c (patch)
tree70691e65bbefae8b48f2869c21daac2f6a5f0199 /server/src/state.rs
parent17024786036868b66a86caaf967a65d77dc2bd15 (diff)
downloadhurrycurry-cd41deaf64d5b5f4f6e2488396fbf29778c4f91c.tar
hurrycurry-cd41deaf64d5b5f4f6e2488396fbf29778c4f91c.tar.bz2
hurrycurry-cd41deaf64d5b5f4f6e2488396fbf29778c4f91c.tar.zst
game ends with timer
Diffstat (limited to 'server/src/state.rs')
-rw-r--r--server/src/state.rs25
1 files changed, 19 insertions, 6 deletions
diff --git a/server/src/state.rs b/server/src/state.rs
index 41ffce20..ffcc8fa2 100644
--- a/server/src/state.rs
+++ b/server/src/state.rs
@@ -1,3 +1,5 @@
+use std::time::Duration;
+
use crate::{
data::DataIndex,
game::Game,
@@ -20,6 +22,8 @@ enum Command {
Start {
#[arg(default_value = "small-default-default")]
spec: String,
+ #[arg(default_value = "300")]
+ timer: u64,
},
Effect {
name: String,
@@ -33,17 +37,26 @@ impl State {
index.reload()?;
let mut game = Game::new();
- game.load(index.generate("lobby-none-none".to_string())?);
+ game.load(index.generate("lobby-none-none".to_string())?, None);
Ok(Self { game, index, tx })
}
- pub async fn tick(&mut self, dt: f32) {
- self.game.tick(dt);
+ pub async fn tick(&mut self, dt: f32) -> anyhow::Result<()> {
+ if self.game.tick(dt) {
+ self.tx
+ .send(PacketC::ServerMessage {
+ text: format!("Game finished. You reached {} points.", self.game.points),
+ })
+ .ok();
+ self.game
+ .load(self.index.generate("lobby-none-none".to_string())?, None);
+ }
while let Some(p) = self.game.packet_out() {
debug!("-> {p:?}");
let _ = self.tx.send(p);
}
+ Ok(())
}
pub async fn packet_in(&mut self, player: PlayerID, packet: PacketS) -> Result<Vec<PacketC>> {
match &packet {
@@ -81,13 +94,13 @@ impl State {
async fn handle_command(&mut self, player: PlayerID, command: Command) -> Result<()> {
match command {
- Command::Start { spec } => {
+ Command::Start { spec, timer } => {
let data = self.index.generate(spec)?;
- self.game.load(data);
+ self.game.load(data, Some(Duration::from_secs(timer)));
}
Command::End => {
self.game
- .load(self.index.generate("lobby-none-none".to_string())?);
+ .load(self.index.generate("lobby-none-none".to_string())?, None);
}
Command::Effect { name } => {
self.tx