CasinoGames/Baccarat/Models/GameResult.swift

88 lines
2.2 KiB
Swift

//
// GameResult.swift
// Baccarat
//
// Game outcome types and result information.
//
import Foundation
import SwiftUI
/// The possible outcomes of a baccarat round.
enum GameResult: Equatable {
case playerWins
case bankerWins
case tie
/// Display text for the result (localized).
var displayText: String {
switch self {
case .playerWins: return String.localized("PLAYER WINS")
case .bankerWins: return String.localized("BANKER WINS")
case .tie: return String.localized("TIE GAME")
}
}
/// The color associated with this result.
var color: Color {
switch self {
case .playerWins: return .blue
case .bankerWins: return .red
case .tie: return .green
}
}
/// Whether the given bet type wins with this result.
func isWinningBet(_ betType: BetType) -> Bool {
switch (self, betType) {
case (.playerWins, .player): return true
case (.bankerWins, .banker): return true
case (.tie, .tie): return true
default: return false
}
}
/// Returns true if this result is a push (tie) for non-tie bets.
/// In baccarat, if the result is a tie, Player and Banker bets push (returned).
func isPush(for betType: BetType) -> Bool {
self == .tie && betType != .tie
}
}
/// Record of a completed round for history tracking.
struct RoundResult: Identifiable {
let id = UUID()
let result: GameResult
let playerValue: Int
let bankerValue: Int
let playerPair: Bool
let bankerPair: Bool
let timestamp: Date
/// Whether either hand was a natural (8 or 9).
var isNatural: Bool {
playerValue >= 8 || bankerValue >= 8
}
/// Whether any pair occurred.
var hasPair: Bool {
playerPair || bankerPair
}
init(
result: GameResult,
playerValue: Int,
bankerValue: Int,
playerPair: Bool = false,
bankerPair: Bool = false
) {
self.result = result
self.playerValue = playerValue
self.bankerValue = bankerValue
self.playerPair = playerPair
self.bankerPair = bankerPair
self.timestamp = .now
}
}