summaryrefslogtreecommitdiff
path: root/server/src/state.rs
diff options
context:
space:
mode:
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