private async void Generate_Clicked(object sender, EventArgs e) { Analytics.TrackEvent("Character Generator"); Character character = null; var config = new Character.Configuration() { Ruleset = GenerationConfiguration.Ruleset, Campaign = GenerationConfiguration.Campaign, Culture = selectedCulture.Id, Sex = GenerationConfiguration.Sex, Style = generationStyle, CharacterSpecies = species }; character = Character.CreateCharacter(config); if (character is Cepheus.Character) { var cc = character as Cepheus.Character; cc.SkillOffered += SkillOffered; } character.Generate(); // Let the user see theie stats so they can make a more informed choice about // which career to select await DisplayAlert("Profile", string.Format("Your UPP is {0}", character.Profile.Display), Properties.Resources.Button_OK); var keepgoing = false; do { var clist = selectedCulture.Careers(character); // You can't do the same career twice execpt for outcast and drifter - unless forced via the draft var careerList = clist.Keys.Except(character.Careers .Where(c => !(c.Name.Equals("Outcast") || c.Name.Equals("Drifter"))) .Select(c => c.Name)); var selected = string.Empty; if (careerList.Count() == 1) { selected = careerList.ToArray()[0]; } else if (careerList.Count() > 1) { selected = await DisplayActionSheet(Properties.Resources.Prompt_Select_Career, null, null, careerList.ToArray()); } else { // No careers left to to do - exit keepgoing = false; } if (!string.IsNullOrEmpty(selected)) { var career = selectedCulture.GetBasicCareer(clist[selected]); career.SkillOffered += SkillOffered; if (career is Classic.Zhodani.Career) { var zc = career as Classic.Zhodani.Career; zc.PsionicGamesOffered += DoPsionicGames; zc.PsionicTrainingOffered += DoPsionicTraining; } career.Owner = character; if (career.Enlist()) { character.Careers.Add(career); await ResolveBasicCareer(character, career); } else if (selectedCulture.Id == Constants.CultureType.Aslan) { // Aslan don't do draft - go straight to outcast career = selectedCulture.GetBasicCareer(Career.CareerType.Aslan_Outcast); career.Owner = character; character.Careers.Add(career); await ResolveBasicCareer(character, career); } else { // Unable to enlist, submit to draft? var res = await DisplayAlert(Properties.Resources.Title_App, Properties.Resources.Prompt_Draft, Properties.Resources.Button_Yes, Properties.Resources.Button_No); if (res) { do { career = selectedCulture.Drafted(character); } while (character.Careers.Contains(career)); career.Owner = character; career.Drafted = true; character.Journal.Add(string.Format(Properties.Resources.Jrn_Drafted, career.Name)); await DisplayAlert(Properties.Resources.Title_App, string.Format(Properties.Resources.Msg_Drafted, career.Name), Properties.Resources.Button_OK); character.Careers.Add(career); await ResolveBasicCareer(character, career); } else if (selectedCulture.Id == Constants.CultureType.Cepheus_Generic) { // In Cepheus if you don't submit to draft you end up as a drifter career = selectedCulture.GetBasicCareer(Career.CareerType.Cepheus_Drifter); career.Owner = character; character.Careers.Add(career); await ResolveBasicCareer(character, career); } } } if (selectedCulture.MultipleCareers && !character.Died && !(character.Careers.Sum(c => c.TermsServed) > 6) && keepgoing) { var doagain = await DisplayAlert(Properties.Resources.Title_App, Properties.Resources.Prompt_Another_Career, Properties.Resources.Button_Yes, Properties.Resources.Button_No); if (doagain) { keepgoing = true; } else { keepgoing = false; } } else { keepgoing = false; } } while (keepgoing); // check to see if the total of skill levels in non-psionic skills is greater than the sum of // int and edu, if it is they have to be reduced var total = character.Skills.Values.Where(a => a.Class != Skill.SkillClass.Psionic).Sum(a => a.Level); if (total > character.Profile.Int.Value + character.Profile.Edu.Value) { // Need to reduce skills count await DisplayAlert(Properties.Resources.Title_App, Properties.Resources.Msg_Skill_Total, Properties.Resources.Button_OK); var skillView = new SkillView(character); await Navigation.PushModalAsync(skillView); } var characterView = new CharacterViewer(character); await Navigation.PushAsync(characterView); }