public PokerGame(IEventBroker domainEvents, int minPlayers = 3) { reservedSeats = new ObservableCollection <Guid>(); var seatButler = domainEvents.Subscribe <SeatRequested>(p => { if (p.SeatPosition.HasValue) { reservedSeats.Insert(p.SeatPosition.Value, p.ClientId); } else { reservedSeats.Add(p.ClientId); } domainEvents.Publish(new SeatReserved(p.ClientId, reservedSeats.IndexOf(p.ClientId))); }); var addPlayerName = domainEvents.Subscribe <AddPlayer>(e => { if (!reservedSeats.Contains(e.ClientId)) { domainEvents.Publish(new ReservationNotFound(e.ClientId)); } else if (Players.Any(x => x.Name == e.PlayerName)) { domainEvents.Publish(new PlayerNameRefused(e.ClientId)); } else { var player = playerSeatingPositions[reservedSeats.IndexOf(e.ClientId)] = new Player(e.PlayerName); domainEvents.Publish(new PlayerAdded(e.ClientId, player)); } }); var waitForPlayersToBeReady = domainEvents.Subscribe <PlayerReady>(p => { if (Players.Contains(p.player) && !readyPlayers.Contains(p.player)) { readyPlayers.Add(p.player); } if (readyPlayers.Count >= minPlayers && readyPlayers.Count == Players.Count()) { domainEvents.Publish(new AllPlayersReady()); } }); var cutForDealerWhenAllPlayersReady = domainEvents.Subscribe <AllPlayersReady>(p => { var dealerCutRound = new DealerCutRound(Players.ToList(), domainEvents); }); var startRoundOnceDealerChosen = domainEvents.Subscribe <DealerChosen>(c => { var blindsRound = new RoundWithBlinds(c.dealer, Players.ToList(), domainEvents); }); }
public DealerCutRound(IList <Player> players, IEventBroker domainEvents) { this.players = players; this.domainEvents = domainEvents; checkCutsComplete = domainEvents.Subscribe <DealerCardCut>(c => { dealerCuts[c.player] = c.card; // check if we've all cut if ((players.Count - dealerCuts.Count) == 0) { // find the winner so we can make them dealer, deal with DRAW!! var cutsGroupedByCardAndOrderedHighestFirst = dealerCuts.GroupBy(x => x.Value).OrderByDescending(x => x.Key); var CutsWithHighCard = cutsGroupedByCardAndOrderedHighestFirst.First(); if (CutsWithHighCard.Count() > 1) { domainEvents.Publish(new DealerCutDrawn(CutsWithHighCard.ToList())); } else { var dealer = cutsGroupedByCardAndOrderedHighestFirst.First().Single().Key; domainEvents.Publish(new DealerChosen(dealer)); } } }); onDraw = domainEvents.Subscribe <DealerCutDrawn>(e => { onDraw.Dispose(); onFinish.Dispose(); checkCutsComplete.Dispose(); var dealerCutRound = new DealerCutRound(e.players, domainEvents); }); onFinish = domainEvents.Subscribe <DealerChosen>(e => { onDraw.Dispose(); onFinish.Dispose(); checkCutsComplete.Dispose(); }); }