From 7474924a7cfdfc3d03795157f5098aaa524dac71 Mon Sep 17 00:00:00 2001 From: salmonik Date: Mon, 24 Aug 2026 18:54:23 +0200 Subject: Fix TUI: stable 7-line game render, no extra newlines, spin busy flag prevents queueing --- src/bin/client/games/slots.rs | 15 ++++++--------- src/bin/client/repl.rs | 11 +++++++++-- 2 files changed, 15 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/bin/client/games/slots.rs b/src/bin/client/games/slots.rs index bc0a9b4..76a5c4d 100644 --- a/src/bin/client/games/slots.rs +++ b/src/bin/client/games/slots.rs @@ -30,18 +30,15 @@ impl Game for SlotsGame { fn render(&self, state: &GameState) -> String { let reels = state.data.get("reels").cloned().unwrap_or_default(); - let mut output = format!("\n=== SLOTS ===\r\n"); - output += &format!("Bet: {} PLN\r\n", state.bet_amount); - output += &format!("{}\r\n", self.render_reels(&reels)); - output += "\nPress [SPACE] to spin!\r\n"; - output += "\nControls: [+/-] Adjust Bet [Q] Quit\r\n"; - output + format!( + "=== SLOTS ===\r\nBet: {} PLN\r\n{}\r\n\r\nPress [SPACE] to spin!\r\n\r\nControls: [+/-] Adjust Bet [Q] Quit", + state.bet_amount, + self.render_reels(&reels) + ) } fn render_lines(&self, _state: &GameState) -> usize { - // Fixed count matching the render() layout: - // blank, header, bet, reels, blank, prompt, blank, controls - 8 + 7 } fn get_help(&self) -> String { diff --git a/src/bin/client/repl.rs b/src/bin/client/repl.rs index d10edba..b5707ad 100644 --- a/src/bin/client/repl.rs +++ b/src/bin/client/repl.rs @@ -28,6 +28,7 @@ pub struct ClientState { pub game_manager: GameManager, cleanup_done: Arc>, in_game_mode: bool, + spinning: bool, } impl ClientState { @@ -54,6 +55,7 @@ impl ClientState { game_manager: GameManager::new(), cleanup_done: Arc::new(Mutex::new(false)), in_game_mode: false, + spinning: false, } } @@ -78,11 +80,15 @@ impl ClientState { return true; } KeyCode::Char(' ') => { + if self.spinning { + return true; // Discard keypress while busy + } 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() { + self.spinning = true; match self.game_manager.start_game(&mut stream) { Ok(()) => { let response = self.read_server_response(&mut stream); @@ -96,6 +102,7 @@ impl ClientState { Err(e) => println!("\nError starting game: {:?}", e), } self.stream = Some(stream); + self.spinning = false; } } return true; @@ -788,7 +795,7 @@ fn redraw_game(game_output: &str) { MoveToColumn(0) ) .unwrap(); - println!("{}", game_output); + print!("{}\r", game_output); stdout().flush().unwrap(); } @@ -804,7 +811,7 @@ fn redraw_game_lines(game_output: &str, lines: usize) { MoveToColumn(0) ) .unwrap(); - println!("{}", game_output); + print!("{}\r", game_output); stdout().flush().unwrap(); } -- cgit v1.2.3