CasinoGames/Blackjack/Models/GameResult.swift

97 lines
3.0 KiB
Swift

//
// GameResult.swift
// Blackjack
//
// Possible outcomes for a Blackjack hand.
//
import SwiftUI
/// Result of a single Blackjack hand.
enum HandResult: Equatable {
case blackjack // Natural 21
case win // Beat dealer
case lose // Lost to dealer or bust
case push // Tie
case bust // Over 21
case surrender // Gave up half bet
case insuranceWin // Dealer had blackjack
case insuranceLose // Dealer didn't have blackjack
/// String identifier for persistence.
var saveName: String {
switch self {
case .blackjack: return "blackjack"
case .win: return "win"
case .lose: return "lose"
case .push: return "push"
case .bust: return "bust"
case .surrender: return "surrender"
case .insuranceWin: return "insuranceWin"
case .insuranceLose: return "insuranceLose"
}
}
var displayText: String {
switch self {
case .blackjack: return String(localized: "BLACKJACK!")
case .win: return String(localized: "WIN!")
case .lose: return String(localized: "LOSE")
case .push: return String(localized: "PUSH")
case .bust: return String(localized: "BUST!")
case .surrender: return String(localized: "SURRENDER")
case .insuranceWin: return String(localized: "INSURANCE WINS")
case .insuranceLose: return String(localized: "INSURANCE LOSES")
}
}
var color: Color {
switch self {
case .blackjack: return .yellow
case .win: return .green
case .lose, .bust, .insuranceLose: return .red
case .push: return .blue
case .surrender: return .orange
case .insuranceWin: return .green
}
}
var isWin: Bool {
switch self {
case .blackjack, .win, .insuranceWin: return true
default: return false
}
}
}
/// Overall game result for the round.
struct RoundResult: Equatable {
/// Results for all player hands (index 0 = Hand 1, index 1 = Hand 2, etc.)
let handResults: [HandResult]
let insuranceResult: HandResult?
let totalWinnings: Int
let wasBlackjack: Bool
/// The main/best result for display purposes (first hand, or best if split)
var mainHandResult: HandResult {
// Return the best result for the headline
if wasBlackjack { return .blackjack }
if handResults.contains(.win) { return .win }
if handResults.contains(.push) { return .push }
if handResults.contains(.surrender) { return .surrender }
if handResults.allSatisfy({ $0 == .bust }) { return .bust }
return handResults.first ?? .lose
}
/// Whether this round had split hands
var hadSplit: Bool {
handResults.count > 1
}
/// Legacy accessor for backwards compatibility
var splitHandResult: HandResult? {
handResults.count > 1 ? handResults[1] : nil
}
}