From fd8ba0d9c7317f24e0b655c6b15ca197d5a23daa Mon Sep 17 00:00:00 2001 From: salmonik Date: Mon, 24 Aug 2026 18:11:08 +0200 Subject: Fix second-game InvalidAction: reset phase after spin, allow re-spin in Finished state --- src/bin/client/games/manager.rs | 11 +++++++++-- src/bin/client/games/traits.rs | 2 ++ src/bin/client/repl.rs | 8 ++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/bin/client/games/manager.rs b/src/bin/client/games/manager.rs index 6959214..0b5b4cb 100644 --- a/src/bin/client/games/manager.rs +++ b/src/bin/client/games/manager.rs @@ -55,7 +55,7 @@ impl GameManager { ) -> Result<(), GameError> { let game_type = self .pending_game_type - .take() + .as_ref() .ok_or(GameError::InvalidAction)?; let state = self @@ -63,7 +63,7 @@ impl GameManager { .as_mut() .ok_or(GameError::InvalidAction)?; - if state.phase != GamePhase::WaitingToStart { + if state.phase != GamePhase::WaitingToStart && state.phase != GamePhase::Finished { return Err(GameError::InvalidAction); } @@ -103,6 +103,13 @@ impl GameManager { .unwrap_or(false) } + pub fn reset_phase_to_waiting(&mut self) { + if let Some(ref mut session) = self.current_session { + session.phase = GamePhase::WaitingToStart; + session.data.clear(); + } + } + pub fn end_game(&mut self) { self.current_session = None; self.pending_game_type = None; diff --git a/src/bin/client/games/traits.rs b/src/bin/client/games/traits.rs index 19f2638..aed0c24 100644 --- a/src/bin/client/games/traits.rs +++ b/src/bin/client/games/traits.rs @@ -9,6 +9,8 @@ pub enum GameError { #[derive(Debug, Clone, PartialEq)] pub enum GamePhase { WaitingToStart, + Playing, + Finished, } #[derive(Debug, Clone)] diff --git a/src/bin/client/repl.rs b/src/bin/client/repl.rs index 91fd10e..dfcf0d2 100644 --- a/src/bin/client/repl.rs +++ b/src/bin/client/repl.rs @@ -6,6 +6,7 @@ use std::time::Instant; use crate::connection::TlsStream; use crate::database; use crate::games::manager::GameManager; +use crate::games::traits::GamePhase; use crossterm::{ cursor::{Hide, MoveToColumn, Show}, @@ -77,12 +78,15 @@ impl ClientState { return true; } KeyCode::Char(' ') => { - let should_start = !self.game_manager.is_game_started(); - if should_start { + let can_spin = self.game_manager.get_current_state() + .map(|s| s.phase == GamePhase::WaitingToStart || s.phase == GamePhase::Finished) + .unwrap_or(false); + if can_spin { if let Some(mut stream) = self.stream.take() { match self.game_manager.start_game(&mut stream) { Ok(()) => { self.play_spin_animation(&mut stream); + self.game_manager.reset_phase_to_waiting(); } Err(e) => println!("\nError starting game: {:?}", e), } -- cgit v1.2.3