public Settler.Settler GenerateParent(bool isMale) { int age = (int)(Math.Pow(new Random().NextDouble(), 0.2) * Varsk.VarskElderYears + Varsk.VarskAdultYears) * Date.DaysInYear; NameFactory name = isMale ? VarskNameFactories.Male() : VarskNameFactories.Female(); var settler = new Varsk(new Date(-1 * age), name.Generate(), $"{VarskNameFactories.Male().Generate()}sson", isMale ? BinaryGender.Male : BinaryGender.Female); TraitGenerator.GenerateTraits(settler); return(settler); }
public static void GenerateChildTraits(Human child) { List <Settler> parents = new List <Settler>(); foreach (var relationship in child.Relationships) { if (relationship is ParentChildRelationship pcr && pcr.Role(child) == ParentChildRelationship.Child) { parents.Add(pcr.Other(child)); } } var badRelationshipParents = parents.Where(parent => child.Relationships .FirstOrDefault(rel => rel is ParentChildRelationship pcr && pcr.Other(parent) == child)?.Level <= RelationshipLevel.Dislike).ToList(); foreach (var trait in Trait.Traits) { var parentsTraitsArray = parents.ToArray().Select(parent => parent.Traits[trait].Value).ToArray(); if (badRelationshipParents.Count > 0 && RandomUtil.Chance(1, 3)) { var parent = RandomUtil.Get(badRelationshipParents); var level = parent.Traits[trait]; if (level == TraitLevel.Average) //Reaction goes extreme { child.Traits[trait] = RandomUtil.Get(new[] { TraitLevel.VeryLow, TraitLevel.Low, TraitLevel.High, TraitLevel.VeryHigh }); } else if (level == TraitLevel.AboveAverage) // Reaction goes extreme, more down { child.Traits[trait] = RandomUtil.Get(new[] { TraitLevel.VeryLow, TraitLevel.Low, TraitLevel.VeryHigh }); } else if (level == TraitLevel.BelowAverage) { child.Traits[trait] = RandomUtil.Get(new[] { TraitLevel.VeryLow, TraitLevel.High, TraitLevel.VeryHigh }); } else if (level >= TraitLevel.High) { child.Traits[trait] = RandomUtil.Get(new[] { TraitLevel.VeryLow, TraitLevel.Low, TraitLevel.BelowAverage }); } else { child.Traits[trait] = RandomUtil.Get(new[] { TraitLevel.AboveAverage, TraitLevel.High, TraitLevel.VeryHigh }); } } else { var baseLevel = TraitLevel.Average.Get(MathUtil.RoundTowardsZero(MathUtil.UnroundedAverage(parentsTraitsArray))); if (RandomUtil.CoinFlip()) //Drift { if (baseLevel == TraitLevel.VeryLow || baseLevel <= TraitLevel.High && RandomUtil.CoinFlip()) { baseLevel = baseLevel.Get(baseLevel.Value + 1); } else { baseLevel = baseLevel.Get(baseLevel.Value - 1); } } child.Traits[trait] = baseLevel as TraitLevel; } } TraitGenerator.EnsureMajorTrait(child); }