public async Task Deal() { switch (HandState.GetCurrentStage()) { case Models.HandStage.Preflop: var currentPlayer = Table.SmallBlind; var cardsDealtPerPlayer = 0; while (!(cardsDealtPerPlayer == 2)) { var playerCard = CardDeck.GetNextCard(); currentPlayer.Value.PocketCards[cardsDealtPerPlayer] = playerCard; var dealCardEvent = new GameEvent() { EventType = GameActionType.DealCard, Data = new { PlayerId = currentPlayer.Value.Id, Card = playerCard } }; await DispatchPlayerCard(dealCardEvent); if (currentPlayer == Table.Dealer) { cardsDealtPerPlayer++; } currentPlayer = Table.GetNextActivePlayerNode(currentPlayer); } break; case Models.HandStage.Flop: _ = CardDeck.GetNextCard(); List <Card> cardsToDeal = CardDeck.GetNextCards(3); BoardCards.AddRange(cardsToDeal); await DispatchGameEvent(new GameEvent() { EventType = GameActionType.DealFlop, Data = cardsToDeal }); break; case Models.HandStage.Turn: _ = CardDeck.GetNextCard(); var turnCard = CardDeck.GetNextCard(); BoardCards.Add(turnCard); await DispatchGameEvent(new GameEvent() { EventType = GameActionType.DealTurn, Data = turnCard }); break; case Models.HandStage.River: _ = CardDeck.GetNextCard(); var riverCard = CardDeck.GetNextCard(); BoardCards.Add(riverCard); await DispatchGameEvent(new GameEvent() { EventType = GameActionType.DealTurn, Data = riverCard }); break; default: break; } }