summaryrefslogtreecommitdiffstats
path: root/src/client/games/slots.rs
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-10-28 23:19:52 +0100
committersalmonik <salmonik@tuta.io>2026-10-28 23:19:52 +0100
commit2915d826f744612e0d975282f5bddf13270b9f3f (patch)
treea2864bfaef91070ac3b4e13b8b731e539a757cc8 /src/client/games/slots.rs
parentv1.0.0: replace slots with 5x3 reels and five paylines (diff)
downloadzagan-bet-2915d826f744612e0d975282f5bddf13270b9f3f.tar.gz
zagan-bet-2915d826f744612e0d975282f5bddf13270b9f3f.zip
v1.1.0: highlight winning symbols on the slots board
Diffstat (limited to 'src/client/games/slots.rs')
-rw-r--r--src/client/games/slots.rs29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/client/games/slots.rs b/src/client/games/slots.rs
index 39c43b2..c367fcb 100644
--- a/src/client/games/slots.rs
+++ b/src/client/games/slots.rs
@@ -13,22 +13,40 @@ impl SlotsGame {
13 Self 13 Self
14 } 14 }
15 15
16 fn cell(chars: &[char], row: usize, col: usize) -> char { 16 fn cell(chars: &[char], row: usize, col: usize, winning: &[usize]) -> String {
17 if chars.len() == REELS * ROWS { 17 let symbol = if chars.len() == REELS * ROWS {
18 chars.get(col * ROWS + row).copied().unwrap_or('?') 18 chars.get(col * ROWS + row).copied().unwrap_or('?')
19 } else if chars.len() == 3 && row == 0 { 19 } else if chars.len() == 3 && row == 0 {
20 // Legacy 3-symbol server: degrade to the first row. 20 // Legacy 3-symbol server: degrade to the first row.
21 chars.get(col).copied().unwrap_or('?') 21 chars.get(col).copied().unwrap_or('?')
22 } else { 22 } else {
23 '?' 23 '?'
24 };
25
26 if winning.contains(&(col * ROWS + row)) {
27 format!("{{ {} }}", symbol)
28 } else {
29 format!("[ {} ]", symbol)
24 } 30 }
25 } 31 }
26 32
27 fn render_grid(&self, reels: &str) -> [String; ROWS] { 33 fn highlighted_cells(state: &GameState) -> Vec<usize> {
34 state
35 .data
36 .get("win_cells")
37 .map(|raw| {
38 raw.split(',')
39 .filter_map(|value| value.trim().parse::<usize>().ok())
40 .collect()
41 })
42 .unwrap_or_default()
43 }
44
45 fn render_grid(&self, reels: &str, winning: &[usize]) -> [String; ROWS] {
28 let chars: Vec<char> = reels.chars().collect(); 46 let chars: Vec<char> = reels.chars().collect();
29 std::array::from_fn(|row| { 47 std::array::from_fn(|row| {
30 (0..REELS) 48 (0..REELS)
31 .map(|col| format!("[ {} ]", Self::cell(&chars, row, col))) 49 .map(|col| Self::cell(&chars, row, col, winning))
32 .collect::<Vec<_>>() 50 .collect::<Vec<_>>()
33 .join(" ") 51 .join(" ")
34 }) 52 })
@@ -84,7 +102,8 @@ impl Game for SlotsGame {
84 .get("balance") 102 .get("balance")
85 .map(String::as_str) 103 .map(String::as_str)
86 .unwrap_or("?"); 104 .unwrap_or("?");
87 let grid = self.render_grid(&reels); 105 let winning = Self::highlighted_cells(state);
106 let grid = self.render_grid(&reels, &winning);
88 107
89 format!( 108 format!(
90 "=== SLOTS ===\r\nBet: {} PLN Lines: {} Balance: {} PLN\r\n{}\r\n{}\r\n{}\r\n\r\n{}\r\n{}\r\n[+/-] Bet [SPACE] Spin [Q] Quit", 109 "=== SLOTS ===\r\nBet: {} PLN Lines: {} Balance: {} PLN\r\n{}\r\n{}\r\n{}\r\n\r\n{}\r\n{}\r\n[+/-] Bet [SPACE] Spin [Q] Quit",