summaryrefslogtreecommitdiffstats
path: root/src/bin/client
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-08-24 18:54:23 +0200
committersalmonik <salmonik@tuta.io>2026-08-24 18:54:23 +0200
commit7474924a7cfdfc3d03795157f5098aaa524dac71 (patch)
treed9cdafb59db4e9adda34be6edcbbce68316156e0 /src/bin/client
parentv0.2.1: fix connect error overwriting prompt in raw mode (diff)
downloadzagan-bet-7474924a7cfdfc3d03795157f5098aaa524dac71.tar.gz
zagan-bet-7474924a7cfdfc3d03795157f5098aaa524dac71.zip
Fix TUI: stable 7-line game render, no extra newlines, spin busy flag prevents queueing
Diffstat (limited to 'src/bin/client')
-rw-r--r--src/bin/client/games/slots.rs15
-rw-r--r--src/bin/client/repl.rs11
2 files changed, 15 insertions, 11 deletions
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 {
30 fn render(&self, state: &GameState) -> String { 30 fn render(&self, state: &GameState) -> String {
31 let reels = state.data.get("reels").cloned().unwrap_or_default(); 31 let reels = state.data.get("reels").cloned().unwrap_or_default();
32 32
33 let mut output = format!("\n=== SLOTS ===\r\n"); 33 format!(
34 output += &format!("Bet: {} PLN\r\n", state.bet_amount); 34 "=== SLOTS ===\r\nBet: {} PLN\r\n{}\r\n\r\nPress [SPACE] to spin!\r\n\r\nControls: [+/-] Adjust Bet [Q] Quit",
35 output += &format!("{}\r\n", self.render_reels(&reels)); 35 state.bet_amount,
36 output += "\nPress [SPACE] to spin!\r\n"; 36 self.render_reels(&reels)
37 output += "\nControls: [+/-] Adjust Bet [Q] Quit\r\n"; 37 )
38 output
39 } 38 }
40 39
41 fn render_lines(&self, _state: &GameState) -> usize { 40 fn render_lines(&self, _state: &GameState) -> usize {
42 // Fixed count matching the render() layout: 41 7
43 // blank, header, bet, reels, blank, prompt, blank, controls
44 8
45 } 42 }
46 43
47 fn get_help(&self) -> String { 44 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 {
28 pub game_manager: GameManager, 28 pub game_manager: GameManager,
29 cleanup_done: Arc<Mutex<bool>>, 29 cleanup_done: Arc<Mutex<bool>>,
30 in_game_mode: bool, 30 in_game_mode: bool,
31 spinning: bool,
31} 32}
32 33
33impl ClientState { 34impl ClientState {
@@ -54,6 +55,7 @@ impl ClientState {
54 game_manager: GameManager::new(), 55 game_manager: GameManager::new(),
55 cleanup_done: Arc::new(Mutex::new(false)), 56 cleanup_done: Arc::new(Mutex::new(false)),
56 in_game_mode: false, 57 in_game_mode: false,
58 spinning: false,
57 } 59 }
58 } 60 }
59 61
@@ -78,11 +80,15 @@ impl ClientState {
78 return true; 80 return true;
79 } 81 }
80 KeyCode::Char(' ') => { 82 KeyCode::Char(' ') => {
83 if self.spinning {
84 return true; // Discard keypress while busy
85 }
81 let can_spin = self.game_manager.get_current_state() 86 let can_spin = self.game_manager.get_current_state()
82 .map(|s| s.phase == GamePhase::WaitingToStart || s.phase == GamePhase::Finished) 87 .map(|s| s.phase == GamePhase::WaitingToStart || s.phase == GamePhase::Finished)
83 .unwrap_or(false); 88 .unwrap_or(false);
84 if can_spin { 89 if can_spin {
85 if let Some(mut stream) = self.stream.take() { 90 if let Some(mut stream) = self.stream.take() {
91 self.spinning = true;
86 match self.game_manager.start_game(&mut stream) { 92 match self.game_manager.start_game(&mut stream) {
87 Ok(()) => { 93 Ok(()) => {
88 let response = self.read_server_response(&mut stream); 94 let response = self.read_server_response(&mut stream);
@@ -96,6 +102,7 @@ impl ClientState {
96 Err(e) => println!("\nError starting game: {:?}", e), 102 Err(e) => println!("\nError starting game: {:?}", e),
97 } 103 }
98 self.stream = Some(stream); 104 self.stream = Some(stream);
105 self.spinning = false;
99 } 106 }
100 } 107 }
101 return true; 108 return true;
@@ -788,7 +795,7 @@ fn redraw_game(game_output: &str) {
788 MoveToColumn(0) 795 MoveToColumn(0)
789 ) 796 )
790 .unwrap(); 797 .unwrap();
791 println!("{}", game_output); 798 print!("{}\r", game_output);
792 stdout().flush().unwrap(); 799 stdout().flush().unwrap();
793} 800}
794 801
@@ -804,7 +811,7 @@ fn redraw_game_lines(game_output: &str, lines: usize) {
804 MoveToColumn(0) 811 MoveToColumn(0)
805 ) 812 )
806 .unwrap(); 813 .unwrap();
807 println!("{}", game_output); 814 print!("{}\r", game_output);
808 stdout().flush().unwrap(); 815 stdout().flush().unwrap();
809} 816}
810 817