diff options
Diffstat (limited to 'src/client/games/slots.rs')
| -rw-r--r-- | src/client/games/slots.rs | 29 |
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", |
