From 501f1346780bd9dc3be55ad46c5d58c1a4909061 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 22 Dec 2025 18:04:18 -0600 Subject: [PATCH] Signed-off-by: Matt Bruce --- Baccarat/Baccarat/Engine/GameState.swift | 12 ++++++++++ .../Baccarat/Resources/Localizable.xcstrings | 22 +++++++++++++++++++ .../Views/Game/ActionButtonsView.swift | 19 ++++++++++++---- .../Views/Game/ActionButtonsView.swift | 5 ++++- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/Baccarat/Baccarat/Engine/GameState.swift b/Baccarat/Baccarat/Engine/GameState.swift index d453fa8..7525c50 100644 --- a/Baccarat/Baccarat/Engine/GameState.swift +++ b/Baccarat/Baccarat/Engine/GameState.swift @@ -318,6 +318,18 @@ final class GameState { return bet.amount >= minBet } + /// Whether the main bet exists but is below the minimum required. + var isMainBetBelowMinimum: Bool { + guard let bet = mainBet else { return false } + return bet.amount < minBet + } + + /// Amount needed to reach the minimum bet. + var amountNeededForMinimum: Int { + guard let bet = mainBet else { return minBet } + return max(0, minBet - bet.amount) + } + /// Whether a bet type can accept more chips (hasn't hit max). func canAddToBet(type: BetType, amount: Int) -> Bool { let currentAmount = betAmount(for: type) diff --git a/Baccarat/Baccarat/Resources/Localizable.xcstrings b/Baccarat/Baccarat/Resources/Localizable.xcstrings index f14f40a..ad140f4 100644 --- a/Baccarat/Baccarat/Resources/Localizable.xcstrings +++ b/Baccarat/Baccarat/Resources/Localizable.xcstrings @@ -457,6 +457,28 @@ } } }, + "Add $%lld more to meet minimum" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add $%lld more to meet minimum" + } + }, + "es-MX" : { + "stringUnit" : { + "state" : "translated", + "value" : "Añade $%lld más para alcanzar el mínimo" + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajoutez %lld$ de plus pour atteindre le minimum" + } + } + } + }, "After generating:" : { "comment" : "A heading for the instructions section of the icon generator view.", "localizations" : { diff --git a/Baccarat/Baccarat/Views/Game/ActionButtonsView.swift b/Baccarat/Baccarat/Views/Game/ActionButtonsView.swift index 55f0203..5961c1a 100644 --- a/Baccarat/Baccarat/Views/Game/ActionButtonsView.swift +++ b/Baccarat/Baccarat/Views/Game/ActionButtonsView.swift @@ -29,7 +29,7 @@ struct ActionButtonsView: View { private let buttonFontSize: CGFloat = Design.BaseFontSize.xLarge private let iconSize: CGFloat = Design.BaseFontSize.xxLarge + Design.Spacing.xSmall private let statusFontSize: CGFloat = Design.BaseFontSize.medium - private let containerHeight: CGFloat = 50 + private let containerHeight: CGFloat = 70 // MARK: - Body @@ -57,10 +57,21 @@ struct ActionButtonsView: View { // MARK: - Private Views private var bettingButtons: some View { - HStack(spacing: Design.Spacing.medium) { - clearButton - dealButton + VStack(spacing: Design.Spacing.small) { + // Show hint if main bet is below minimum + if gameState.isMainBetBelowMinimum { + Text(String(localized: "Add $\(gameState.amountNeededForMinimum) more to meet minimum")) + .font(.system(size: Design.BaseFontSize.small, weight: .medium)) + .foregroundStyle(.orange) + .transition(.opacity.combined(with: .scale(scale: 0.8))) + } + + HStack(spacing: Design.Spacing.medium) { + clearButton + dealButton + } } + .animation(.easeInOut(duration: Design.Animation.standard), value: gameState.isMainBetBelowMinimum) } private var dealingIndicator: some View { diff --git a/Blackjack/Blackjack/Views/Game/ActionButtonsView.swift b/Blackjack/Blackjack/Views/Game/ActionButtonsView.swift index 759055a..a71e51a 100644 --- a/Blackjack/Blackjack/Views/Game/ActionButtonsView.swift +++ b/Blackjack/Blackjack/Views/Game/ActionButtonsView.swift @@ -36,6 +36,7 @@ struct ActionButtonsView: View { } } .animation(.spring(duration: Design.Animation.quick), value: state.currentPhase) + .animation(.easeInOut(duration: Design.Animation.standard), value: state.currentBet > 0) } .frame(minHeight: containerHeight) .padding(.horizontal, Design.Spacing.large) @@ -52,7 +53,7 @@ struct ActionButtonsView: View { Text(String(localized: "Add $\(state.amountNeededForMinimum) more to meet minimum")) .font(.system(size: Design.BaseFontSize.small, weight: .medium)) .foregroundStyle(.orange) - .transition(.opacity) + .transition(.opacity.combined(with: .scale(scale: 0.8))) } HStack(spacing: Design.Spacing.medium) { @@ -76,6 +77,8 @@ struct ActionButtonsView: View { .disabled(!state.canDeal) } } + .transition(.opacity.combined(with: .scale(scale: 0.9))) + .animation(.easeInOut(duration: Design.Animation.standard), value: state.isBetBelowMinimum) } }