public CharacterGenderOption GetArchetypeClone(string archetype) { CharacterGenderOption clone = (CharacterGenderOption)MemberwiseClone(); clone.ChildOptions = new ObservableCollection <NoteOption>(); foreach (CharacterGenderOption child in ChildOptions.Where(c => c is CharacterGenderOption && (((CharacterGenderOption)c).Archetype == archetype || string.IsNullOrEmpty(((CharacterGenderOption)c).Archetype)))) { clone.AddChild(child.GetArchetypeClone(archetype)); } return(clone); }
private void button_CustomGender_Click(object sender, RoutedEventArgs e) { string response = PromptDialog.Prompt("Enter your custom value:", "Custom Value", false); if (!string.IsNullOrWhiteSpace(response)) { CharacterGenderOption custom = new CharacterGenderOption(response) { IsChecked = true }; ((CharacterNote)DataContext).Genders.DeselectAllChildren(); ((CharacterNote)DataContext).Genders.AddChild(custom); } }
private void AssignGenerationalSuffix(CharacterGenderOption gender, int generation, bool up) { if (generation == 1) Suffix = RootSaveFile?.Template?.CharacterTemplate?.SeniorSuffix; else if (generation == 2) Suffix = RootSaveFile?.Template?.CharacterTemplate?.JuniorSuffix; else { StringBuilder sb = new StringBuilder(); if (generation >= 5) { sb.Append('V'); // Will generate bad results for >=9, but a family tree with 9 living generations is unlikely. for (int i = 5; i < generation; i++) sb.Append('I'); } else { for (int i = 0; i < generation && i < 3; i++) sb.Append('I'); if (generation == 4) sb.Append('V'); } Suffix = sb.ToString(); } IEnumerable<CharacterNote> relatives = up ? GetParents() : GetChildren(); relatives = relatives.Where(p => p.EffectiveGender?.Archetype == gender.Archetype); if (relatives.Any(p => p.FirstName == FirstName && p.Surname == Surname)) { CharacterNote relative = relatives.OrderByDescending(p => p.GetNameGeneration(gender, 0, up)).FirstOrDefault(); relative?.AssignGenerationalSuffix(gender, up ? generation - 1 : generation + 1, up); } }
private int GetNameGeneration(CharacterGenderOption gender, int generations, bool up) { IEnumerable<CharacterNote> relatives = up ? GetParents() : GetChildren(); relatives = relatives.Where(p => p.EffectiveGender?.Archetype == gender.Archetype); if (relatives.Any(p => p.FirstName == FirstName && p.Surname == Surname)) generations += relatives.Max(p => p.GetNameGeneration(gender, generations, up)); return generations; }
private void GetSignificantOtherAgeRange(CharacterGenderOption partnerGender, out int? minimum, out int? maximum) { minimum = null; maximum = null; // The conventional "half + 7" rule is applied to find a preliminary minimum. minimum = (int)Math.Floor((AgeYears / 2.0) + 7); // A preliminary maximum is calculated by reversing the formula. maximum = (int)Math.Ceiling((AgeYears - 7) * 2.0); // Age differences among significant others follow a predictable distribution, based partially on gender. CharacterGenderOption gender = EffectiveGender; if ((gender?.IsMasculine == true && partnerGender?.IsFeminine == true) || (gender?.IsFeminine == true && partnerGender?.IsMasculine == true)) { int val = random.Next(1, 101); int maleMinOffset = 0; int? maleMaxOffset = null; if (val <= 1) maleMinOffset = 20; else if (val <= 3) { maleMinOffset = 15; maleMaxOffset = 19; } else if (val <= 7) { maleMinOffset = 10; maleMaxOffset = 14; } else if (val <= 19) { maleMinOffset = 6; maleMaxOffset = 9; } else if (val <= 32) { maleMinOffset = 4; maleMaxOffset = 5; } else if (val <= 53) { maleMinOffset = 2; maleMaxOffset = 3; } else if (val <= 86) { maleMinOffset = -1; maleMaxOffset = 1; } else if (val <= 93) { maleMinOffset = -3; maleMaxOffset = -2; } else if (val <= 96) { maleMinOffset = -5; maleMaxOffset = -4; } else if (val <= 99) { maleMinOffset = -9; maleMaxOffset = -6; } else { maleMinOffset = -15; maleMaxOffset = -10; } if (gender.IsMasculine) { if (maleMaxOffset.HasValue) minimum = Math.Max(minimum ?? 0, AgeYears - maleMaxOffset.Value); maximum = Math.Min(maximum ?? maxAge, AgeYears - maleMinOffset); } else { minimum = Math.Max(minimum ?? 0, AgeYears + maleMinOffset); if (maleMaxOffset.HasValue) maximum = Math.Min(maximum ?? maxAge, AgeYears + maleMaxOffset.Value); } } // As a special consideration for significant others, relationships // on opposite sides of the age of consent are not generated. if (AgeYears >= ageOfMajority) minimum = Math.Max(minimum ?? 0, ageOfMajority); else maximum = Math.Min(maximum ?? maxAge, ageOfMajority - 1); }