Schafkopf-Server/Sources/App/Model/Tables/DealingTable.swift
2021-12-18 15:08:43 +01:00

62 lines
2.0 KiB
Swift

import Foundation
final class DealingTable: AbstractTable<DealingPlayer> {
init(table: WaitingTable) {
let cards = Dealer.dealFirstCards()
for (index, player) in table.players.enumerated() {
player.cards = cards[index]
}
let players = table.players.map(DealingPlayer.init)
super.init(table: table, players: players)
}
/// All players either doubled or didn't double
var allPlayersActed: Bool {
!players.contains { $0.didDouble == nil }
}
/// At least one player placed a bid
var hasDouble: Bool {
players.contains { $0.didDouble == true }
}
override func perform(action: PlayerAction, forPlayer name: PlayerName) -> (result: PlayerActionResult, table: ManageableTable?) {
guard let player = players.player(named: name) else {
print("Player \(name) unexpectedly missing from dealing table \(self.name)")
return (.tableStateInvalid, nil)
}
guard player.canPerform(action) else {
return (.tableStateInvalid, nil)
}
switch action {
case .initialDoubleCost:
return perform(double: true, forPlayer: player)
case .noDoubleCost:
return perform(double: false, forPlayer: player)
default:
return (.tableStateInvalid, nil)
}
}
private func perform(double: Bool, forPlayer player: DealingPlayer) -> (result: PlayerActionResult, table: ManageableTable?) {
guard player.didDouble == nil else {
return (.tableStateInvalid, nil)
}
player.didDouble = double
guard allPlayersActed else {
return (.success, nil)
}
guard hasDouble else {
// Revert to a waiting table and switch to the next player
let table = WaitingTable(oldTableAdvancedByOne: self)
return (.success, table)
}
// Automatically adds remaining cards to the players
let table = BiddingTable(table: self)
return (.success, table)
}
}