personaforge/PersonalityGen.cs

74 lines
2.1 KiB
C#

namespace PersonaForge;
public static class PersonalityGen
{
const int MaxPoints = 10;
const int TotalBudget = 25;
static readonly Random rng = new();
public static PersonalityTraits GenerateRandom(Dictionary<string, double>? bias = null)
{
var profile = PersonalityTraits.Create();
var traits = new List<string> { "Outgoing", "Nice", "Playful", "Neat", "Active" };
var remaining = TotalBudget;
if (bias != null)
{
foreach (var kvp in bias)
{
var trait = kvp.Key;
var points = Convert.ToInt32(kvp.Value);
var safePoints = Math.Min(points, MaxPoints);
SetTraitPoints(profile, trait, safePoints);
remaining -= points;
}
}
while (remaining > 0)
{
var trait = traits[rng.Next(traits.Count)];
var current = GetCurrentTraitPoints(profile, trait);
if (current < MaxPoints)
{
var add = (rng.NextDouble() < 0.1) ? Math.Min(2, MaxPoints - current) : 1;
add = Math.Min(add, remaining);
SetTraitPoints(profile, trait, current + add);
remaining -= add;
}
}
return profile;
}
static int GetCurrentTraitPoints(PersonalityTraits p, string trait) => trait switch
{
"Outgoing" => p.Outgoing,
"Nice" => p.Nice,
"Playful" => p.Playful,
"Neat" => p.Neat,
"Active" => p.Active,
_ => 0
};
static void SetTraitPoints(PersonalityTraits p, string trait, int points)
{
switch (trait)
{
case "Outgoing":
p.Outgoing = points;
break;
case "Nice":
p.Nice = points;
break;
case "Playful":
p.Playful = points;
break;
case "Neat":
p.Neat = points;
break;
case "Active":
p.Active = points;
break;
}
}
}