Version: 1.0.0
Last Updated: 2026-01-27
Status: ✅ Implemented & Tested
The Multi-Dimensional NPC Narrative System generates rich, contextual NPC backstories and names based on five narrative axes: Wealth, Education, Origin, Experience, and Personality Traits. This system enables the creation of diverse, believable NPCs that reflect their economic status, educational background, cultural origin, professional experience, and unique character traits.
Impact:
public enum EducationLevel {
NONE, // No formal training
BASIC, // Learned from observation
APPRENTICE, // Formal apprenticeship
SCHOLAR, // Guildhall training
MASTER // Legendary craftsmen mentorship
}
Impact:
public enum OriginType {
CITY, // Urban upbringing
VILLAGE, // Small hamlet background
RURAL, // Farming family
NOMADIC, // Traveling traders
FOREIGN // Foreign territories
}
Impact:
public enum ExperienceLevel {
NOVICE, // Just starting out
JOURNEYMAN, // Competent practitioner
VETERAN, // Seasoned professional
LEGENDARY // Renowned master
}
Impact:
// Work Ethic
HARDWORKING, LAZY
// Ambition
AMBITIOUS, CONTENT
// Demeanor
FRIENDLY, RECLUSIVE, GRUFF, CAUTIOUS
// Character
TRUSTWORTHY, GREEDY, HONEST, DECEPTIVE, GENEROUS, STINGY
// Specialty
PERFECTIONIST, SLOPPY, INNOVATIVE, TRADITIONAL
// Social
STORYTELLER, QUIET, GOSSIP
// Status
STRUGGLING, PRESTIGIOUS, AMBITIOUS_CLIMBER
// Lifestyle
WANDERER, HOMEBODY
Impact:
NPCNarrativeDimensions dims = new NPCNarrativeDimensions()
.setWealthLevel(1)
.setEducation(EducationLevel.APPRENTICE)
.setOrigin(OriginType.CITY)
.setExperience(ExperienceLevel.JOURNEYMAN)
.addTrait(PersonalityTrait.HARDWORKING)
.addTrait(PersonalityTrait.STRUGGLING);
NPCNarrativeGenerator generator = new NPCNarrativeGenerator(12345L);
String backstory = generator.generateBackstory(dims, "smith", 123L);
NPCNameGenerator nameGen = new NPCNameGenerator(67890L);
String name = nameGen.generateName(dims.getWealthLevel(), dims.getOrigin(), "smith", 456L);
Output:
§7Eamon the Smith (gray color, trade surname)NPCNarrativeDimensions dims = new NPCNarrativeDimensions()
.setWealthLevel(5)
.setEducation(EducationLevel.MASTER)
.setOrigin(OriginType.CITY)
.setExperience(ExperienceLevel.LEGENDARY)
.addTrait(PersonalityTrait.PERFECTIONIST)
.addTrait(PersonalityTrait.PRESTIGIOUS);
String backstory = generator.generateBackstory(dims, "smith", 789L);
String name = nameGen.generateName(5, OriginType.CITY, "smith", 999L);
Output:
§bGrandmaster Goldtouch (aqua color, prestigious title, descriptive surname)NPCNarrativeDimensions dims = new NPCNarrativeDimensions()
.setWealthLevel(2)
.setEducation(EducationLevel.BASIC)
.setOrigin(OriginType.NOMADIC)
.setExperience(ExperienceLevel.VETERAN)
.addTrait(PersonalityTrait.WANDERER)
.addTrait(PersonalityTrait.STORYTELLER);
String backstory = generator.generateBackstory(dims, "merchant", 555L);
String name = nameGen.generateName(2, OriginType.NOMADIC, "merchant", 666L);
Output:
§fJonas Shadowvale (white color, location-based surname)Aric, Cael, Darian, Eamon, Finn, Gareth, Hale, Ian, Jorin, Kael, Liam, Maren, Nolan, Oren, Quinn, Rowan, Sean, Torin, Uric, Valen, Wren, Xander, Yorick, Zane, Bran, Drake
Aldric, Branwell, Cedric, Dorian, Edmund, Finnegan, Gideon, Harlan, Ignatius, Jareth, Kendrick, Leopold, Mortimer, Nathaniel, Oswald, Percival, Quinton, Reginald, Sebastian, Thaddeus, Ulric, Vincent
| Wealth | Color Code | Color Name | Usage |
|---|---|---|---|
| 0-1 | §7 | Gray | Poor/struggling NPCs |
| 2 | §f | White | Middle-class NPCs |
| 3 | §e | Yellow | Comfortable NPCs |
| 4 | §6 | Gold | Wealthy NPCs |
| 5 | §b | Aqua | Noble NPCs |
{ORIGIN_PHRASE} + {WEALTH_DESCRIPTOR} + {LOCATION_TYPE}
Examples:
{EDUCATION_VERB} + {PROFESSION} + {EDUCATION_PHRASE}
Examples:
{WEALTH_SPECIFIC_CIRCUMSTANCES}
Poor (0-1):
Middle (2-3):
Wealthy (4-5):
{TRAIT_SPECIFIC_FLAVOR_TEXT}
Examples:
// Step 1: Define dimensions
NPCNarrativeDimensions dims = new NPCNarrativeDimensions()
.setWealthLevel(3)
.setEducation(EducationLevel.APPRENTICE)
.setOrigin(OriginType.CITY)
.setExperience(ExperienceLevel.VETERAN)
.addTrait(PersonalityTrait.TRUSTWORTHY)
.addTrait(PersonalityTrait.PRACTICAL);
// Step 2: Generate backstory
NPCNarrativeGenerator generator = new NPCNarrativeGenerator(seed);
String backstory = generator.generateBackstory(dims, "blacksmith", npcSeed);
// Step 3: Generate name
NPCNameGenerator nameGen = new NPCNameGenerator(seed);
String coloredName = nameGen.generateName(dims.getWealthLevel(), dims.getOrigin(), "blacksmith", npcSeed);
String plainName = nameGen.generatePlainName(dims.getWealthLevel(), dims.getOrigin(), "blacksmith", npcSeed);
// Step 4: Create behavior
NPCBehavior behavior = NPCBehavior.builder()
.setInventoryQuality(NPCBehavior.InventoryQuality.RARE)
.setPriceMultiplier(1.2f)
.addTradeItem("iron_ingot", 0.8f)
.addTradeItem("steel_ingot", 0.5f)
.build();
// Step 5: Build NPC
NPC npc = NPCManager.getInstance()
.createNPC(plainName)
.setWealthLevel(dims.getWealthLevel())
.setBackstory(backstory)
.setSpecialization("blacksmith")
.setBehavior(behavior)
.build();
Unit Tests (17 tests):
Integration Tests (4 tests):
Test Results: All 21 tests passing ✅
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "NPC Template",
"type": "object",
"properties": {
"profession": { "type": "string" },
"wealth_level": { "type": "integer", "minimum": 0, "maximum": 5 },
"education": {
"type": "string",
"enum": ["NONE", "BASIC", "APPRENTICE", "SCHOLAR", "MASTER"]
},
"origin": {
"type": "string",
"enum": ["CITY", "VILLAGE", "RURAL", "NOMADIC", "FOREIGN"]
},
"experience": {
"type": "string",
"enum": ["NOVICE", "JOURNEYMAN", "VETERAN", "LEGENDARY"]
},
"personality_traits": {
"type": "array",
"items": { "type": "string" }
},
"inventory_quality": {
"type": "string",
"enum": ["COMMON", "UNCOMMON", "RARE", "EPIC", "LEGENDARY"]
},
"price_multiplier": { "type": "number", "minimum": 0.5, "maximum": 3.0 },
"trade_items": {
"type": "object",
"additionalProperties": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
},
"required": ["profession", "wealth_level"]
}
public class NPCNarrativeDimensions {
public NPCNarrativeDimensions setWealthLevel(int level)
public NPCNarrativeDimensions setEducation(EducationLevel education)
public NPCNarrativeDimensions setOrigin(OriginType origin)
public NPCNarrativeDimensions setExperience(ExperienceLevel experience)
public NPCNarrativeDimensions addTrait(PersonalityTrait trait)
public NPCNarrativeDimensions removeTrait(PersonalityTrait trait)
public boolean hasTrait(PersonalityTrait trait)
}
public class NPCNarrativeGenerator {
public NPCNarrativeGenerator(long seed)
public String generateBackstory(NPCNarrativeDimensions dims, String profession, long npcSeed)
}
public class NPCNameGenerator {
public NPCNameGenerator(long seed)
public String generateName(int wealthLevel, OriginType origin, String profession, long npcSeed)
public String generatePlainName(int wealthLevel, OriginType origin, String profession, long npcSeed)
}