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); } }
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); } }