public override void SetupPhases() { PhaseActions = new List <Func <TableDealer, DisplayStage[]> >(); var chipMovingPhases = new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.BetsOut, DisplayStage.Scooping, DisplayStage.PotScooped, DisplayStage.Delivering, DisplayStage.DeliverPot, DisplayStage.PotDelivered }; //Reset table for new hand PhaseActions.Add((tableDealer) => { tableDealer.CleanTableForNewHand(); // See if there are enough players to start a hand // more than one player and at least one non-computer if (tableDealer.Table.OccupiedSeats().Count() > 1 && tableDealer.Table.OccupiedSeats().Any(s => !s.Player.Computer)) { // Reset Pause request for all seats. foreach (var s in tableDealer.Table.AllSeats()) { if (s.Status == SeatStatus.PlayOne) { s.Status = SeatStatus.PleasePause; } } return(new DisplayStage[] { }); } else { tableDealer.Table.PhaseTitle = "Waiting for Player(s)"; tableDealer.Table.PhaseMessage = ""; return(null); } }); PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Hands Dealt"; tableDealer.Table.PhaseMessage = ""; tableDealer.DealHands(); return(new DisplayStage[] { DisplayStage.DealtCards }); }); //Layout Computer Hands PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Layout Hands"; tableDealer.Table.PhaseMessage = ""; tableDealer.LayoutHands(); return(new DisplayStage[] { DisplayStage.DealtCards }); }); //Hands Laid Out PhaseActions.Add((tableDealer) => { // Need to wait until all hands are laid out before continuing. if (tableDealer.Table.SeatsWithHands().Any(s => !s.Hand.HandsLaidOut)) { return(null); } // Reveal all hands when everyone has finished the Layout. foreach (var s in tableDealer.Table.SeatsWithHands()) { s.Hand.Revealed = true; var tHand = s.Hand as TaiwaneseHand; } tableDealer.Table.PhaseTitle = "Hands Revealed"; tableDealer.Table.PhaseMessage = ""; return(new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.DealtCards }); }); //Deal 1st Board PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Board One"; tableDealer.Table.PhaseMessage = ""; var board = GetBoard(); tableDealer.Deck.CompleteCards(board); tableDealer.Table.SetBoard(board); return(new DisplayStage[] { DisplayStage.DealtCards }); }); //Play Top Hand PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Top Hand"; tableDealer.Table.PhaseMessage = ""; PlayTopHand(tableDealer.Table); LogTable(tableDealer.Table, "Top Hand 1"); return(chipMovingPhases); }); //Play Middle Hand PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Middle Hand"; tableDealer.Table.PhaseMessage = ""; PlayMiddleHand(tableDealer.Table); LogTable(tableDealer.Table, "Middle Hand 1"); return(chipMovingPhases); }); //Play Bottom Hand PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Bottom Hand"; tableDealer.Table.PhaseMessage = ""; PlayBottomHand(tableDealer.Table); LogTable(tableDealer.Table, "Bottom Hand 1"); return(chipMovingPhases); }); //Play Scoop Bonus PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Scoop Bonus"; tableDealer.Table.PhaseMessage = ""; if (PlayScoopBonus(tableDealer.Table)) { LogTable(tableDealer.Table, "Scoop Bonus 1"); return(chipMovingPhases); } else { return(new DisplayStage[] { }); } }); //Deal 2nd Board PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Board Two"; tableDealer.Table.PhaseMessage = ""; tableDealer.CleanChips(); var board = GetBoard(); tableDealer.Deck.CompleteCards(board); tableDealer.Table.SetBoard(board); return(new DisplayStage[] { DisplayStage.DealtCards }); }); //Play Top Hand PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Top Hand"; tableDealer.Table.PhaseMessage = ""; PlayTopHand(tableDealer.Table); LogTable(tableDealer.Table, "Top Hand 2"); return(chipMovingPhases); }); //Play Middle Hand PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Middle Hand"; tableDealer.Table.PhaseMessage = ""; PlayMiddleHand(tableDealer.Table); LogTable(tableDealer.Table, "Middle Hand 2"); return(chipMovingPhases); }); //Play Bottom Hand PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Bottom Hand"; tableDealer.Table.PhaseMessage = ""; PlayBottomHand(tableDealer.Table); LogTable(tableDealer.Table, "Bottom Hand 2"); return(chipMovingPhases); }); //Play Scoop Bonus PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Scoop Bonus"; tableDealer.Table.PhaseMessage = ""; if (PlayScoopBonus(tableDealer.Table)) { LogTable(tableDealer.Table, "Scoop Bonus 2"); return(chipMovingPhases); } else { return(new DisplayStage[] {}); } }); }
public override void SetupPhases() { PhaseActions = new List <Func <TableDealer, DisplayStage[]> >(); var chipMovingPhases = new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.BetsOut, DisplayStage.Scooping, DisplayStage.PotScooped, DisplayStage.Delivering, DisplayStage.DeliverPot, DisplayStage.PotDelivered }; //Reset table for new hand PhaseActions.Add((tableDealer) => { var displayStages = StartNewHand(tableDealer); if (displayStages != null) { tableDealer.SetButton(); } return(displayStages); }); PhaseActions.Add(HandsDealt); //Blinds and set first bet action PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Preflop"; tableDealer.Table.PhaseMessage = ""; var seatsAroundTheTable = tableDealer.Table.SeatsWithHands().OrderBy(s => s.Position).ToArray(); var players = seatsAroundTheTable.Count(); var buttonSeat = Array.FindIndex <Seat>(seatsAroundTheTable, 0, seatsAroundTheTable.Count(), s => s.Button); var smallBlind = buttonSeat + 1; if (smallBlind == players) { smallBlind = 0; } seatsAroundTheTable[smallBlind].ChipsOut = 1; var bigBlind = smallBlind + 1; if (bigBlind == players) { bigBlind = 0; } seatsAroundTheTable[bigBlind].ChipsOut = 2; var betAction = bigBlind + 1; if (betAction == players) { betAction = 0; } seatsAroundTheTable[betAction].ActionOn = true; return(new DisplayStage[] { DisplayStage.BetsOut, DisplayStage.SeatAction }); }); //Scoop Pot PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Preflop"; tableDealer.Table.PhaseMessage = ""; return(new DisplayStage[] { DisplayStage.Scooping, DisplayStage.PotScooped }); }); //Flop PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Flop"; tableDealer.Table.PhaseMessage = ""; var board = GetBoard(); board.CardsMask = tableDealer.Deck.DealCards(3); tableDealer.Table.SetBoard(board); var seatsAroundTheTable = tableDealer.Table.SeatsWithHands().OrderBy(s => s.Position).ToArray(); var players = seatsAroundTheTable.Count(); var buttonSeat = Array.FindIndex <Seat>(seatsAroundTheTable, 0, seatsAroundTheTable.Count(), s => s.Button); var smallBlind = buttonSeat + 1; if (smallBlind == players) { smallBlind = 0; } seatsAroundTheTable[smallBlind].ActionOn = true; return(new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.SeatAction }); }); //Scoop Pot PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Flop"; tableDealer.Table.PhaseMessage = ""; return(new DisplayStage[] { DisplayStage.Scooping, DisplayStage.PotScooped }); }); //Turn PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Turn"; tableDealer.Table.PhaseMessage = ""; tableDealer.Table.Board.CardsMask |= tableDealer.Deck.DealCards(1); var seatsAroundTheTable = tableDealer.Table.SeatsWithHands().OrderBy(s => s.Position).ToArray(); var players = seatsAroundTheTable.Count(); var buttonSeat = Array.FindIndex <Seat>(seatsAroundTheTable, 0, seatsAroundTheTable.Count(), s => s.Button); var smallBlind = buttonSeat + 1; if (smallBlind == players) { smallBlind = 0; } seatsAroundTheTable[smallBlind].ActionOn = true; return(new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.SeatAction }); }); //Scoop Pot PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Turn"; tableDealer.Table.PhaseMessage = ""; return(new DisplayStage[] { DisplayStage.Scooping, DisplayStage.PotScooped }); }); //River PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "River"; tableDealer.Table.PhaseMessage = ""; tableDealer.Table.Board.CardsMask |= tableDealer.Deck.DealCards(1); var seatsAroundTheTable = tableDealer.Table.SeatsWithHands().OrderBy(s => s.Position).ToArray(); var players = seatsAroundTheTable.Count(); var buttonSeat = Array.FindIndex <Seat>(seatsAroundTheTable, 0, seatsAroundTheTable.Count(), s => s.Button); var smallBlind = buttonSeat + 1; if (smallBlind == players) { smallBlind = 0; } seatsAroundTheTable[smallBlind].ActionOn = true; return(new DisplayStage[] { DisplayStage.DealtCards, DisplayStage.SeatAction }); }); //Scoop Pot PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Showdown"; tableDealer.Table.PhaseMessage = ""; return(new DisplayStage[] { DisplayStage.Scooping, DisplayStage.PotScooped }); }); // Award Pot PhaseActions.Add((tableDealer) => { tableDealer.Table.PhaseTitle = "Showdown"; tableDealer.Table.PhaseMessage = ""; var table = tableDealer.Table; HandEvaluation best = new HandEvaluation(); // Find best hand foreach (var seat in table.SeatsWithHands()) { seat.Hand.LastEvaluation = TexasHoldem.EvaluateHand(seat.Hand.CardsMask | table.Board.CardsMask); if (seat.Hand.LastEvaluation.Value > best.Value) { best = seat.Hand.LastEvaluation; } } int pot = table.Pot; int winners = 0; int bestCard = 0; table.PhaseMessage = $"{TexasHoldem.HandTypeDescriptions[(int)best.Type]}"; // Determine winners and the best card from the winners foreach (var seat in table.SeatsWithHands()) { if (seat.Hand.LastEvaluation.Value == best.Value) { winners++; bestCard = Math.Max(bestCard, seat.Hand.BestCard()); table.HighlightCards |= TexasHoldem.FindCards(best); } } int cut = pot / winners; int remainder = pot % winners; // Determine chips in foreach (var seat in table.SeatsWithHands()) { if (seat.Hand.LastEvaluation.Value == best.Value) { seat.ChipsIn = cut + (seat.Hand.BestCard() == bestCard ? remainder : 0); } } return(new DisplayStage[] { DisplayStage.Delivering, DisplayStage.DeliverPot, DisplayStage.PotDelivered }); }); }