public bool IsGameOver(BoardSituation currentSituation, TableInfo tInfo, ref TableLog log)
        {
            if (players.Count(p => !p.Folded) < 2 || Hand.Cards(currentSituation.Cards).Count() == 5)
            {
                int pot         = currentSituation.GetPot();
                var lastPlayers = players.Where(p => !p.Folded).ToList();
                if (lastPlayers.Count == 1)
                {
                    lastPlayers[0].Stack += pot;
                    log.Add(GameState.ENDINFO, lastPlayers[0].Agent.GetName() + " won " + pot + " chips.");
                }
                else
                {
                    var bets = new List <Bets>();
                    for (int i = 0; i < lastPlayers.Count; i++)
                    {
                        var b = new Bets();
                        b.HandValue = Hand.Evaluate(currentSituation.Cards | lastPlayers[i].Hand);
                        b.Bet       = currentSituation.GetPlayerPot(lastPlayers[i].Agent.GetName());
                        b.Name      = lastPlayers[i].Agent.GetName();
                        bets.Add(b);
                    }
                    var foldedPlayers = players.Where(p => p.Folded).ToList();
                    var foldedBets    = new List <int>();
                    for (int i = 0; i < foldedPlayers.Count; i++)
                    {
                        foldedBets.Add(currentSituation.GetPlayerPot(foldedPlayers[i].Agent.GetName()));
                    }

                    while (pot > 0)
                    {
                        var max       = bets.Max(b => b.HandValue);
                        var maxValues = bets.Where(b => b.HandValue == max).OrderBy(b => b.Bet).ToList();
                        int win       = maxValues[0].Bet;
                        int foldedPot = 0;
                        for (int i = 0; i < foldedBets.Count; i++)
                        {
                            if (foldedBets[i] < win)
                            {
                                foldedPot    += foldedBets[i];
                                foldedBets[i] = 0;
                            }
                            else
                            {
                                foldedPot     += win;
                                foldedBets[i] -= win;
                            }
                        }
                        int sidePot = 0;
                        for (int i = 0; i < bets.Count; i++)
                        {
                            if (bets[i].Name != maxValues[0].Name)
                            {
                                if (bets[i].Bet < win)
                                {
                                    sidePot    += bets[i].Bet;
                                    bets[i].Bet = 0;
                                }
                                else
                                {
                                    sidePot     += win;
                                    bets[i].Bet -= win;
                                }
                            }
                        }
                        win += foldedPot + sidePot;
                        for (int i = 0; i < maxValues.Count; i++)
                        {
                            var p = lastPlayers.First(mp => mp.Agent.GetName() == maxValues[i].Name);
                            p.Stack += win / maxValues.Count;
                            log.Add(GameState.ENDINFO, p.Agent.GetName() + " won " + (win / maxValues.Count) + " chips with " + Hand.DescriptionFromHandValueInternal(maxValues[i].HandValue) + ".");
                        }
                        pot -= win;
                        if (win % maxValues.Count != 0)
                        {
                            int            mod           = win % maxValues.Count;
                            int            button        = tInfo.Button;
                            EmulatorPlayer p             = null;
                            var            winnigPlayers = maxValues.Select(v => v.Name).ToList();
                            while (!winnigPlayers.Contains((p = players[GetNextIndexInGame(button)]).Agent.GetName()))
                            {
                                button = GetNextIndexInGame(button);
                            }
                            p.Stack += mod;
                        }
                        bets.Remove(maxValues[0]);
                    }
                }
                for (int i = 0; i < allPlayers.Count; i++)
                {
                    if (allPlayers[i].Stack == 0)
                    {
                        allPlayers[i].InGame = false;
                    }
                    else
                    {
                        allPlayers[i].Folded = false;
                    }
                }
                if (allPlayers.Sum(p => p.Stack) != 1500)
                {
                }
                return(true);
            }
            return(false);
        }