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
- Cultural Names: Add specific cultural name sets (Norse, Celtic, etc.)
- Regional Variations: Different name pools for different game regions
- Social Class Names: Distinct naming conventions for nobles vs. commoners
- Religious Names: Saint names, biblical names for religious characters
๐จ 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
- Virtues: Honesty, Kindness, Generosity, Humility
- Vices: Greed, Pride, Wrath, Envy, Sloth
- Social Traits: Charismatic, Shy, Diplomatic, Aggressive
- Professional Traits: Diligent, Innovative, Traditional, Ambitious
- Personal Quirks: Superstitious, Pious, Romantic, Mysterious
๐โโ๏ธ 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
- Backup Originals: Always backup default configurations before modifying
- Test Thoroughly: Generate multiple characters to test configuration changes
- Maintain Balance: Keep probability weights realistic and balanced
- Document Changes: Add comments to explain custom configuration choices
- Version Control: Use version control for configuration files
Performance Considerations
- Array Sizes: Keep name arrays reasonably sized (50-200 entries per category)
- Memory Usage: Large configuration files can impact loading times
- Loading Strategy: Load configurations on demand rather than all at once
- Caching: Cache frequently used configurations in memory
๐ฎ 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