97 lines
3.0 KiB
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
|
|
}
|
|
}
|
|
|