diff options
Diffstat (limited to 'server/src/state.rs')
-rw-r--r-- | server/src/state.rs | 25 |
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 |