private static void ShowDeckSelectionDialog(List <Deck> decks)
        {
            decks.Add(new Deck("Use no deck", "", new List <Card>(), new List <string>(), "", "", DateTime.Now, false, new List <Card>(),
                               SerializableVersion.Default, new List <Deck>(), Guid.Empty));
            if (decks.Count == 1 && DeckList.Instance.ActiveDeck != null)
            {
                decks.Add(new Deck("No match - Keep using active deck", "", new List <Card>(), new List <string>(), "", "", DateTime.Now, false,
                                   new List <Card>(), SerializableVersion.Default, new List <Deck>(), Guid.Empty));
            }
            _waitingForUserInput = true;
            Log.Info("Waiting for user input...");
            var dsDialog = new DeckSelectionDialog(decks);

            dsDialog.ShowDialog();

            var selectedDeck = dsDialog.SelectedDeck;

            if (selectedDeck != null)
            {
                if (selectedDeck.Name == "Use no deck")
                {
                    Log.Info("Auto deck detection disabled.");
                    Core.MainWindow.SelectDeck(null, true);
                    NotFoundCards.Clear();
                }
                else if (selectedDeck.Name == "No match - Keep using active deck")
                {
                    IgnoredDeckId = DeckList.Instance.ActiveDeck?.DeckId ?? Guid.Empty;
                    Log.Info($"Now ignoring {DeckList.Instance.ActiveDeck?.Name}");
                    NotFoundCards.Clear();
                }
                else
                {
                    Log.Info("Selected deck: " + selectedDeck.Name);
                    Core.MainWindow.SelectDeck(selectedDeck, true);
                }
            }
            else
            {
                Log.Info("Auto deck detection disabled.");
                MessageDialogs.ShowMessage(Core.MainWindow, "Auto deck selection disabled.", "This can be re-enabled under 'options (advanced) > tracker > general'.").Forget();
                Config.Instance.AutoDeckDetection = false;
                Config.Save();
                Core.MainWindow.AutoDeckDetection(false);
            }
            _waitingForUserInput = false;
        }
		public async void ShowIncorrectDeckMessage()
		{
			if(Core.Game.Player.DrawnCards.Count == 0)
			{
				IsShowingIncorrectDeckMessage = false;
				return;
			}

			//wait for player hero to be detected and at least 3 cards to be drawn
			for(var i = 0; i < 50; i++)
			{
				if(Core.Game.Player.Class != null && Core.Game.Player.DrawnCards.Count >= 3)
					break;
				await Task.Delay(100);
			}
			if(string.IsNullOrEmpty(Core.Game.Player.Class) || Core.Game.Player.DrawnCards.Count < 3)
			{
				IsShowingIncorrectDeckMessage = false;
				Logger.WriteLine("No player hero detected or less then 3 cards drawn. Not showing dialog.", "IncorrectDeckMessage");
				return;
			}
			await Task.Delay(1000);

			var decks =
				DeckList.Instance.Decks.Where(
				                              d =>
				                              d.Class == Core.Game.Player.Class && !d.Archived && d.IsArenaRunCompleted != true
				                              && Core.Game.Player.DrawnCardIdsTotal.Distinct().All(id => d.GetSelectedDeckVersion().Cards.Any(c => id == c.Id))
											  && Core.Game.Player.DrawnCards.All(c => d.GetSelectedDeckVersion().Cards.Any(c2 => c2.Id == c.Id && c2.Count >= c.Count)))
				        .ToList();

			Logger.WriteLine(decks.Count + " possible decks found.", "IncorrectDeckMessage");
            Core.Game.NoMatchingDeck = decks.Count == 0;
			
			if(decks.Count == 1 && Config.Instance.AutoSelectDetectedDeck)
			{
				var deck = decks.First();
				Logger.WriteLine("Automatically selected deck: " + deck.Name, "IncorrectDeckMessage");
				DeckPickerList.SelectDeck(deck);
				UpdateDeckList(deck);
				UseDeck(deck);
			}
			else
			{
				decks.Add(new Deck("Use no deck", "", new List<Card>(), new List<string>(), "", "", DateTime.Now, false, new List<Card>(),
				                   SerializableVersion.Default, new List<Deck>(), false, "", Guid.Empty, ""));
				if(decks.Count == 1 && DeckList.Instance.ActiveDeckVersion != null)
					decks.Add(new Deck("No match - Keep using active deck", "", new List<Card>(), new List<string>(), "", "", DateTime.Now, false, new List<Card>(),
								   SerializableVersion.Default, new List<Deck>(), false, "", Guid.Empty, ""));
				var dsDialog = new DeckSelectionDialog(decks);
				dsDialog.ShowDialog();

				var selectedDeck = dsDialog.SelectedDeck;

				if(selectedDeck != null)
				{
					if(selectedDeck.Name == "Use no deck")
						SelectDeck(null, true);
					else if(selectedDeck.Name == "No match - Keep using active deck")
					{
						Core.Game.IgnoreIncorrectDeck = DeckList.Instance.ActiveDeck;
						Logger.WriteLine(string.Format("Now ignoring {0} as an incorrect deck", DeckList.Instance.ActiveDeck.Name), "IncorrectDeckMessage");
					}
					else
					{
						Logger.WriteLine("Selected deck: " + selectedDeck.Name, "IncorrectDeckMessage");
						DeckPickerList.SelectDeck(selectedDeck);
						UpdateDeckList(selectedDeck);
						UseDeck(selectedDeck);
					}
				}
				else
				{
					this.ShowMessage("Deck detection disabled.", "Can be re-enabled in \"DECKS\" menu.");
					CheckboxDeckDetection.IsChecked = false;
					Config.Save();
				}
			}

			IsShowingIncorrectDeckMessage = false;
			NeedToIncorrectDeckMessage = false;
		}
Beispiel #3
0
        public async void ShowIncorrectDeckMessage()
        {
            if (Core.Game.Player.DrawnCards.Count == 0)
            {
                IsShowingIncorrectDeckMessage = false;
                return;
            }

            //wait for player hero to be detected and at least 3 cards to be drawn
            for (var i = 0; i < 50; i++)
            {
                if (Core.Game.Player.Class != null && Core.Game.Player.DrawnCards.Count >= 3)
                {
                    break;
                }
                await Task.Delay(100);
            }
            if (string.IsNullOrEmpty(Core.Game.Player.Class) || Core.Game.Player.DrawnCards.Count < 3)
            {
                IsShowingIncorrectDeckMessage = false;
                Log.Info("No player hero detected or less then 3 cards drawn. Not showing dialog.");
                return;
            }
            await Task.Delay(1000);

            if (!NeedToIncorrectDeckMessage)
            {
                IsShowingIncorrectDeckMessage = false;
                return;
            }

            var decks =
                DeckList.Instance.Decks.Where(
                    d =>
                    d.Class == Core.Game.Player.Class && !d.Archived && d.IsArenaRunCompleted != true &&
                    Core.Game.Player.DrawnCardIdsTotal.Distinct()
                    .All(id => d.GetSelectedDeckVersion().Cards.Any(c => id == c.Id)) &&
                    Core.Game.Player.DrawnCards.All(
                        c =>
                        d.GetSelectedDeckVersion()
                        .Cards.Any(c2 => c2.Id == c.Id && c2.Count >= c.Count))).ToList();

            Log.Info(decks.Count + " possible decks found.");
            Core.Game.NoMatchingDeck = decks.Count == 0;

            if (decks.Any(x => x == DeckList.Instance.ActiveDeck))
            {
                Log.Info("Correct deck already selected.");
                IsShowingIncorrectDeckMessage = false;
                NeedToIncorrectDeckMessage    = false;
                return;
            }

            if (decks.Count == 1 && Config.Instance.AutoSelectDetectedDeck)
            {
                var deck = decks.First();
                Log.Info("Automatically selected deck: " + deck.Name);
                DeckPickerList.SelectDeck(deck);
                UpdateDeckList(deck);
                UseDeck(deck);
            }
            else
            {
                decks.Add(new Deck("Use no deck", "", new List <Card>(), new List <string>(), "", "", DateTime.Now, false, new List <Card>(),
                                   SerializableVersion.Default, new List <Deck>(), false, "", Guid.Empty, ""));
                if (decks.Count == 1 && DeckList.Instance.ActiveDeckVersion != null)
                {
                    decks.Add(new Deck("No match - Keep using active deck", "", new List <Card>(), new List <string>(), "", "", DateTime.Now, false,
                                       new List <Card>(), SerializableVersion.Default, new List <Deck>(), false, "", Guid.Empty, ""));
                }
                var dsDialog = new DeckSelectionDialog(decks);
                dsDialog.ShowDialog();

                var selectedDeck = dsDialog.SelectedDeck;

                if (selectedDeck != null)
                {
                    if (selectedDeck.Name == "Use no deck")
                    {
                        SelectDeck(null, true);
                    }
                    else if (selectedDeck.Name == "No match - Keep using active deck")
                    {
                        Core.Game.IgnoreIncorrectDeck = DeckList.Instance.ActiveDeck;
                        Log.Info($"Now ignoring {DeckList.Instance.ActiveDeck.Name} as an incorrect deck");
                    }
                    else
                    {
                        Log.Info("Selected deck: " + selectedDeck.Name);
                        DeckPickerList.SelectDeck(selectedDeck);
                        UpdateDeckList(selectedDeck);
                        UseDeck(selectedDeck);
                    }
                }
                else
                {
                    this.ShowMessage("Auto deck selection disabled.", "This can be re-enabled by selecting \"AUTO\" in the bottom right of the deck picker.").Forget();
                    DeckPickerList.UpdateAutoSelectToggleButton();
                    Config.Save();
                }
            }

            IsShowingIncorrectDeckMessage = false;
            NeedToIncorrectDeckMessage    = false;
        }