Esempio n. 1
0
        private void CreateSealedDecks()
        {
            AggregateException exception = null;

            Task.Factory.StartNew(() =>
            {
                const int minNumberOfGeneratedDecks = 5;
                var limitedCode       = MagicSet.GetLimitedCode(_p.TournamentPack, _p.BoosterPacks);
                var pregeneratedCount = NonHumanPlayers.Count() - minNumberOfGeneratedDecks;

                var pregenerated = PregeneratedDecks
                                   .GetRandom(limitedCode, pregeneratedCount);

                var nonHumanPlayers = NonHumanPlayers.ToList();
                var decksToGenerate = NonHumanPlayers.Count() - pregenerated.Count;

                for (var i = 0; i < pregenerated.Count; i++)
                {
                    nonHumanPlayers[i].Deck = pregenerated[i];
                }


                for (var count = 0; count < decksToGenerate; count++)
                {
                    var player       = nonHumanPlayers[count + pregenerated.Count];
                    var library      = GenerateLibrary();
                    var deck         = DeckBuilder.BuildDeck(library, _cardRatings);
                    deck.LimitedCode = limitedCode;
                    player.Deck      = deck;

                    // save generated deck so it can be reused in future tournaments
                    PregeneratedDecks.Write(deck);

                    Ui.Publisher.Publish(new DeckGenerationStatus
                    {
                        PercentCompleted = (int)Math.Round((100 * (count + 1.0)) / decksToGenerate)
                    });

                    if (_shouldStop)
                    {
                        break;
                    }
                }
            })
            .ContinueWith(t =>
            {
                exception = t.Exception;
                Ui.Publisher.Publish(new DeckGenerationError());
            }, TaskContinuationOptions.OnlyOnFaulted);

            _humanLibrary = GenerateLibrary();
            CreateHumanDeck();

            if (exception != null)
            {
                throw new AggregateException(exception.InnerExceptions);
            }
        }
Esempio n. 2
0
        private void CreateDraftDecks()
        {
            var draftScreen = Ui.Dialogs.DraftScreen.Create(_players);

            Ui.Shell.ChangeScreen(draftScreen);

            var runner  = new DraftRunner(draftScreen);
            var results = runner.Run(_players.Count, _p.BoosterPacks, _cardRatings);

            if (draftScreen.PlayerLeftDraft)
            {
                Stop();
                return;
            }

            var nonHumanPlayers   = NonHumanPlayers.ToList();
            var nonHumanLibraries = results.Libraries.Skip(1).ToList();

            _humanLibrary = results.Libraries[0];

            AggregateException exception = null;

            Task.Factory.StartNew(() =>
            {
                for (var count = 0; count < nonHumanPlayers.Count; count++)
                {
                    var player  = nonHumanPlayers[count];
                    var library = nonHumanLibraries[count];
                    var deck    = DeckBuilder.BuildDeck(library, _cardRatings);
                    player.Deck = deck;

                    Ui.Publisher.Publish(new DeckGenerationStatus
                    {
                        PercentCompleted = (int)Math.Round((100 * (count + 1.0)) / nonHumanPlayers.Count)
                    });

                    if (_shouldStop)
                    {
                        break;
                    }
                }
            })
            .ContinueWith(t =>
            {
                exception = t.Exception;
                Ui.Publisher.Publish(new DeckGenerationError());
            }, TaskContinuationOptions.OnlyOnFaulted);


            CreateHumanDeck();

            if (exception != null)
            {
                throw new AggregateException(exception.InnerExceptions);
            }
        }