示例#1
0
        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);
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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;
        }
示例#5
0
        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);
        }