From 37dedc342c087506e502c78a952b45b1c91602fb Mon Sep 17 00:00:00 2001 From: salmonik Date: Sun, 1 Nov 2026 18:03:24 +0100 Subject: v4.0.2: port slots, blackjack and crash to structured views --- src/client/games/blackjack.rs | 59 +++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 33 deletions(-) (limited to 'src/client/games/blackjack.rs') diff --git a/src/client/games/blackjack.rs b/src/client/games/blackjack.rs index 8fa5693..e8f251f 100644 --- a/src/client/games/blackjack.rs +++ b/src/client/games/blackjack.rs @@ -1,5 +1,6 @@ use super::traits::{Game, GameState}; -use crate::blackjack::{BlackjackState, card_label}; +use crate::blackjack::card_label; +use crate::client::view::BlackjackView; pub const BLACKJACK_BOARD_LINES: usize = 6; @@ -10,13 +11,6 @@ impl BlackjackGame { Self } - fn state(state: &GameState) -> Option { - state - .data - .get("blackjack") - .and_then(|raw| serde_json::from_str(raw).ok()) - } - fn cards(cards: &[String]) -> String { cards .iter() @@ -43,40 +37,29 @@ impl BlackjackGame { _ => "Hand complete.".to_string(), } } -} -impl Game for BlackjackGame { - fn get_name(&self) -> &'static str { - "Blackjack" - } - - fn render(&self, state: &GameState) -> String { - let status = state - .data - .get("status") - .map(String::as_str) - .unwrap_or("ready"); - let balance = state.data.get("balance").map(String::as_str).unwrap_or("?"); - let hand = Self::state(state); + /// Render a blackjack view to terminal lines. The GUI paints the same view. + pub fn render_view(view: &BlackjackView) -> String { + let balance = view + .balance + .map(|balance| balance.to_string()) + .unwrap_or_else(|| "?".to_string()); - if let Some(error) = state.data.get("error") { - let bet = hand - .as_ref() - .map(|hand| hand.bet) - .unwrap_or(state.bet_amount); + if let Some(error) = &view.error { + let bet = view.hand.as_ref().map(|hand| hand.bet).unwrap_or(view.bet); return format!( "=== BLACKJACK ===\r\nBalance: {balance} Kr Bet: {bet} Kr\r\n\r\n\r\nERROR: {error}\r\n[Q] Quit" ); } let (dealer, dealer_total, player, player_total, bet, text, controls) = - if let Some(hand) = &hand { - let bet = if status == "player" { + if let Some(hand) = &view.hand { + let bet = if view.status == "player" { hand.bet } else { - state.bet_amount + view.bet }; - let text = match status { + let text = match view.status.as_str() { "player" => { if hand.actions.iter().any(|action| action == "double") { "Hit, stand or double.".to_string() @@ -89,7 +72,7 @@ impl Game for BlackjackGame { "done" => Self::result_text(&hand.result, hand.winnings), _ => "Press [SPACE] to deal.".to_string(), }; - let controls = if status == "player" { + let controls = if view.status == "player" { if hand.actions.iter().any(|action| action == "double") { "[H]it [S]tand [D]ouble [Q] Forfeit".to_string() } else { @@ -113,7 +96,7 @@ impl Game for BlackjackGame { 0, "—".to_string(), 0, - state.bet_amount, + view.bet, "Press [SPACE] to deal.".to_string(), "[SPACE] Deal [+/-] Bet [Q] Quit".to_string(), ) @@ -124,6 +107,16 @@ impl Game for BlackjackGame { balance, bet, dealer, dealer_total, player, player_total, text, controls ) } +} + +impl Game for BlackjackGame { + fn get_name(&self) -> &'static str { + "Blackjack" + } + + fn render(&self, state: &GameState) -> String { + Self::render_view(&BlackjackView::from_state(state)) + } fn render_lines(&self, _state: &GameState) -> usize { BLACKJACK_BOARD_LINES -- cgit v1.2.3