Refactor tables and players for clarity

This commit is contained in:
Christoph Hagen
2021-12-09 11:11:17 +01:00
parent 33f72c43cf
commit 289458bfd8
17 changed files with 718 additions and 64 deletions

View File

@ -0,0 +1,26 @@
import Foundation
import WebSocketKit
class AbstractPlayer {
let name: PlayerName
var socket: WebSocket?
init(name: PlayerName, socket: WebSocket? = nil) {
self.name = name
self.socket = socket
}
init(player: Player) {
self.name = player.name
self.socket = player.socket
}
}
extension AbstractPlayer: Equatable {
static func == (lhs: AbstractPlayer, rhs: AbstractPlayer) -> Bool {
lhs.name == rhs.name
}
}

View File

@ -0,0 +1,51 @@
import Foundation
import WebSocketKit
final class BiddingPlayer {
let name: String
var socket: WebSocket?
let cards: [PlayableCard]
var isStillBidding = true
var isAllowedToOfferWedding = true
var offersWedding = false
var wouldAcceptWedding = false
init(player: DealingPlayer, cards: [PlayableCard]) {
self.name = player.name
self.socket = player.socket
self.cards = cards
}
}
extension BiddingPlayer: Player {
var canOfferWedding: Bool {
rawCards.canOfferWedding
}
var rawCards: [Card] {
cards.map { $0.card }
}
var actions: [PlayerAction] {
guard isStillBidding else {
return []
}
guard canOfferWedding, isAllowedToOfferWedding, !offersWedding else {
return [.increaseOrMatchGame, .withdrawFromAuction]
}
return [.increaseOrMatchGame, .withdrawFromAuction, .offerWedding]
}
var playedCard: Card? {
nil
}
}

View File

@ -0,0 +1,24 @@
import Foundation
import WebSocketKit
final class DealingPlayer: AbstractPlayer {
var cards: [PlayableCard] = []
var didDouble: Bool? = nil
init(player: WaitingPlayer) {
super.init(player: player)
}
}
extension DealingPlayer: Player {
var actions: [PlayerAction] {
didDouble == nil ? [.initialDoubleCost, .noDoubleCost] : []
}
var playedCard: Card? {
nil
}
}

View File

@ -0,0 +1,63 @@
import Foundation
import WebSocketKit
protocol Player: AnyObject {
var name: String { get }
var socket: WebSocket? { get set }
var playedCard: Card? { get }
var actions: [PlayerAction] { get }
var cards: [PlayableCard] { get }
}
extension Player {
// MARK: Connection
/// Indicate that the player is connected when at a table
var isConnected: Bool {
guard let socket = socket else {
return false
}
guard !socket.isClosed else {
self.socket = nil
return false
}
return true
}
func connect(using socket: WebSocket) {
_ = self.socket?.close()
self.socket = socket
}
func disconnect() -> Bool {
guard let socket = socket else {
return false
}
do {
try socket.close().wait()
} catch {
print("Failed to close socket for player: \(name): \(error)")
}
self.socket = nil
return true
}
func send(_ info: TableInfo) {
try? socket?.send(encodeJSON(info))
}
// MARK: Actions
func canPerform(_ action: PlayerAction) -> Bool {
actions.contains(action)
}
}

View File

@ -0,0 +1,30 @@
import Foundation
import WebSocketKit
final class PlayingPlayer: AbstractPlayer {
var playedCard: Card? = nil
var cards: [PlayableCard]
var leadsGame = false
var canStillRaise = true
init(player: BiddingPlayer) {
self.cards = player.cards
super.init(player: player)
}
}
extension PlayingPlayer: Player {
var actions: [PlayerAction] {
guard canStillRaise, !leadsGame else {
return []
}
return [.doubleDuringGame]
}
}

View File

@ -0,0 +1,22 @@
import Foundation
import WebSocketKit
final class WaitingPlayer: AbstractPlayer {
var canStartGame: Bool = false
}
extension WaitingPlayer: Player {
var actions: [PlayerAction] {
canStartGame ? [.deal] : []
}
var cards: [PlayableCard] {
[]
}
var playedCard: Card? {
nil
}
}