Exemple #1
0
        internal async void BtnCloneSelectedVersion_Click(object sender, RoutedEventArgs e)
        {
            var deck = DeckPickerList.SelectedDecks.FirstOrDefault();

            if (deck == null)
            {
                return;
            }

            deck = deck.GetSelectedDeckVersion();

            var cloneStats =
                (await
                 this.ShowMessageAsync("Clone game history?", "(Cloned games do not count towards class or overall stats.)",
                                       MessageDialogStyle.AffirmativeAndNegative,
                                       new MessageDialogs.Settings
            {
                AffirmativeButtonText = "clone history",
                NegativeButtonText = "do not clone history"
            })) == MessageDialogResult.Affirmative;

            var clone = (Deck)deck.CloneWithNewId(false);

            clone.ResetVersions();
            clone.ResetHearthstatsIds();
            clone.Archived = false;

            var originalStatsEntry = clone.DeckStats;

            DeckList.Instance.Decks.Add(clone);
            DeckPickerList.UpdateDecks();
            DeckList.Save();

            var newStatsEntry = DeckStatsList.Instance.DeckStats.FirstOrDefault(ds => ds.BelongsToDeck(clone));

            if (newStatsEntry == null)
            {
                newStatsEntry = new DeckStats(clone);
                DeckStatsList.Instance.DeckStats.Add(newStatsEntry);
            }

            //clone game stats
            if (cloneStats)
            {
                foreach (var game in originalStatsEntry.Games)
                {
                    newStatsEntry.AddGameResult(game.CloneWithNewId());
                }
                Logger.WriteLine("cloned gamestats (version)", "Edit");
            }

            DeckStatsList.Save();
            //DeckPickerList.UpdateList();
            DeckPickerList.SelectDeckAndAppropriateView(clone);

            if (Config.Instance.HearthStatsAutoUploadNewDecks && HearthStatsAPI.IsLoggedIn)
            {
                HearthStatsManager.UploadDeckAsync(clone).Forget();
            }
        }
        public async Task UpdateStats(DeckStats stats, Deck deck)
        {
            var context = _context;

            if (stats.Decks_ID == deck.ID)
            {
                var oldStats = await context.StatsTable
                               .FirstOrDefaultAsync(x => x.Decks_ID == deck.ID);

                var newCorrect   = stats.Correct;
                var newInCorrect = stats.InCorrect;
                var newTotalPct  = stats.TotalPct;
                if (oldStats != null)
                {
                    oldStats.Correct   = newCorrect;
                    oldStats.InCorrect = newInCorrect;
                    oldStats.TotalPct  = newTotalPct;
                }
            }
            else
            {
                stats.Decks_ID = context.DecksTable
                                 .Where(x => x.User_ID == UserId && x.Name == deck.Name)
                                 .Select(x => x.ID).FirstOrDefault();

                await context.AddAsync(stats);
            }

            await context.SaveChangesAsync();
        }
        public async Task DeleteStats(DeckStats stats)
        {
            var context = _context;

            context.Attach(stats);
            context.Remove(stats);
            await context.SaveChangesAsync();
        }
Exemple #4
0
        private async void BtnCloneDeck_Click(object sender, RoutedEventArgs e)
        {
            var cloneStats =
                (await
                 this.ShowMessageAsync("Clone game history?", "(Cloned games do not count towards class or overall stats.)",
                                       MessageDialogStyle.AffirmativeAndNegative,
                                       new MetroDialogSettings
            {
                AffirmativeButtonText = "clone history",
                NegativeButtonText = "do not clone history"
            })) == MessageDialogResult.Affirmative;

            var clone = (Deck)DeckPickerList.SelectedDeck.Clone();
            var originalStatsEntry = clone.DeckStats;

            while (DeckList.DecksList.Any(d => d.Name == clone.Name))
            {
                var settings = new MetroDialogSettings {
                    AffirmativeButtonText = "Set", DefaultText = clone.Name
                };
                var name =
                    await
                    this.ShowInputAsync("Name already exists", "You already have a deck with that name, please select a different one.", settings);

                if (string.IsNullOrEmpty(name))
                {
                    return;
                }

                clone.Name = name;
            }

            DeckList.DecksList.Add(clone);
            DeckPickerList.AddAndSelectDeck(clone);
            WriteDecks();

            var newStatsEntry = DeckStatsList.Instance.DeckStats.FirstOrDefault(d => d.Name == clone.Name);

            if (newStatsEntry == null)
            {
                newStatsEntry = new DeckStats(clone.Name);
                DeckStatsList.Instance.DeckStats.Add(newStatsEntry);
            }

            //clone game stats
            if (cloneStats)
            {
                foreach (var game in originalStatsEntry.Games)
                {
                    newStatsEntry.AddGameResult(game.CloneWithNewId());
                }
                Logger.WriteLine("cloned gamestats");
            }

            DeckStatsList.Save();
            DeckPickerList.UpdateList();
        }
Exemple #5
0
        public void Reset()
        {
            TurnNumber   = 0;
            ActivePlayer = null;
            foreach (var p in Player.All)
            {
                foreach (var g in p.Groups)
                {
                    g.Reset();
                }
                foreach (var c in p.Counters)
                {
                    c.Reset();
                }
                foreach (var g in Definition.Player.GlobalVariables)
                {
                    p.GlobalVariables[g.Key] = g.Value.Value;
                }
            }
            foreach (var p in AllPhases)
            {
                p.Hold = false;
            }
            CurrentPhase = null;
            Table.Reset();
            Card.Reset();
            CardIdentity.Reset();
            Selection.Clear();

            if (Definition.GameBoards.ContainsKey(""))
            {
                GameBoard  = Definition.GameBoards[""];
                BoardImage = GameBoard.Source;
            }
            else
            {
                GameBoard  = null;
                BoardImage = null;
            }

            foreach (var g in Definition.GlobalVariables)
            {
                GlobalVariables[g.Key] = g.Value.Value;
            }

            DeckStats.Reset();

            //fix MAINWINDOW bug
            PlayWindow mainWin = WindowManager.PlayWindow;

            mainWin.RaiseEvent(new CardEventArgs(CardControl.CardHoveredEvent, mainWin));
            EventProxy.OnGameStart_3_1_0_0();
            EventProxy.OnGameStart_3_1_0_1();
            EventProxy.OnGameStarted_3_1_0_2();
        }
Exemple #6
0
        internal async void BtnCloneDeck_Click(object sender, RoutedEventArgs e)
        {
            var deck = DeckPickerList.SelectedDecks.FirstOrDefault();

            if (deck == null)
            {
                return;
            }
            var cloneStats =
                (await
                 this.ShowMessageAsync("Clone game history?", "(Cloned games do not count towards class or overall stats.)",
                                       MessageDialogStyle.AffirmativeAndNegative,
                                       new MessageDialogs.Settings
            {
                AffirmativeButtonText = "clone history",
                NegativeButtonText = "do not clone history"
            })) == MessageDialogResult.Affirmative;

            var clone = (Deck)deck.CloneWithNewId(false);

            clone.ResetHearthstatsIds();
            clone.Versions.ForEach(v => v.ResetHearthstatsIds());
            clone.Archived = false;

            var originalStats = deck.DeckStats;

            DeckList.Instance.Decks.Add(clone);
            DeckList.Save();

            DeckStats newStatsEntry;

            if (!DeckStatsList.Instance.DeckStats.TryGetValue(clone.DeckId, out newStatsEntry))
            {
                newStatsEntry = new DeckStats(clone);
                DeckStatsList.Instance.DeckStats.TryAdd(clone.DeckId, newStatsEntry);
            }

            if (cloneStats)
            {
                foreach (var game in originalStats.Games)
                {
                    newStatsEntry.AddGameResult(game.CloneWithNewId());
                }
                Log.Info("cloned gamestats");
            }

            DeckStatsList.Save();
            DeckPickerList.SelectDeckAndAppropriateView(clone);

            if (Config.Instance.HearthStatsAutoUploadNewDecks && HearthStatsAPI.IsLoggedIn)
            {
                HearthStatsManager.UploadDeckAsync(clone).Forget();
            }
        }
Exemple #7
0
        internal async void BtnCloneSelectedVersion_Click(object sender, RoutedEventArgs e)
        {
            var deck = DeckPickerList.SelectedDecks.FirstOrDefault();

            if (deck == null)
            {
                return;
            }

            deck = deck.GetSelectedDeckVersion();

            var cloneStats =
                (await
                 this.ShowMessageAsync("Clone game history?", "(Cloned games do not count towards class or overall stats.)",
                                       MessageDialogStyle.AffirmativeAndNegative,
                                       new MessageDialogs.Settings
            {
                AffirmativeButtonText = "clone history",
                NegativeButtonText = "do not clone history"
            })) == MessageDialogResult.Affirmative;

            var clone = (Deck)deck.CloneWithNewId(false);

            clone.ResetVersions();
            clone.Archived = false;

            var originalStatsEntry = clone.DeckStats;

            DeckList.Instance.Decks.Add(clone);
            DeckPickerList.UpdateDecks();
            DeckList.Save();

            DeckStats newStatsEntry;

            if (!DeckStatsList.Instance.DeckStats.TryGetValue(clone.DeckId, out newStatsEntry))
            {
                newStatsEntry = new DeckStats(clone);
                DeckStatsList.Instance.DeckStats.TryAdd(clone.DeckId, newStatsEntry);
            }

            //clone game stats
            if (cloneStats)
            {
                foreach (var game in originalStatsEntry.Games)
                {
                    newStatsEntry.AddGameResult(game.CloneWithNewId());
                }
                Log.Info("cloned gamestats (version)");
            }

            DeckStatsList.Save();
            //DeckPickerList.UpdateList();
            DeckPickerList.SelectDeckAndAppropriateView(clone);
        }
 protected Task UpdateState()
 {
     UserDecks    = DeckState.UserDecks;
     SelectedDeck = DeckState.SelectedDeck;
     if (SelectedDeck != null)
     {
         DeckStats = DeckState.DeckStats;
         DeckCards = SelectedDeck?.Cards ?? DeckState.Cards;
     }
     StateHasChanged();
     return(Task.CompletedTask);
 }
        public async Task ResetDeckStats(Deck deck)
        {
            DeckStats = new DeckStats
            {
                Deck      = deck,
                Correct   = 0,
                InCorrect = 0,
                TotalPct  = 0
            };
            await Database.UpdateStats(DeckStats, SelectedDeck);

            await NotifyStateChanged();
        }
Exemple #10
0
        private async void BtnCloneDeck_Click(object sender, RoutedEventArgs e)
        {
            var clone = (Deck)Helper.MainWindow.DeckPickerList.SelectedDeck.Clone();
            var originalStatsEntry = clone.DeckStats;

            while (Helper.MainWindow.DeckList.DecksList.Any(d => d.Name == clone.Name))
            {
                var settings = new MetroDialogSettings();
                settings.AffirmativeButtonText = "Set";
                settings.DefaultText           = clone.Name;
                var name =
                    await
                    Helper.MainWindow.ShowInputAsync("Name already exists",
                                                     "You already have a deck with that name, please select a different one.", settings);

                if (String.IsNullOrEmpty(name))
                {
                    return;
                }

                clone.Name = name;
            }

            Helper.MainWindow.DeckList.DecksList.Add(clone);
            Helper.MainWindow.DeckPickerList.AddAndSelectDeck(clone);
            Helper.MainWindow.WriteDecks();

            //clone game stats
            var newStatsEntry = DeckStatsList.Instance.DeckStats.FirstOrDefault(d => d.Name == clone.Name);

            if (newStatsEntry == null)
            {
                newStatsEntry = new DeckStats(clone.Name);
                DeckStatsList.Instance.DeckStats.Add(newStatsEntry);
            }
            foreach (var game in originalStatsEntry.Games)
            {
                newStatsEntry.AddGameResult(game.CloneWithNewId());
            }
            Logger.WriteLine("cloned gamestats");

            DeckStatsList.Save();
            Helper.MainWindow.DeckPickerList.UpdateList();

            After_Click();
        }
        public async Task AddStats(DeckStats stats, Deck deck)
        {
            if (stats.ID > 0)
            {
                return;
            }
            var context = _context;

            // Match name and user_id to find stored DecksTable primary key
            stats.Decks_ID = context.DecksTable
                             .Where(x => x.User_ID == UserId && x.Name == deck.Name)
                             .Select(x => x.ID).FirstOrDefault();

            await context.AddAsync(stats);

            await context.SaveChangesAsync();
        }
        internal async void ShowCloneDeckDialog(Deck deck)
        {
            if (deck == null)
            {
                return;
            }
            var cloneStats =
                (await
                 this.ShowMessageAsync("Clone game history?", "(Cloned games do not count towards class or overall stats.)",
                                       MessageDialogStyle.AffirmativeAndNegative,
                                       new MessageDialogs.Settings
            {
                AffirmativeButtonText = "clone history",
                NegativeButtonText = "do not clone history"
            })) == MessageDialogResult.Affirmative;

            var clone = (Deck)deck.CloneWithNewId(false);

            clone.Archived = false;

            var originalStats = deck.DeckStats;

            DeckList.Instance.Decks.Add(clone);
            DeckList.Save();

            DeckStats newStatsEntry;

            if (!DeckStatsList.Instance.DeckStats.TryGetValue(clone.DeckId, out newStatsEntry))
            {
                newStatsEntry = new DeckStats(clone);
                DeckStatsList.Instance.DeckStats.TryAdd(clone.DeckId, newStatsEntry);
            }

            if (cloneStats)
            {
                foreach (var game in originalStats.Games)
                {
                    newStatsEntry.AddGameResult(game.CloneWithNewId());
                }
                Log.Info("cloned gamestats");
            }

            DeckStatsList.Save();
            DeckPickerList.SelectDeckAndAppropriateView(clone);
        }
        private async void SaveDeck(bool overwrite)
        {
            var deckName = TextBoxDeckName.Text;

            if (string.IsNullOrEmpty(deckName))
            {
                var settings = new MetroDialogSettings {
                    AffirmativeButtonText = "Set", DefaultText = deckName
                };

                var name = await this.ShowInputAsync("No name set", "Please set a name for the deck", settings);

                if (String.IsNullOrEmpty(name))
                {
                    return;
                }

                deckName             = name;
                TextBoxDeckName.Text = name;
            }

            while (DeckList.DecksList.Any(d => d.Name == deckName) && (!EditingDeck || !overwrite))
            {
                var settings = new MetroDialogSettings {
                    AffirmativeButtonText = "Set", DefaultText = deckName
                };
                var name =
                    await
                    this.ShowInputAsync("Name already exists", "You already have a deck with that name, please select a different one.", settings);

                if (String.IsNullOrEmpty(name))
                {
                    return;
                }

                deckName             = name;
                TextBoxDeckName.Text = name;
            }

            if (_newDeck.Cards.Sum(c => c.Count) != 30)
            {
                var settings = new MetroDialogSettings {
                    AffirmativeButtonText = "Yes", NegativeButtonText = "No"
                };

                var result =
                    await
                    this.ShowMessageAsync("Not 30 cards",
                                          string.Format("Deck contains {0} cards. Is this what you want to save anyway?",
                                                        _newDeck.Cards.Sum(c => c.Count)),
                                          MessageDialogStyle.AffirmativeAndNegative, settings);

                if (result != MessageDialogResult.Affirmative)
                {
                    return;
                }
            }

            if (EditingDeck && overwrite)
            {
                DeckList.DecksList.Remove(_newDeck);
                DeckPickerList.RemoveDeck(_newDeck);
            }

            var oldDeckName = _newDeck.Name;

            _newDeck.Name = deckName;
            _newDeck.Tags = TagControlEdit.GetTags();

            var newDeckClone = (Deck)_newDeck.Clone();

            DeckList.DecksList.Add(newDeckClone);

            newDeckClone.LastEdited = DateTime.Now;

            WriteDecks();
            Logger.WriteLine("Saved Decks");

            if (EditingDeck)
            {
                TagControlEdit.SetSelectedTags(new List <string>());
                if (deckName != oldDeckName)
                {
                    var statsEntry = DeckStatsList.Instance.DeckStats.FirstOrDefault(d => d.Name == oldDeckName);
                    if (statsEntry != null)
                    {
                        if (overwrite)
                        {
                            statsEntry.Name = deckName;
                            Logger.WriteLine("Deck has new name, updated deckstats");
                        }
                        else
                        {
                            var newStatsEntry = DeckStatsList.Instance.DeckStats.FirstOrDefault(d => d.Name == deckName);
                            if (newStatsEntry == null)
                            {
                                newStatsEntry = new DeckStats(deckName);
                                DeckStatsList.Instance.DeckStats.Add(newStatsEntry);
                            }
                            foreach (var game in statsEntry.Games)
                            {
                                newStatsEntry.AddGameResult(game.CloneWithNewId());
                            }
                            Logger.WriteLine("cloned gamestats for \"Set as new\"");
                        }
                        DeckStatsList.Save();
                    }
                }
            }

            //after cloning the stats, otherwise new stats will be generated
            DeckPickerList.AddAndSelectDeck(newDeckClone);

            EditingDeck = false;

            foreach (var tag in _newDeck.Tags)
            {
                SortFilterDecksFlyout.AddSelectedTag(tag);
            }

            DeckPickerList.UpdateList();
            DeckPickerList.SelectDeck(newDeckClone);

            CloseNewDeck();
            ClearNewDeckSection();
        }
Exemple #14
0
        private async void SaveDeck(bool overwrite, SerializableVersion newVersion)
        {
            var deckName = TextBoxDeckName.Text;

            if (string.IsNullOrEmpty(deckName))
            {
                var settings = new MetroDialogSettings {
                    AffirmativeButtonText = "Set", DefaultText = deckName
                };

                var name = await this.ShowInputAsync("No name set", "Please set a name for the deck", settings);

                if (String.IsNullOrEmpty(name))
                {
                    return;
                }

                deckName             = name;
                TextBoxDeckName.Text = name;
            }

            /*while(DeckList.DecksList.Any(d => d.Name == deckName) && (!EditingDeck || !overwrite))
             * {
             *      var settings = new MetroDialogSettings {AffirmativeButtonText = "Set", DefaultText = deckName};
             *      var name =
             *              await
             *              this.ShowInputAsync("Name already exists", "You already have a deck with that name, please select a different one.", settings);
             *
             *      if(String.IsNullOrEmpty(name))
             *              return;
             *
             *      deckName = name;
             *      TextBoxDeckName.Text = name;
             * }*/

            if (_newDeck.Cards.Sum(c => c.Count) != 30)
            {
                var settings = new MetroDialogSettings {
                    AffirmativeButtonText = "Yes", NegativeButtonText = "No"
                };

                var result =
                    await
                    this.ShowMessageAsync("Not 30 cards",
                                          string.Format("Deck contains {0} cards. Is this what you want to save anyway?",
                                                        _newDeck.Cards.Sum(c => c.Count)), MessageDialogStyle.AffirmativeAndNegative, settings);

                if (result != MessageDialogResult.Affirmative)
                {
                    return;
                }
            }

            var previousVersion = _newDeck.Version;

            if (overwrite && (_newDeck.Version != newVersion))
            {
                AddDeckHistory();
                _newDeck.Version                  = newVersion;
                _newDeck.SelectedVersion          = newVersion;
                _newDeck.HearthStatsDeckVersionId = "";
                //UpdateDeckHistoryPanel(_newDeck, false);
            }

            if (EditingDeck && overwrite)
            {
                DeckList.Instance.Decks.Remove(_newDeck);
                //DeckPickerList.RemoveDeck(_newDeck);
            }

            var oldDeckName = _newDeck.Name;

            _newDeck.Name = deckName;

            var newDeckClone = (Deck)_newDeck.Clone();

            newDeckClone.Archived = false;

            DeckList.Instance.Decks.Add(newDeckClone);

            newDeckClone.LastEdited = DateTime.Now;

            DeckList.Save();

            Logger.WriteLine("Saved Decks", "SaveDeck");

            if (EditingDeck)
            {
                TagControlEdit.SetSelectedTags(new List <string>());
                if (deckName != oldDeckName)
                {
                    var statsEntry = DeckStatsList.Instance.DeckStats.FirstOrDefault(ds => ds.BelongsToDeck(_newDeck));
                    if (statsEntry != null)
                    {
                        if (overwrite)
                        {
                            statsEntry.Name = deckName;
                            Logger.WriteLine("Deck has new name, updated deckstats", "SaveDeck");
                        }
                        else
                        {
                            var newStatsEntry = DeckStatsList.Instance.DeckStats.FirstOrDefault(ds => ds.BelongsToDeck(_newDeck));
                            if (newStatsEntry == null)
                            {
                                newStatsEntry = new DeckStats(_newDeck);
                                DeckStatsList.Instance.DeckStats.Add(newStatsEntry);
                            }
                            foreach (var game in statsEntry.Games)
                            {
                                newStatsEntry.AddGameResult(game.CloneWithNewId());
                            }
                            Logger.WriteLine("cloned gamestats for \"Set as new\"", "SaveDeck");
                        }
                        DeckStatsList.Save();
                    }
                }
            }


            if (Config.Instance.HearthStatsAutoUploadNewDecks && HearthStatsAPI.IsLoggedIn)
            {
                Logger.WriteLine("auto uploading new/edited deck", "SaveDeck");
                if (EditingDeck)
                {
                    if (previousVersion != newVersion)
                    {
                        HearthStatsManager.UploadVersionAsync(newDeckClone, _originalDeck.HearthStatsIdForUploading, background: true);
                    }
                    else
                    {
                        HearthStatsManager.UpdateDeckAsync(newDeckClone, background: true);
                    }
                }
                else
                {
                    HearthStatsManager.UploadDeckAsync(newDeckClone, background: true);
                }
            }

            //after cloning the stats, otherwise new stats will be generated
            //DeckPickerList.AddAndSelectDeck(newDeckClone);

            EditingDeck = false;

            foreach (var tag in _newDeck.Tags)
            {
                SortFilterDecksFlyout.AddSelectedTag(tag);
            }

            DeckPickerList.SelectDeckAndAppropriateView(newDeckClone);
            CloseNewDeck();
            ClearNewDeckSection();
        }
Exemple #15
0
        internal async void BtnCloneSelectedVersion_Click(object sender, RoutedEventArgs e)
        {
            var deck = DeckPickerList.SelectedDecks.FirstOrDefault();

            if (deck == null)
            {
                return;
            }
            var cloneStats =
                (await
                 this.ShowMessageAsync("Clone game history?", "(Cloned games do not count towards class or overall stats.)",
                                       MessageDialogStyle.AffirmativeAndNegative,
                                       new MetroDialogSettings
            {
                AffirmativeButtonText = "clone history",
                NegativeButtonText = "do not clone history"
            })) == MessageDialogResult.Affirmative;
            var clone = (Deck)deck.CloneWithNewId(false);

            // bug #1316 - ResetVersions needs the current version as an argument
            clone.ResetVersions();
            clone.ResetHearthstatsIds();
            clone.Archived = false;

            var originalStatsEntry = clone.DeckStats;

            /*while(DeckList.DecksList.Any(d => d.Name == clone.Name))
             * {
             *      var settings = new MetroDialogSettings {AffirmativeButtonText = "Set", DefaultText = clone.Name};
             *      var name =
             *              await
             *              this.ShowInputAsync("Name already exists", "You already have a deck with that name, please select a different one.", settings);
             *
             *      if(string.IsNullOrEmpty(name))
             *              return;
             *
             *      clone.Name = name;
             * }*/

            DeckList.Instance.Decks.Add(clone);
            DeckPickerList.UpdateDecks();
            DeckList.Save();


            var newStatsEntry = DeckStatsList.Instance.DeckStats.FirstOrDefault(ds => ds.BelongsToDeck(clone));

            if (newStatsEntry == null)
            {
                newStatsEntry = new DeckStats(clone);
                DeckStatsList.Instance.DeckStats.Add(newStatsEntry);
            }

            //clone game stats
            if (cloneStats)
            {
                foreach (var game in originalStatsEntry.Games)
                {
                    newStatsEntry.AddGameResult(game.CloneWithNewId());
                }
                Logger.WriteLine("cloned gamestats (version)", "Edit");
            }

            DeckStatsList.Save();
            //DeckPickerList.UpdateList();
            DeckPickerList.SelectDeckAndAppropriateView(clone);

            if (Config.Instance.HearthStatsAutoUploadNewDecks && HearthStatsAPI.IsLoggedIn)
            {
                HearthStatsManager.UploadDeckAsync(clone);
            }
        }
Exemple #16
0
        //Temporarily store group visibility information for LoadDeck. //bug (google) #20

        public void LoadDeck(IDeck deck, bool limited)
        {
            var def    = Program.GameEngine.Definition;
            int nCards = deck.CardCount();
            var ids    = new int[nCards];
            var keys   = new Guid[nCards];
            var cards  = new Card[nCards];
            var groups = new Play.Group[nCards];
            var sizes  = new string[nCards];
            var gtmps  = new List <GrpTmp>(); //for temp groups visibility
            int j      = 0;

            foreach (var section in deck.Sections)
            {
                { // Add cards to LoadedCards deck
                    if (!LoadedCards.Sections.Any(x => x.Name == section.Name))
                    {
                        // Add section
                        ((ObservableCollection <ObservableSection>)LoadedCards.Sections).Add(new ObservableSection()
                        {
                            Name   = section.Name,
                            Shared = section.Shared,
                            Cards  = new ObservableCollection <ObservableMultiCard>()
                        });
                    }

                    var loadedCardsSection = LoadedCards.Sections.Single(x => x.Name == section.Name);

                    foreach (var card in section.Cards)
                    {
                        var existingCard = loadedCardsSection.Cards.FirstOrDefault(x => x.Id == card.Id);
                        if (existingCard != null)
                        {
                            existingCard.Quantity += card.Quantity;
                        }
                        else
                        {
                            var newCard = new ObservableMultiCard(card);
                            loadedCardsSection.Cards.AddCard(newCard);
                        }
                    }
                }

                DeckSection sectionDef = null;
                sectionDef = section.Shared ? def.SharedDeckSections[section.Name] : def.DeckSections[section.Name];
                if (sectionDef == null)
                {
                    throw new InvalidFileFormatException("Invalid section '" + section.Name + "' in deck file.");
                }
                var        player = section.Shared ? Player.GlobalPlayer : Player.LocalPlayer;
                Play.Group group  = player.Groups.First(x => x.Name == sectionDef.Group.Name); //TODO: match directly to SectionDef Group instead of name matching

                //In order to make the clients know what the card is (if visibility is set so that they can see it),
                //we have to set the visibility to Nobody, and then after the cards are sent, set the visibility back
                //to what it was. //bug (google) #20
                var gt = new GrpTmp(group, group.Visibility, group.Viewers.ToList());
                if (!gtmps.Contains(gt))
                {
                    gtmps.Add(gt);
                    group.SetVisibility(false, false);
                }

                foreach (IMultiCard element in section.Cards)
                {
                    //DataNew.Entities.Card mod = Definition.GetCardById(element.Id);
                    for (int i = 0; i < element.Quantity; i++)
                    {
                        //for every card in the deck, generate a unique key for it, ID for it
                        var id   = element.GenerateCardId();
                        var card = new Card(player, id, new DataNew.Entities.Card(element), true, element.Size.Name);
                        //   var card = element.ToPlayCard(player);
                        ids[j]  = card.Id;
                        keys[j] = card.Type.Model.Id;
                        //keys[j] = card.GetEncryptedKey();
                        groups[j]  = group;
                        sizes[j]   = card.Size.Name;
                        cards[j++] = card;
                        group.AddAt(card, group.Count);

                        DeckStats.AddCard(card);
                    }

                    // Load images in the background
                    string pictureUri = element.GetPicture();
                    Dispatcher.CurrentDispatcher.BeginInvoke(
                        new Func <string, BitmapImage>(ImageUtils.CreateFrozenBitmap),
                        DispatcherPriority.Background, pictureUri);
                }
            }

            string sleeveString = null;

            if (deck.Sleeve != null)
            {
                try {
                    var loadSleeve = true;

                    if (!IsLocal)
                    {
                        var isSubscriber = SubscriptionModule.Get().IsSubscribed;

                        if (isSubscriber == null)
                        {
                            loadSleeve = false;

                            Log.Warn("Can't set deck sleeve, unable to determin if user is a subscriber.");

                            Program.GameMess.Warning($"Deck sleeve can not be loaded, subscriber status is unknown.");
                        }
                        else if (isSubscriber == false)
                        {
                            loadSleeve = false;

                            Log.Warn("Not authorized to use deck sleeve.");

                            Program.GameMess.Warning($"Deck sleeve can not be used, you're not a subscriber.");
                        }
                    }

                    if (loadSleeve)
                    {
                        Player.LocalPlayer.SetSleeve(deck.Sleeve);

                        sleeveString = Sleeve.ToString(deck.Sleeve);
                    }
                    else
                    {
                        Log.Info("Sleeve will not be loaded.");
                    }
                } catch (Exception ex) {
                    Log.Warn(ex.Message, ex);

                    Program.GameMess.Warning($"There was an error loading the decks sleeve.");
                }
            }

            Program.Client.Rpc.LoadDeck(ids, keys, groups, sizes, sleeveString ?? string.Empty, limited);
            //reset the visibility to what it was before pushing the deck to everybody. //bug (google) #20
            foreach (GrpTmp g in gtmps)
            {
                switch (g.Visibility)
                {
                case GroupVisibility.Everybody:
                    g.Group.SetVisibility(true, false);
                    break;

                case GroupVisibility.Nobody:
                    g.Group.SetVisibility(false, false);
                    break;

                default:
                    foreach (Player p in g.Viewers)
                    {
                        g.Group.AddViewer(p, false);
                    }
                    break;
                }
            }
            gtmps.Clear();
            gtmps.TrimExcess();
        }
Exemple #17
0
        public void Reset(bool isSoft)
        {
            TurnNumber   = 0;
            ActivePlayer = null;
            foreach (var p in Player.All)
            {
                foreach (var g in p.Groups)
                {
                    g.Reset();
                }
                foreach (var c in p.Counters)
                {
                    c.Reset();
                }
                foreach (var g in Definition.Player.GlobalVariables)
                {
                    p.GlobalVariables[g.Key] = g.Value.Value;
                }
            }
            foreach (var p in AllPhases)
            {
                p.Hold = false;
            }
            CurrentPhase = null;
            Table.Reset();
            Card.Reset();
            CardIdentity.Reset();
            Selection.Clear();
            ResetTableView();

            foreach (var g in Definition.GlobalVariables)
            {
                GlobalVariables[g.Key] = g.Value.Value;
            }

            DeckStats.Reset();

            //fix MAINWINDOW bug
            PlayWindow mainWin = WindowManager.PlayWindow;

            mainWin.RaiseEvent(new CardEventArgs(CardControl.CardHoveredEvent, mainWin));

            EventProxy.OnGameStart_3_1_0_0();
            EventProxy.OnGameStart_3_1_0_1();
            EventProxy.OnGameStarted_3_1_0_2();

            if (isSoft)
            {
                var currentDeck = new Deck()
                {
                    GameId   = LoadedCards.GameId,
                    IsShared = LoadedCards.IsShared,
                    Notes    = LoadedCards.Notes,
                    Sections = LoadedCards.Sections.ToList(),
                    Sleeve   = LoadedCards.Sleeve
                };
                LoadedCards.Sections = new ObservableCollection <ObservableSection>();
                LoadDeck(currentDeck, false);
            }
            else
            {
                LoadedCards.Sections = new ObservableCollection <ObservableSection>();
            }
        }
Exemple #18
0
        public async void SaveDeck(bool overwrite, SerializableVersion newVersion, bool workInProgressDeck = false)
        {
            var deckName = TextBoxDeckName.Text;

            if (string.IsNullOrEmpty(deckName))
            {
                var settings = new MessageDialogs.Settings {
                    AffirmativeButtonText = "Set", DefaultText = deckName
                };

                var name = await this.ShowInputAsync("No name set", "Please set a name for the deck", settings);

                if (string.IsNullOrEmpty(name))
                {
                    return;
                }

                deckName             = name;
                TextBoxDeckName.Text = name;
            }

            if (_newDeck.Cards.Sum(c => c.Count) != 30 && workInProgressDeck == false)
            {
                var settings = new MessageDialogs.Settings {
                    AffirmativeButtonText = "Yes", NegativeButtonText = "No"
                };

                var result =
                    await
                    this.ShowMessageAsync("Not 30 cards",
                                          $"Deck contains {_newDeck.Cards.Sum(c => c.Count)} cards. Is this what you want to save anyway?", MessageDialogStyle.AffirmativeAndNegative, settings);

                if (result != MessageDialogResult.Affirmative)
                {
                    return;
                }
            }

            var previousVersion = _newDeck.Version;

            if (overwrite && (_newDeck.Version != newVersion))
            {
                AddDeckHistory();
                _newDeck.Version                  = newVersion;
                _newDeck.SelectedVersion          = newVersion;
                _newDeck.HearthStatsDeckVersionId = "";
            }

            if (EditingDeck && overwrite)
            {
                DeckList.Instance.Decks.Remove(_newDeck);
            }

            var oldDeckName = _newDeck.Name;

            _newDeck.Name = deckName;

            var newDeckClone = (Deck)_newDeck.Clone();

            newDeckClone.Archived = false;

            DeckList.Instance.Decks.Add(newDeckClone);

            newDeckClone.LastEdited = DateTime.Now;

            DeckList.Save();

            Log.Info("Saved Decks");

            if (EditingDeck)
            {
                TagControlEdit.SetSelectedTags(new List <string>());
                if (deckName != oldDeckName)
                {
                    var statsEntry = DeckStatsList.Instance.DeckStats.FirstOrDefault(ds => ds.BelongsToDeck(_newDeck));
                    if (statsEntry != null)
                    {
                        if (overwrite)
                        {
                            statsEntry.Name = deckName;
                            Log.Info("Deck has new name, updated deckstats");
                            foreach (var game in statsEntry.Games)
                            {
                                game.DeckName = deckName;
                            }
                        }
                        else
                        {
                            var newStatsEntry = DeckStatsList.Instance.DeckStats.FirstOrDefault(ds => ds.BelongsToDeck(_newDeck));
                            if (newStatsEntry == null)
                            {
                                newStatsEntry = new DeckStats(_newDeck);
                                DeckStatsList.Instance.DeckStats.Add(newStatsEntry);
                            }
                            foreach (var game in statsEntry.Games)
                            {
                                newStatsEntry.AddGameResult(game.CloneWithNewId());
                            }
                            Log.Info("cloned gamestats for \"Set as new\"");
                        }
                        DeckStatsList.Save();
                    }
                }
            }


            if (Config.Instance.HearthStatsAutoUploadNewDecks && HearthStatsAPI.IsLoggedIn)
            {
                Log.Info("auto uploading new/edited deck");
                if (EditingDeck)
                {
                    if (previousVersion != newVersion)
                    {
                        HearthStatsManager.UploadVersionAsync(newDeckClone, _originalDeck.HearthStatsIdForUploading, background: true).Forget();
                    }
                    else
                    {
                        HearthStatsManager.UpdateDeckAsync(newDeckClone, background: true).Forget();
                    }
                }
                else
                {
                    HearthStatsManager.UploadDeckAsync(newDeckClone, background: true).Forget();
                }
            }

            if (EditingDeck)
            {
                DeckManagerEvents.OnDeckUpdated.Execute(newDeckClone);
            }
            else
            {
                DeckManagerEvents.OnDeckCreated.Execute(newDeckClone);
            }


            EditingDeck = false;

            foreach (var tag in _newDeck.Tags)
            {
                SortFilterDecksFlyout.AddSelectedTag(tag);
            }

            DeckPickerList.SelectDeckAndAppropriateView(newDeckClone);
            DeckPickerList.UpdateDecks(forceUpdate: new[] { newDeckClone });
            SelectDeck(newDeckClone, true);
            CloseNewDeck();
            ClearNewDeckSection();
        }
Exemple #19
0
        public override void RefreshData()
        {
            if (refreshing)
            {
                return;
            }
            refreshing = true;
            LoadData();
            DeckStats.Clear();
            var newstats = new BindableCollection <IDictionary <Deck, IList <StatModel> > >();

            Task.Run(
                () =>
            {
                using (Busy.GetTicket())
                {
                    foreach (Deck deck in Decks)
                    {
                        if (!String.IsNullOrEmpty(GameMode))
                        {
                            var gameMode = (GameMode)Enum.Parse(typeof(GameMode), GameMode);
                            if (gameMode == Data.GameMode.Arena)
                            {
                                var emptystats = new Dictionary <Deck, IList <StatModel> >();
                                newstats.Add(emptystats);
                                var emptylst = new List <StatModel>();
                                emptystats.Add(deck, emptylst);
                                emptylst.AddRange(Heroes.Select(h => new StatModel()
                                {
                                    Hero = h
                                }));
                                continue;
                            }
                        }

                        var r =
                            gameRepository.Query(
                                x =>
                        {
                            var q     = x.Where(g => g.Deck.Id == deck.Id);
                            q         = q.Where(GetFilterExpression());
                            var group = q
                                        .Where(g => q.Any())
                                        .GroupBy(g => g.OpponentHero.Key)
                                        .Select(
                                g =>
                                new
                            {
                                HeroKey      = g.Key,
                                GlobalTotal  = q.Count(),
                                Total        = g.Count(),
                                TotalCoin    = g.Count(c => !c.GoFirst),
                                TotalNoCoin  = g.Count(c => c.GoFirst),
                                Wins         = g.Count(c => c.Victory),
                                Losses       = g.Count(c => !c.Victory),
                                WinsCoin     = g.Count(c => c.Victory && !c.GoFirst),
                                WinsNoCoin   = g.Count(c => c.Victory && c.GoFirst),
                                LossesCoin   = g.Count(c => !c.Victory && !c.GoFirst),
                                LossesNoCoin = g.Count(c => !c.Victory && c.GoFirst)
                            });
                            return(group.ToList());
                        });
                        if (r.Sum(x => x.GlobalTotal) == 0)
                        {
                            continue;
                        }
                        var stats = new Dictionary <Deck, IList <StatModel> >();
                        newstats.Add(stats);
                        var lst = new List <StatModel>();
                        stats.Add(deck, lst);
                        for (int i = 0; i < Heroes.Count; i++)
                        {
                            var oppHero    = Heroes[i];
                            dynamic result = null;
                            if (oppHero.Key != null)
                            {
                                result = r.FirstOrDefault(x => x.HeroKey == oppHero.Key);
                            }
                            else
                            {
                                result = new
                                {
                                    HeroKey      = String.Empty,
                                    GlobalTotal  = r.Sum(x => x.Total),
                                    Total        = r.Sum(x => x.Total),
                                    TotalCoin    = r.Sum(x => x.TotalCoin),
                                    TotalNoCoin  = r.Sum(x => x.TotalNoCoin),
                                    Wins         = r.Sum(x => x.Wins),
                                    Losses       = r.Sum(x => x.Losses),
                                    WinsCoin     = r.Sum(x => x.WinsCoin),
                                    WinsNoCoin   = r.Sum(x => x.WinsNoCoin),
                                    LossesCoin   = r.Sum(x => x.LossesCoin),
                                    LossesNoCoin = r.Sum(x => x.LossesNoCoin)
                                };
                            }
                            if (result == null)
                            {
                                lst.Add(new StatModel()
                                {
                                    Hero = oppHero
                                });
                            }
                            else
                            {
                                lst.Add(
                                    new StatModel()
                                {
                                    Hero         = oppHero,
                                    TotalGames   = result.Total,
                                    GlobalTotal  = result.GlobalTotal,
                                    Wins         = result.Wins,
                                    Losses       = result.Losses,
                                    WinsCoin     = result.WinsCoin,
                                    WinsNoCoin   = result.WinsNoCoin,
                                    LossesCoin   = result.LossesCoin,
                                    LossesNoCoin = result.LossesNoCoin,
                                    WinRate      = result.Total > 0 ? Math.Round((decimal)result.Wins / result.Total * 100, 0) : 0,
                                    LossRate     = result.Total > 0 ? Math.Round((decimal)result.Losses / result.Total * 100, 0) : 0,
                                    WinRateCoin  =
                                        result.TotalCoin > 0 ? Math.Round((decimal)result.WinsCoin / result.TotalCoin * 100, 0) : 0,
                                    WinRateNoCoin =
                                        result.TotalNoCoin > 0 ? Math.Round((decimal)result.WinsNoCoin / result.TotalNoCoin * 100, 0) : 0,
                                    LossRateCoin =
                                        result.TotalCoin > 0 ? Math.Round((decimal)result.LossesCoin / result.TotalCoin * 100, 0) : 0,
                                    LossRateNoCoin =
                                        result.TotalNoCoin > 0 ? Math.Round((decimal)result.LossesNoCoin / result.TotalNoCoin * 100, 0) : 0
                                });
                            }
                        }
                    }
                    refreshing = false;
                }
            }).ContinueWith(
                t =>
            {
                using (Busy.GetTicket())
                {
                    DeckStats.IsNotifying = false;
                    DeckStats.Clear();
                    DeckStats.AddRange(newstats);
                    DeckStats.IsNotifying = true;
                    DeckStats.Refresh();
                }
            });;
        }
        /// <summary>
        /// Saves deck for a user
        /// </summary>
        public async Task SaveUserDeck(SaveDeckRequest request)
        {
            LambdaLogger.Log($"Entering: SaveUserDeck({ JsonConvert.SerializeObject(request) })");

            try
            {
                DeckStats deckStats = new DeckStats
                {
                    CommanderName   = request.CommanderName,
                    DeckName        = request.DeckName,
                    Name            = MTGServiceConstants.DeckStatsCardName,
                    UserName        = request.UserName,
                    DeckMetricsJson = JsonConvert.SerializeObject(request.DeckMetrics)
                };

                var existingDeckStats = SvcContext.Repository
                                        .DeckStats
                                        .FindFromUserAndDeckName(request.UserName, request.DeckName);

                if (existingDeckStats != null)
                {
                    LambdaLogger.Log($"About to delete old deck stats: { request.DeckName }");

                    await SvcContext.Repository
                    .DeckStats
                    .Delete(existingDeckStats);
                }

                var existingDeckCards = SvcContext.Repository
                                        .DeckCards
                                        .FindFromUserAndDeckName(request.UserName, request.DeckName);

                if (existingDeckCards.Any())
                {
                    LambdaLogger.Log($"About to delete old deck cards: { request.DeckName }");

                    await SvcContext.Repository
                    .DeckCards
                    .Delete(existingDeckCards);
                }

                LambdaLogger.Log($"About to save deck stats: { JsonConvert.SerializeObject(deckStats) }");

                await SvcContext.Repository
                .DeckStats
                .SaveAsync(new List <DeckStats> {
                    deckStats
                });

                LambdaLogger.Log($"About to save deck cards for user: { request.UserName } & commander: { request.CommanderName }");

                var config = new MapperConfiguration(x =>
                {
                    x.CreateMap <Card, DeckCard>();
                });

                var mapper = config.CreateMapper();

                var cards = SvcContext.Repository
                            .Cards
                            .FindFromNames(request.DeckCards.Select(x => x.Name).ToList())
                            .ToList();

                var deckCards = new List <DeckCard>();

                foreach (var card in cards)
                {
                    if (card != null)
                    {
                        LambdaLogger.Log($"Found card for saved deck card: { JsonConvert.SerializeObject(card) }");

                        var newDeckCard = mapper.Map <Card, DeckCard>(card);

                        newDeckCard.DeckName = request.DeckName;
                        newDeckCard.UserName = request.UserName;

                        deckCards.Add(newDeckCard);
                    }
                }

                LambdaLogger.Log($"About to save cards: { JsonConvert.SerializeObject(deckCards) }");

                await SvcContext.Repository
                .DeckCards
                .SaveAsync(deckCards);
            }
            catch (Exception exp)
            {
                LambdaLogger.Log($"Error: { exp }");
                throw;
            }

            LambdaLogger.Log($"Leaving: SaveUserDeck({ JsonConvert.SerializeObject(request) })");
        }