private void RefreshBoard(decimal[] equities, Street street) { foreach (ReplayerTableState replayerTableState in TableStateList.Where(st => st.CurrentStreet == street)) { try { _playerInState = PlayersCollection.FirstOrDefault(u => u.Name == replayerTableState.CurrentAction.PlayerName); if (_playerInState != null && ActivePlayerHasHoleCard.FirstOrDefault(x => x.PlayerName == replayerTableState.CurrentAction.PlayerName) != null && replayerTableState.CurrentAction != null && ActivePlayerHasHoleCard.Count > 1) { replayerTableState.ActivePlayer.EquityWin = equities[ActivePlayerHasHoleCard.IndexOf(ActivePlayerHasHoleCard.FirstOrDefault(x => x.PlayerName == replayerTableState.CurrentAction.PlayerName))]; } else { replayerTableState.ActivePlayer.EquityWin = -1; } ReplayerPlayerViewModel.CopyEquityWin(replayerTableState.ActivePlayer, _playerInState); } catch (Exception ex) { LogProvider.Log.Error(typeof(Converter), $"Player with name '{replayerTableState.CurrentAction.PlayerName}' has not been found in PlayerCollection in method RefreshBoard in ReplayerViewModel class", ex); } } }
private void UpdatePlayersEquityWin(ReplayerTableState state) { if (state == null) { return; } //preparing for formula Card on the Board in dependence of street in current state switch (state.CurrentAction.Street) { case Street.Preflop: CurrentBoard = new Card[] { }; CurrentBoardCards = string.Empty; break; case Street.Flop: CurrentBoard = CurrentGame.CommunityCards.Take(3).ToArray(); CurrentBoardCards = new string(CurrentGame.CommunityCardsString.Take(6).ToArray()); break; case Street.Turn: CurrentBoard = CurrentGame.CommunityCards.Take(4).ToArray(); CurrentBoardCards = new string(CurrentGame.CommunityCardsString.Take(8).ToArray()); break; case Street.River: CurrentBoard = CurrentGame.CommunityCards.ToArray(); CurrentBoardCards = CurrentGame.CommunityCardsString; break; case Street.Showdown: CurrentBoard = CurrentGame.CommunityCards.ToArray(); CurrentBoardCards = CurrentGame.CommunityCardsString; break; case Street.Summary: CurrentBoard = CurrentGame.CommunityCards.ToArray(); CurrentBoardCards = CurrentGame.CommunityCardsString; break; } // finding all players having hole cards ActivePlayerHasHoleCard = CurrentGame.Players.Where(pl => pl.hasHoleCards).ToList(); // searching for dead cards and removing this player from list of ActivePlayerHasHoleCard ActivePlayerHasHoleCardFolded = new List <Player>(); AllDeadCards.Clear(); foreach (ReplayerTableState replayerTableState in TableStateList) { Player playerInTableState = CurrentGame.Players.FirstOrDefault(x => x.PlayerName == replayerTableState.CurrentAction.PlayerName); if (playerInTableState != null && TableStateList.IndexOf(replayerTableState) <= TableStateList.IndexOf(state) && replayerTableState.CurrentAction.IsFold && playerInTableState.hasHoleCards) { ActivePlayerHasHoleCardFolded.Add(playerInTableState); ActivePlayerHasHoleCard.Remove(playerInTableState); AllDeadCards.Add(playerInTableState.HoleCards); AllDeadCardsString += playerInTableState.Cards; } } var equitySolver = ServiceLocator.Current.GetInstance <IEquitySolver>(); var gameType = new GeneralGameTypeEnum().ParseGameType(CurrentGame.GameDescription.GameType); var isShortDeck = CurrentGame.GameDescription.TableTypeDescriptors.Contains(HandHistories.Objects.GameDescription.TableTypeDescription.ShortDeck); var equitySolverParams = new EquitySolverParams { PlayersCards = ActivePlayerHasHoleCard.Select(x => x.HoleCards).ToArray(), BoardCards = CurrentBoard, Dead = isShortDeck ? AllDeadCards .Distinct(new LambdaComparer <HoleCards>((x, y) => x.ToString().Equals(y.ToString()))) .SelectMany(x => x) .Concat(CardGroup.GetDeadCardsForHoldem6Plus()) .ToArray() : AllDeadCards .Distinct(new LambdaComparer <HoleCards>((x, y) => x.ToString().Equals(y.ToString()))) .SelectMany(x => x) .ToArray(), GameType = gameType }; var equities = equitySolver.CalculateEquity(equitySolverParams) .Select(x => Math.Round((decimal)x.Equity * 100, 2)) .ToArray(); // updating states in replayer view if (equities != null) { RefreshBoard(equities, state.CurrentStreet); } //case of last state. Needed for All-in before River for some cases if (TableStateList.IndexOf(state) + 1 == TableStateList.Count && equities != null) { // updating states in replayer view RefreshBoard(equities, Street.Preflop); } }