โš™๏ธ Configuration & Customization

Advanced settings, custom data files, and system configuration for Medieval Bio Generator

The Configuration System allows deep customization of name databases, occupation lists, personality traits, physical attributes, and generation algorithms to create unique medieval worlds tailored to your specific game requirements.

๐Ÿ“ Configuration File Structure

Default Configuration Location

Assets/Resources/MedievalBioGenerator/Config/
โ”œโ”€โ”€ MedievalNameConfig.asset
โ”œโ”€โ”€ OccupationConfig.asset
โ”œโ”€โ”€ PersonalityConfig.asset
โ””โ”€โ”€ PhysicalTraitsConfig.asset

Configuration Asset Types

Config File Purpose Key Settings
MedievalNameConfig Name generation databases First names, surnames, noble houses, nicknames
OccupationConfig Occupation definitions Job titles, social class weights, settlement availability
PersonalityConfig Personality trait system Trait definitions, probability weights, descriptions
PhysicalTraitsConfig Physical appearance system Build types, hair/eye colors, height modifiers

๐Ÿ‘‘ Name Configuration

MedievalNameConfig Structure

[CreateAssetMenu(fileName = "MedievalNameConfig", menuName = "Medieval Bio/Name Config")]
public class MedievalNameConfig : ScriptableObject
{
    [Header("Male First Names")]
    public string[] MaleFirstNames = {
        "Aldric", "Baldwin", "Cedric", "Edgar", "Godric",
        "Harold", "Leofric", "Oswald", "Ralph", "Wulfric"
    };
    
    [Header("Female First Names")]
    public string[] FemaleFirstNames = {
        "Aelfgifu", "Beatrice", "Cwenhild", "Edith", "Godiva",
        "Hilda", "Leofwen", "Matilda", "Roswitha", "Wulfhild"
    };
    
    [Header("Surname Prefixes")]
    public string[] SurnamePrefixes = {
        "the", "of", "son of", "daughter of", "from"
    };
    
    [Header("Noble House Names")]
    public string[] NobleHouseNames = {
        "House of Thornbury", "House of Blackwood", "House of Silverstone",
        "House of Ravenshire", "House of Goldentower"
    };
    
    [Header("Occupation-Based Surnames")]
    public Dictionary<Occupation, string[]> OccupationSurnames;
}

Custom Name Categories

๐Ÿ”จ Occupation Configuration

Occupation Definition System

[System.Serializable]
public class OccupationData
{
    public Occupation Type;
    public string DisplayName;
    public SocialClass DefaultSocialClass;
    public int MinSettlementTier; // 0=Wilderness, 5=Keep
    public int MaxSettlementTier;
    public float[] SettlementProbabilityWeights; // Array for each tier
    public string[] RelatedOccupations;
    public string[] RequiredSkills;
}

Settlement Tier Availability

Settlement Tier Typical Occupations Availability Weight
Wilderness (0) Hunter, Poacher, Ranger, Bandit High (8/10)
Camp (1) Scout, Trapper, Guide, Outlaw High (7/10)
Hamlet (2) Farmer, Fisherman, Shepherd, Woodcutter Very High (9/10)
Village (3) Blacksmith, Carpenter, Baker, Miller High (8/10)
Town (4) Merchant, Guard, Scholar, Healer Medium (6/10)
City (5) Noble, Knight, Clerk, Specialist Low (4/10)
Keep (6) Soldier, Veteran, Military Specialist Very Low (2/10)

๐Ÿง  Personality Configuration

Personality Trait System

[System.Serializable]
public class PersonalityTrait
{
    public string Name;
    public string Description;
    public float BaseProbability;
    public SocialClass[] CommonInClasses;
    public Occupation[] CommonInOccupations;
    public string[] OppositeTraits;
    public bool IsPositive;
}

public class PersonalityConfig : ScriptableObject
{
    public PersonalityTrait[] Traits = {
        new PersonalityTrait {
            Name = "Brave",
            Description = "Shows courage in the face of danger",
            BaseProbability = 0.3f,
            CommonInClasses = new[] { SocialClass.Noble, SocialClass.Artisan },
            CommonInOccupations = new[] { Occupation.Soldier, Occupation.Knight },
            OppositeTraits = new[] { "Cowardly" },
            IsPositive = true
        }
        // ... more traits
    };
}

Custom Trait Categories

๐Ÿƒโ€โ™‚๏ธ Physical Traits Configuration

Physical Appearance System

[System.Serializable]
public class PhysicalTraitData
{
    public string BuildType;
    public float HeightModifier;
    public float StrengthModifier;
    public string[] AssociatedOccupations;
    public SocialClass[] CommonInClasses;
    public float ProbabilityWeight;
}

public class PhysicalTraitsConfig : ScriptableObject
{
    [Header("Build Types")]
    public PhysicalTraitData[] BuildTypes = {
        new PhysicalTraitData { BuildType = "Sturdy", HeightModifier = 1.0f, 
            StrengthModifier = 1.2f, AssociatedOccupations = new[] { "Blacksmith", "Laborer" } },
        new PhysicalTraitData { BuildType = "Slender", HeightModifier = 1.1f, 
            StrengthModifier = 0.8f, AssociatedOccupations = new[] { "Scholar", "Merchant" } }
    };
    
    [Header("Hair Colors")]
    public string[] HairColors = { "Black", "Brown", "Blonde", "Red", "Gray", "White" };
    
    [Header("Eye Colors")]
    public string[] EyeColors = { "Brown", "Blue", "Green", "Hazel", "Gray" };
}

๐ŸŽจ Advanced Customization

Custom Generation Algorithms

public class CustomCharacterGenerator : CharacterBioGenerator
{
    public override CharacterBio Generate(NpcContext context, MedievalNameConfig config = null)
    {
        // Override default generation logic
        var bio = base.Generate(context, config);
        
        // Apply custom modifications
        ApplyCulturalModifications(bio, context);
        ApplyRegionalVariations(bio, context);
        ApplyStoryRequirements(bio, context);
        
        return bio;
    }
    
    private void ApplyCulturalModifications(CharacterBio bio, NpcContext context)
    {
        // Your custom cultural logic here
        if (context.Faction == FactionType.Noble)
        {
            bio.Profile.DisplayName = AddNoblePrefix(bio.Profile.DisplayName);
        }
    }
}

Regional Configuration System

public class RegionalConfig
{
    public string RegionName;
    public MedievalNameConfig NameConfig;
    public OccupationConfig OccupationConfig;
    public float[] SettlementDistribution; // Probability weights for each tier
    public FactionType[] DominantFactions;
    public Color[] RegionalColorPalette; // For UI theming
}

// Usage
var northernKingdom = new RegionalConfig
{
    RegionName = "Northern Kingdoms",
    NameConfig = Resources.Load<MedievalNameConfig>("Configs/NorseNames"),
    OccupationConfig = Resources.Load<OccupationConfig>("Configs/NorthernOccupations"),
    SettlementDistribution = new float[] { 0.3f, 0.4f, 0.2f, 0.08f, 0.02f, 0f, 0f },
    DominantFactions = new[] { FactionType.Civilian, FactionType.Noble },
    RegionalColorPalette = new[] { Color.blue, Color.white, Color.gray }
};

๐Ÿ”„ Runtime Configuration Loading

Dynamic Configuration System

public class ConfigManager : MonoBehaviour
{
    private Dictionary<string, MedievalNameConfig> nameConfigs;
    private Dictionary<string, OccupationConfig> occupationConfigs;
    
    public void LoadConfiguration(string configName)
    {
        var nameConfig = Resources.Load<MedievalNameConfig>($"Configs/{configName}/Names");
        var occupationConfig = Resources.Load<OccupationConfig>($"Configs/{configName}/Occupations");
        
        if (nameConfig != null)
        {
            CharacterBioGenerator.SetNameConfig(nameConfig);
        }
        
        if (occupationConfig != null)
        {
            CharacterBioGenerator.SetOccupationConfig(occupationConfig);
        }
    }
    
    public void LoadRegionalConfig(string regionName)
    {
        var regionalConfig = Resources.Load<RegionalConfig>($"Regions/{regionName}");
        if (regionalConfig != null)
        {
            ApplyRegionalSettings(regionalConfig);
        }
    }
}

๐Ÿ“Š Configuration Validation

Configuration Testing Tools

[CustomEditor(typeof(MedievalNameConfig))]
public class MedievalNameConfigEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        
        if (GUILayout.Button("Test Name Generation"))
        {
            TestNameGeneration();
        }
        
        if (GUILayout.Button("Validate Configuration"))
        {
            ValidateConfiguration();
        }
    }
    
    private void TestNameGeneration()
    {
        var config = (MedievalNameConfig)target;
        var testResults = new List<string>();
        
        for (int i = 0; i < 10; i++)
        {
            var name = config.GenerateRandomName(Gender.Male);
            testResults.Add(name);
        }
        
        Debug.Log("Generated Names:\n" + string.Join("\n", testResults));
    }
}

โš ๏ธ Configuration Best Practices

Important Guidelines

Performance Considerations

๐ŸŽฎ Game-Specific Customization Examples

Fantasy RPG Configuration

// Elven Name Configuration
public class ElvenNameConfig : MedievalNameConfig
{
    public string[] ElvenMaleNames = {
        "Legolas", "Thranduil", "Celeborn", "Haldir", "Rumil"
    };
    
    public string[] ElvenFemaleNames = {
        "Galadriel", "Arwen", "Tauriel", "Nimrodel", "Celebrรญan"
    };
    
    public string[] ElvenHouseNames = {
        "House of the Silver Tree", "House of Elrond", "House of Finwรซ"
    };
}

// Dwarven Occupation Configuration
public class DwarvenOccupationConfig : OccupationConfig
{
    public new OccupationData[] Occupations = {
        new OccupationData { Type = Occupation.Miner, DisplayName = "Deep Delver",
            MinSettlementTier = 1, MaxSettlementTier = 6, DefaultSocialClass = SocialClass.Artisan },
        new OccupationData { Type = Occupation.Smith, DisplayName = "Master Forgekeeper",
            MinSettlementTier = 2, MaxSettlementTier = 5, DefaultSocialClass = SocialClass.Artisan }
    };
}

Historical Simulation Configuration

// Medieval England Configuration
public class MedievalEnglandConfig : RegionalConfig
{
    public MedievalEnglandConfig()
    {
        RegionName = "Medieval England";
        
        // Historically accurate Norman/Saxon names
        NameConfig.MaleFirstNames = new[] {
            "William", "Henry", "Richard", "John", "Robert",
            "Thomas", "Edward", "George", "James", "Charles"
        };
        
        // Realistic medieval occupations
        OccupationConfig.Occupations = new[] {
            new OccupationData { Type = Occupation.Reeve, DisplayName = "Manor Reeve",
                MinSettlementTier = 2, MaxSettlementTier = 4, DefaultSocialClass = SocialClass.Commoner },
            new OccupationData { Type = Occupation.Bailiff, DisplayName = "Bailiff",
                MinSettlementTier = 3, MaxSettlementTier = 5, DefaultSocialClass = SocialClass.Commoner }
        };
        
        // Realistic settlement distribution
        SettlementDistribution = new float[] { 0.1f, 0.3f, 0.4f, 0.15f, 0.04f, 0.01f, 0f };
    }
}
โ† Back to Medieval Bio Generator