@startuml
skinparam monochrome true
abstract class PlayerState {
    canCreateGame()
    canStartGame()
    canJoinGame()
    canDrawTrainCard()
    canDrawDestinationCards()
    canDiscardDestinationCards()
    canClaimRoute()
    canChat()
}


class GameNotJoinedPlayerState {
    canCreateGame()
    canJoinGame()
}

class GameJoinedPlayerState {
    canStartGame()
    canChat()
}

class GameStartPlayerState {
    canDrawDestinationCards()
}

class GameStartDrawnDestinationCardsPlayerState {
    canDiscardDestinationCards()
}

class TurnStartPlayerState {
    canDrawTrainCard()
    canDrawDestinationCards()
    canClaimRoute()
    canChat()
}

class OneTrainCardDrawnPlayerState {
    canDrawTrainCard()
    canChat()
}

class DestinationCardsDrawnPlayerState {
    canDiscardDestinationCards()
    canChat()
}

class NotTurnPlayerState {
    canChat()
}

PlayerState <|-- GameNotJoinedPlayerState
PlayerState <|-- GameJoinedPlayerState
PlayerState <|-- GameStartPlayerState
PlayerState <|-- GameStartDrawnDestinationCardsPlayerState
PlayerState <|-- TurnStartPlayerState
PlayerState <|-- OneTrainCardDrawnPlayerState
PlayerState <|-- DestinationCardsDrawnPlayerState
PlayerState <|-- NotTurnPlayerState

@enduml
