private void CreatePlayersLayout(RadDiagram diagram, HudDragCanvas dgCanvas, ReplayerViewModel viewModel)
        {
            var seats = (int)CurrentCapacity;

            var positionProvider = ServiceLocator.Current.GetInstance <IPositionProvider>(ReplayerPokerSite.ToString());

            var labelPositions = positionProvider.Positions[seats];
            var hasHoleCards   = viewModel.CurrentGame.Players.Any(x => x.hasHoleCards);
            var cardsCount     = hasHoleCards ? viewModel.CurrentGame.Players.Where(x => x.hasHoleCards).Max(x => x.HoleCards.Count) : 2;

            for (var i = 0; i < seats; i++)
            {
                var player = viewModel.PlayersCollection[i];
                var label  = CreatePlayerLabel(player);

                label.X = labelPositions[i, 0];
                label.Y = labelPositions[i, 1];

                PlaceCardLabels(diagram, label, cardsCount);

                player.ChipsContainer.ChipsShape.X = predefinedChipsPositions[seats][i, 0];
                player.ChipsContainer.ChipsShape.Y = predefinedChipsPositions[seats][i, 1];

                AddPotPlayerLabel(diagram, viewModel.PlayersCollection[i], predefinedChipsPositions[seats][i, 0], predefinedChipsPositions[seats][i, 1]);

                diagram.AddShape(label);
                diagram.AddShape(player.ChipsContainer.ChipsShape);
            }
        }
        private ReplayerHudPanel CreateHudPanel(ReplayerViewModel viewModel, int zeroBasedSeatNumber)
        {
            var player = viewModel.PlayersCollection[zeroBasedSeatNumber];

            player.Parent = new HudElementViewModel {
                Seat = zeroBasedSeatNumber
            };

            var panel = new ReplayerHudPanel
            {
                DataContext = player
            };

            panel.Height = double.NaN;
            panel.Width  = double.NaN;

            var playerNotes = dataService.GetPlayerNotes(player.Name, viewModel.CurrentHand.PokersiteId);

            player.NoteToolTip = NoteBuilder.BuildNote(playerNotes);
            player.Parent.IsXRayNoteVisible = playerNotes.Any(x => x.IsAutoNote);

            var contextMenu = CreateContextMenu(viewModel.CurrentHand.PokersiteId, player.Name, player);

            contextMenu.EventName = "MouseRightButtonUp";

            RadContextMenu.SetContextMenu(panel, contextMenu);

            return(panel);
        }
        private void LoadPlayerHudStats(ReplayerPlayerViewModel replayerPlayer, ReplayerViewModel replayerViewModel, IList <StatInfo> statInfoCollection)
        {
            replayerPlayer.StatInfoCollection.Clear();

            HudLightIndicators hudIndicators;

            if (storageModel.PlayerSelectedItem.Name == replayerPlayer.Name &&
                (short?)storageModel.PlayerSelectedItem.PokerSite == replayerViewModel.CurrentHand.PokersiteId)
            {
                hudIndicators = new HudLightIndicators(storageModel.GetStatisticCollection());
            }
            else
            {
                hudIndicators = new HudLightIndicators();

                playerStatisticRepository
                .GetPlayerStatistic(replayerPlayer.Name, replayerViewModel.CurrentHand.PokersiteId)
                .ForEach(stat => hudIndicators.AddStatistic(stat));
            }

            if (hudIndicators != null)
            {
                var statList = new List <StatInfo>();

                var counter = 0;

                foreach (var selectedStatInfo in statInfoCollection)
                {
                    if (selectedStatInfo is StatInfoBreak)
                    {
                        continue;
                    }

                    var statInfo = selectedStatInfo.Clone();

                    var propertyName = StatsProvider.GetStatProperyName(statInfo.Stat);

                    if (!string.IsNullOrWhiteSpace(propertyName))
                    {
                        statInfo.AssignStatInfoValues(hudIndicators, propertyName);
                    }

                    replayerPlayer.StatInfoCollection.Add(statInfo);

                    if ((counter + 1) % 4 == 0)
                    {
                        replayerPlayer.StatInfoCollection.Add(new StatInfoBreak());
                    }

                    counter++;
                }
            }
        }
        private void SaveHUDPositions(HudDragCanvas dgCanvas, ReplayerViewModel viewModel)
        {
            var layout = hudLayoutsService.GetLayout(viewModel.LayoutName);

            if (layout == null)
            {
                LogProvider.Log.Warn($"Failed to save HUD positions. Could not find layout '{viewModel.LayoutName}'");
                return;
            }

            try
            {
                var hudLayoutContract = new HudLayoutContract
                {
                    LayoutName   = viewModel.LayoutName,
                    GameType     = EnumGameType.CashHoldem,
                    PokerSite    = ReplayerPokerSite,
                    TableType    = layout.TableType,
                    HudPositions = new List <HudPositionContract>()
                };

                // clone is needed
                var toolViewModels = dgCanvas.Children.OfType <FrameworkElement>()
                                     .Where(x => x != null && (x.DataContext is IHudNonPopupToolViewModel))
                                     .Select(x => x.DataContext as HudBaseToolViewModel)
                                     .Concat(EmptySeats
                                             .SelectMany(x => x.Tools)
                                             .OfType <IHudNonPopupToolViewModel>()
                                             .Cast <HudBaseToolViewModel>());

                foreach (var toolViewModel in toolViewModels)
                {
                    var seatNumber = toolViewModel.Parent != null ? toolViewModel.Parent.Seat : 1;

                    var xPos = toolViewModel.OffsetX ?? toolViewModel.Position.X;
                    var yPos = toolViewModel.OffsetY ?? toolViewModel.Position.Y;

                    hudLayoutContract.HudPositions.Add(new HudPositionContract
                    {
                        Id         = toolViewModel.Id,
                        Position   = new Point(xPos, yPos),
                        SeatNumber = seatNumber
                    });
                }

                hudLayoutsService.Save(hudLayoutContract);
            }
            catch (Exception e)
            {
                LogProvider.Log.Error(this, "Failed to save HUD positions in replayer.", e);
            }
        }
        private void LoadIndicators(int seats, ReplayerViewModel viewModel, IEnumerable <Stat> heatMapStats)
        {
            var tasksToLoad = new List <Task>();

            var selectedPlayer = storageModel.PlayerSelectedItem;

            var players = viewModel.PlayersCollection.Select(x => x.Name).ToArray();

            for (var i = 0; i < seats; i++)
            {
                var player = players[i];

                if (playerIndicators.ContainsKey(player))
                {
                    continue;
                }

                var playerData = new HudIndicators(heatMapStats);

                // read data from statistic
                var taskToReadPlayerStats = Task.Run(() =>
                {
                    if (selectedPlayer != null &&
                        player == selectedPlayer.Name &&
                        (short?)selectedPlayer.PokerSite == viewModel.CurrentHand.PokersiteId)
                    {
                        storageModel
                        .GetStatisticCollection()
                        .Where(stat => (stat.PokersiteId == (short)viewModel.CurrentGame.GameDescription.Site) &&
                               stat.IsTourney == viewModel.CurrentGame.GameDescription.IsTournament &&
                               GameTypeUtils.CompareGameType((GameType)stat.PokergametypeId, viewModel.CurrentGame.GameDescription.GameType))
                        .ForEach(stat => playerData.AddStatistic(stat));

                        playerIndicators.AddOrUpdate(player, playerData, (key, old) => playerData);
                        return;
                    }

                    playerStatisticRepository
                    .GetPlayerStatistic(player, (short)viewModel.CurrentGame.GameDescription.Site)
                    .Where(stat => (stat.PokersiteId == (short)viewModel.CurrentGame.GameDescription.Site) &&
                           stat.IsTourney == viewModel.CurrentGame.GameDescription.IsTournament &&
                           GameTypeUtils.CompareGameType((GameType)stat.PokergametypeId, viewModel.CurrentGame.GameDescription.GameType))
                    .ForEach(stat => playerData.AddStatistic(stat));

                    playerIndicators.AddOrUpdate(player, playerData, (key, old) => playerData);
                });

                tasksToLoad.Add(taskToReadPlayerStats);
            }

            Task.WhenAll(tasksToLoad).Wait();
        }
        private EnumReplayerTableType GetTableSize(ReplayerViewModel viewModel)
        {
            SeatType seatType = SeatType.FromMaxPlayers(viewModel.CurrentGame.GameDescription.SeatType.MaxPlayers, true);

            if (seatType.MaxPlayers <= 6)
            {
                return(EnumReplayerTableType.Six);
            }

            if (seatType.MaxPlayers <= 9)
            {
                return(EnumReplayerTableType.Nine);
            }

            return(EnumReplayerTableType.Ten);
        }
        private void CreateCurrentPotValueLabel(RadDiagram diagram, ReplayerViewModel viewModel)
        {
            System.Windows.Controls.Label lbl = new System.Windows.Controls.Label();
            Binding myBinding = new Binding(nameof(ReplayerViewModel.CurrentPotValue))
            {
                Source = viewModel, Mode = BindingMode.TwoWay, Converter = new DecimalToPotConverter(), ConverterParameter = "Pot {0:C2}"
            };

            lbl.SetBinding(ContentControl.ContentProperty, myBinding);
            lbl.Background      = Brushes.LightGray;
            lbl.Foreground      = Brushes.Black;
            lbl.BorderBrush     = Brushes.Black;
            lbl.BorderThickness = new Thickness(1);
            lbl.Padding         = new Thickness(3, 3, 3, 3);
            lbl.Margin          = new Thickness(480, 315, 100, 100);
            diagram.AddShape(lbl);
        }
        private void CreateTotalPotValueLabel(RadDiagram diagram, ReplayerViewModel viewModel)
        {
            System.Windows.Controls.Label lbl = new System.Windows.Controls.Label();
            Binding myBinding = new Binding(nameof(ReplayerViewModel.TotalPotValue))
            {
                Source = viewModel, Mode = BindingMode.TwoWay, Converter = new DecimalToPotConverter(), ConverterParameter = "{0:C2}"
            };

            lbl.SetBinding(ContentControl.ContentProperty, myBinding);
            lbl.Foreground = Brushes.White;
            lbl.Margin     = new Thickness(480, 100, 100, 100);
            diagram.AddShape(lbl);

            viewModel.TotalPotChipsContainer.ChipsShape.X = TotalPotChipsPosition.X;
            viewModel.TotalPotChipsContainer.ChipsShape.Y = TotalPotChipsPosition.Y;

            diagram.AddShape(viewModel.TotalPotChipsContainer.ChipsShape);
        }
        private void PlaceTableCardPanels(RadDiagram diagram, ReplayerViewModel viewModel)
        {
            double y = table.Y + table.Height / 2 - CARD_HEIGHT / 2.0 - 20;
            double x = table.X + table.Width / 2 - CARD_WIDTH / 2.0 - 2 * CARD_WIDTH - 10;

            for (int i = 0; i < viewModel.CommunityCards.Count; i++)
            {
                var card = CreateCardLabel(diagram, viewModel.CommunityCards[i]);

                Street  cardStreet = i < 3 ? Street.Flop : i < 4 ? Street.Turn : Street.River;
                Binding myBinding  = new Binding(ReflectionHelper.GetPath <ViewModels.Replayer.ReplayerViewModel>(o => o.CurrentStreet))
                {
                    Source = viewModel, Mode = BindingMode.TwoWay, Converter = new StreetToVisibilityConverter(), ConverterParameter = cardStreet
                };
                card.SetBinding(UIElement.VisibilityProperty, myBinding);

                card.X = x;
                card.Y = y;

                diagram.AddShape(card);

                x = card.X + CARD_WIDTH + 5;
            }
        }
Exemplo n.º 10
0
        public void ConfigureTable(RadDiagram diagram, HudDragCanvas dgCanvas, ReplayerViewModel viewModel)
        {
            try
            {
                if (viewModel == null || viewModel.CurrentGame == null)
                {
                    LogProvider.Log.Info("Cannot find handHistory");
                    return;
                }

                CurrentCapacity = GetTableSize(viewModel);

                CreateTable(diagram);
                CreatePlayersLayout(diagram, dgCanvas, viewModel);
                CreateCurrentPotValueLabel(diagram, viewModel);
                CreateTotalPotValueLabel(diagram, viewModel);
                PlaceTableCardPanels(diagram, viewModel);
                InitializeHUD(dgCanvas, viewModel);
            }
            catch (Exception e)
            {
                LogProvider.Log.Error(this, "ReplayerTable: Cannot configure table", e);
            }
        }
Exemplo n.º 11
0
        private void LoadHUD(HudDragCanvas dgCanvas, ReplayerViewModel viewModel, HudLayoutInfoV2 activeLayout)
        {
            var seats = (int)CurrentCapacity;

            var hudPanelService = ServiceLocator.Current.GetInstance <IHudPanelService>(ReplayerPokerSite.ToString());

            var nonToolLayoutStats = activeLayout
                                     .HudPlayerTypes
                                     .SelectMany(x => x.Stats)
                                     .Select(x => x.Stat)
                                     .Concat(activeLayout
                                             .HudBumperStickerTypes
                                             .SelectMany(x => x.Stats)
                                             .Select(x => x.Stat))
                                     .Concat(new[] { Stat.TotalHands })
                                     .Distinct()
                                     .ToArray();

            var hudElements = new List <HudElementViewModel>();

            var hudElementCreator = ServiceLocator.Current.GetInstance <IHudElementViewModelCreator>();

            var hudElementCreationInfo = new HudElementViewModelCreationInfo
            {
                GameType      = EnumGameType.CashHoldem,
                HudLayoutInfo = activeLayout,
                PokerSite     = ReplayerPokerSite
            };

            for (var i = 0; i < seats; i++)
            {
                var replayerPlayer = viewModel.PlayersCollection[i];

                hudElementCreationInfo.SeatNumber = i + 1;

                if ((int)activeLayout.TableType < hudElementCreationInfo.SeatNumber)
                {
                    continue;
                }

                var hudElement = hudElementCreator.Create(hudElementCreationInfo);

                if (string.IsNullOrEmpty(replayerPlayer.Name))
                {
                    if (hudElement != null)
                    {
                        EmptySeats.Add(hudElement);
                    }
                    continue;
                }

                var player = dataService.GetPlayer(replayerPlayer.Name, viewModel.CurrentHand.PokersiteId);

                if (player == null)
                {
                    if (hudElement != null)
                    {
                        EmptySeats.Add(hudElement);
                    }
                    continue;
                }

                if (hudElement == null ||
                    !playerIndicators.TryGetValue(replayerPlayer.Name, out HudIndicators playerData))
                {
                    continue;
                }

                hudElement.PlayerId   = player.PlayerId;
                hudElement.PlayerName = replayerPlayer.Name;
                hudElement.TotalHands = playerData.TotalHands;

                var playerNotes = dataService.GetPlayerNotes(player.PlayerId);
                hudElement.NoteToolTip       = NoteBuilder.BuildNote(playerNotes);
                hudElement.IsXRayNoteVisible = playerNotes.Any(x => x.IsAutoNote);

                var graphTools = hudElement.Tools.OfType <HudGraphViewModel>().ToArray();

                foreach (var graphTool in graphTools)
                {
                    graphTool.StatSessionCollection = new ReactiveList <decimal>();
                }

                var heatMapTools = hudElement.Tools.OfType <HudHeatMapViewModel>()
                                   .Concat(hudElement.Tools.OfType <HudGaugeIndicatorViewModel>()
                                           .SelectMany(x => x.GroupedStats)
                                           .SelectMany(x => x.Stats)
                                           .Where(x => x.HeatMapViewModel != null)
                                           .Select(x => x.HeatMapViewModel))
                                   .ToArray();

                heatMapTools.ForEach(x =>
                {
                    var heatMapKey = playerData.HeatMaps.Keys
                                     .ToArray()
                                     .FirstOrDefault(p => p.Stat == x.BaseStat.Stat);

                    if (heatMapKey != null)
                    {
                        x.HeatMap = playerData.HeatMaps[heatMapKey];
                    }
                });

                var gaugeIndicatorTools = hudElement.Tools.OfType <HudGaugeIndicatorViewModel>().ToArray();

                hudElement.SessionMoneyWonCollection = new ObservableCollection <decimal>();

                var activeLayoutHudStats = hudElement.ToolsStatInfoCollection
                                           .Concat(heatMapTools.Select(x => x.BaseStat))
                                           .Concat(gaugeIndicatorTools.Select(x => x.BaseStat))
                                           .ToList();

                var extraStats = (from nonToolLayoutStat in nonToolLayoutStats
                                  join activateLayoutHudStat in activeLayoutHudStats on nonToolLayoutStat equals activateLayoutHudStat.Stat into grouped
                                  from extraStat in grouped.DefaultIfEmpty()
                                  where extraStat == null
                                  select new StatInfo
                {
                    Stat = nonToolLayoutStat
                }).ToArray();

                activeLayoutHudStats.AddRange(extraStats);

                StatsProvider.UpdateStats(activeLayoutHudStats);

                foreach (var statInfo in activeLayoutHudStats)
                {
                    var propertyName = StatsProvider.GetStatProperyName(statInfo.Stat);

                    if (!string.IsNullOrEmpty(propertyName))
                    {
                        if (playerData.TotalHands < statInfo.MinSample)
                        {
                            statInfo.IsNotVisible = true;
                        }

                        statInfo.AssignStatInfoValues(playerData, propertyName);
                    }
                    else if (!(statInfo is StatInfoBreak) && statInfo.Stat != Stat.PlayerInfoIcon)
                    {
                        continue;
                    }
                }

                hudElement.StatInfoCollection = activeLayoutHudStats;

                var isNoteIconSet = false;

                foreach (var toolViewModel in hudElement.Tools.Where(x => x is IHudNonPopupToolViewModel).ToArray())
                {
                    if (!isNoteIconSet && toolViewModel is HudPlainStatBoxViewModel && !(toolViewModel is HudFourStatsBoxViewModel))
                    {
                        (toolViewModel as HudPlainStatBoxViewModel).IsNoteIconEnabled = true;
                        isNoteIconSet = true;
                    }

                    var panel = hudPanelService.Create(toolViewModel);

                    if (panel != null)
                    {
                        dgCanvas.Children.Add(panel);

                        Canvas.SetLeft(panel, toolViewModel.Position.X);
                        Canvas.SetTop(panel, toolViewModel.Position.Y);
                    }
                }

                hudElements.Add(hudElement);
            }

            hudLayoutsService.SetPlayerTypeIcon(hudElements, activeLayout);
        }
Exemplo n.º 12
0
        private async void InitializeHUD(HudDragCanvas dgCanvas, ReplayerViewModel viewModel)
        {
            var gameNumber = viewModel.CurrentHand.GameNumber;
            var pokerSite  = viewModel.CurrentHand.PokersiteId;

            ClearHUD(dgCanvas);

            viewModel.IsLoadingHUD = true;

            var seats = (int)CurrentCapacity;

            var tableType = (EnumTableType)viewModel.CurrentGame.GameDescription.SeatType.MaxPlayers;

            // need to add DriveHUDReplayer to sites, add provider, panel service etc.
            var activeLayout = hudLayoutsService.GetActiveLayout(ReplayerPokerSite,
                                                                 tableType,
                                                                 EnumGameType.CashHoldem);

            viewModel.LayoutName        = activeLayout.Name;
            viewModel.LayoutsCollection = new ObservableCollection <string>(hudLayoutsService.GetAvailableLayouts(tableType));
            viewModel.LoadLayoutCommand = new RelayCommand(obj =>
            {
                try
                {
                    var layoutName = obj?.ToString();

                    if (string.IsNullOrWhiteSpace(layoutName))
                    {
                        return;
                    }

                    viewModel.LayoutName = layoutName;

                    var layout = hudLayoutsService.GetLayout(layoutName);

                    var layoutHeatMapStats = new HashSet <Stat>(layout.GetHeatMapStats());

                    // there are no loaded heat map stats
                    if (layoutHeatMapStats.Count > 0 &&
                        layoutHeatMapStats.Any(x => !heatMapStats.Contains(x)))
                    {
                        viewModel.IsLoadingHUD = true;
                        playerIndicators.Clear();
                        LoadIndicators(seats, viewModel, layoutHeatMapStats);
                        heatMapStats           = layoutHeatMapStats;
                        viewModel.IsLoadingHUD = false;
                    }

                    ClearHUD(dgCanvas);
                    LoadHUD(dgCanvas, viewModel, layout);

                    hudLayoutsService.SetActiveLayout(layout, ReplayerPokerSite, EnumGameType.CashHoldem, tableType);
                }
                catch (Exception e)
                {
                    LogProvider.Log.Error(this, "Failed to load layout", e);
                }
            });

            viewModel.SaveHUDPositionsCommand = new RelayCommand(obj => SaveHUDPositions(dgCanvas, viewModel));
            viewModel.RotateHUDToLeftCommand  = new RelayCommand(() => RotateHUD(false, tableType, dgCanvas));
            viewModel.RotateHUDToRightCommand = new RelayCommand(() => RotateHUD(true, tableType, dgCanvas));

            heatMapStats = new HashSet <Stat>(activeLayout.GetHeatMapStats());

            await Task.Run(() => LoadIndicators(seats, viewModel, heatMapStats));

            if (gameNumber != viewModel.CurrentHand.GameNumber ||
                pokerSite != viewModel.CurrentHand.PokersiteId)
            {
                return;
            }

            LoadHUD(dgCanvas, viewModel, activeLayout);

            viewModel.IsLoadingHUD = false;
        }