NPCs
npcsThe named characters of the world: allies, informants, antagonists, faction leaders. Each entry places one character in the world and gives the narrator, image generator, and combat engine what they need to portray that character consistently during play.
"Non-player characters in the world"
- Editor location
- Files → World → NPCs
- Editor type
- Edit in Studio + View JSON
- API endpoint
/sections/npcs.json/sections/npcs.md- Size limits
npcs.*(each entry, compact JSON) — 8,000npcs(entire section) — 2,000,000
Schema
{
"npcs": {
"<key>": {
"name": "string",
"type": "string",
"currentLocation": "string",
"currentArea": "string",
"properName": "string",
"gender": "string",
"tier": "trivial | weak | average | strong | elite | boss | mythic",
"faction": "string",
"initialRelationship": "number",
"basicInfo": "string",
"hiddenInfo": "string",
"visualDescription": "string",
"portraitUrl": "string",
"portraits": {
"<key>": "string"
},
"portraitFocusX": "number",
"portraitFocusY": "number",
"portraitZoom": "number",
"personality": [
"string"
],
"abilities": [
"string"
],
"initialKnown": "boolean",
"detailType": "basic | detailed",
"level": "number",
"hpMax": "number",
"hpCurrent": "number",
"healthMultiplier": "number",
"successBonus": "number",
"damageModifier": "number",
"damageReductionModifier": "number",
"worldVoiceId": "string",
"vulnerabilities": [
"string"
],
"resistances": [
"string"
],
"immunities": [
"string"
],
"portraitHistory": [
"string"
],
"cutoutUrl": "string",
"cutoutSourceUrl": "string",
"voiceTag": "string"
}
}
}Example
{
"npcs": {
"Councillor Maren Halst": {
"name": "Councillor Maren Halst",
"type": "character",
"currentLocation": "The Capital",
"currentArea": "Council Hall",
"tier": "elite",
"gender": "female",
"faction": "The Merchant Council",
"basicInfo": "Current chair of the Merchant Council and its most senior member by tenure. Silver-streaked hair worn severely back, pale eyes that assess before they greet — she enters a room and immediately establishes which exit she would use. Formal council robes, understated jewelry that costs more than it appears to. She has held her seat for nine years and has not lost a vote of consequence in four.",
"hiddenInfo": "In a directed arrangement with a criminal syndicate for three years — not merely looking away but actively redirecting city watch patrols away from specific warehouses on scheduled nights. She believes this is a controlled exposure she can end at any moment. The syndicate has prepared documentation sufficient to destroy her and is planning to expand their demands, using her exposure as leverage for permanent council access. A junior colleague is in the same arrangement and does not know the full scope of what she committed to at the outset; he has recently begun showing anxiety. She is watching him and will move first if she concludes he is about to break. A copy of the incriminating documents she declared destroyed last session sits in the Old Customs Vault with a syndicate intermediary who does not know their significance.",
"personality": [
"treats warmth as a tool to deploy, not a state to inhabit",
"weighs every conversation for what can be extracted from it before the other person has finished speaking",
"comfortable holding silence until the other side fills it past their position",
"will distance herself from a compromised ally the moment the calculation changes",
"precise with language — completes every sentence, closes every door before starting the next",
"reads anxiety in others as information to be filed, not empathy to be offered"
],
"abilities": [
"Civic Authority: as council chair she commands procedural compliance from the senior bureaucracy. Useful for opening doors closed to outsiders. Loses force outside the Capital's institutional context.",
"Negotiation: reads counterparties for leverage faster than they read her. Comfortable holding silence until the other side speaks past their position. Most effective when she controls the venue.",
"Public Speaking: command of the council chamber and the public square. Calibrates tone between conciliation and rebuke without breaking pace. Has not lost a vote of consequence in four years.",
"Investigation: maintains a private network of informants among clerks, dockworkers, and household staff. Knows about most political moves a week before they surface. Keeps the network entirely off the council's books.",
"Self-Preservation: trained instinct for distancing herself from compromised allies before exposure. The Dockside Brotherhood arrangement is the first time this instinct has failed her, though she does not yet know that.",
"\nfighting style: Maren does not fight directly. She wins through institutional position, prepared evidence, and the credible threat of consequences delivered through other people. In a physical confrontation she would be a liability rather than an asset, and she knows it -- her bodyguards are not for show. Her Self-Preservation instinct is the most dangerous thing about her in a crisis: she will sacrifice an ally to a council inquiry the moment she calculates the alliance is no longer net-positive. She adapts to new threats by acquiring new informants, not by changing methods. The deeper a problem goes, the further she retreats into procedural cover."
],
"level": 10,
"hpMax": 60,
"successBonus": -25,
"damageModifier": -50,
"portraitUrl": "https://world-assets.example/npc/maren-halst.webp",
"initialKnown": true
},
"Inkwell": {
"name": "Inkwell",
"properName": "Davan Mosse",
"type": "character",
"currentLocation": "The Capital",
"currentArea": "Lower District Tavern",
"tier": "average",
"gender": "male",
"faction": "",
"basicInfo": "A city watch informant who operates under the street name Inkwell, known only by reputation to most of his contacts. Lean build, early forties, a permanent ink stain on his right hand from a scribing job he uses as cover. Cheap working clothes, nothing that marks him as notable.",
"hiddenInfo": "His real name is Davan Mosse. He has been feeding information to both the watch and the syndicate for two years, carefully balancing what each side learns to prevent either from burning him. The watch believes they own him exclusively. The syndicate does not know he is an informant. He knows approximately three things that would destroy each side's current operations if surfaced to the other, and is aware that this is the only reason he is still alive.",
"personality": [
"reads every room before committing to a position",
"appears to remember nothing and forgets nothing",
"charges for information but gives it at face value once paid",
"speaks quietly, never repeats himself"
],
"abilities": [
"Street Intelligence: knows the current state of most active criminal operations in the lower district within a week's lag. Will share for coin or equivalent favour.",
"Cover Maintenance: the scribing job is real and provides a plausible reason to be almost anywhere in the city at most hours.",
"Evasion: experienced at moving through the city without being followed. Not a fighter; won't engage if there is any alternative.",
"Double Channel: maintains separate credible relationships with the watch and the syndicate without either knowing about the other.",
"Document Access: can obtain or forge minor official documents through his scribing contacts. Takes time and costs extra.",
"\nfighting style: Inkwell does not fight. He runs, hides, or surrenders. His survival strategy is to never be in a situation where fighting is the only option, and he has been successful at this for two years. If cornered, he will immediately offer information as currency."
],
"level": 1,
"hpMax": 30,
"initialKnown": true
}
}
}Fields
properName
Optional. The character's true name behind the public-facing name. Use it when an identity is hidden or the NPC goes by a title or alias: players see name ("Inkwell" in the example above) while properName holds who they really are ("Davan Mosse"). Defaults to name when omitted. The identity counts as revealed once the two match: when the story reveals the true name, the NPC's displayed name updates to it automatically.
basicInfo
What the narrator reads during play, so any appearance you want described in play must live here. Also the image generator's source when visualDescription is empty.
type
The NPC's npcTypes key — required (codec-enforced). The value must be a key defined in your world's npcTypes dict, or an empty string ("") for fully unique NPCs that don't share a damage profile with any type. Use a named type when this NPC shares a damage profile (vulnerabilities / resistances / immunities) with a defined species, creature category, or profession — the damage profile is authored on the npcTypes entry, and every NPC of that type inherits it.
tier
Controls intent complexity, health scaling, and damage output. Defaults to average when omitted. See Combat mechanics for the full tier tables.
| Tier | When to use |
|---|---|
trivial | Fodder, ambient crowd, zero-stakes |
weak | Minor obstacles |
average | Standard encounter NPCs |
strong | Named story NPCs |
elite | Named story NPCs, faction leaders |
boss | Major antagonists |
mythic | World-level threats |
generateNPCDetails fires for any NPC with detailType: "basic" that the engine has flagged for detail generation — not gated by tier. Tier controls whether characterArchetypes and authorSeeds are consulted within the task (strong / elite / boss / mythic only).
detailType
Usually omit (auto-set at runtime). Defaults to "detailed" when omitted, so authored NPCs do not need to set it. "detailed" prevents generateNPCDetails from running for this NPC (authored content is preserved permanently); "basic" allows the engine to flesh out or overwrite NPC detail dynamically, and may reset detail that has not been encountered for an extended period.
level
Set explicitly for any NPC who should be stronger than the party — an explicit value is used as-is. If omitted or 0, the engine rolls a level near the party average at the moment the NPC first becomes visible (so it tracks the party's level at that point), then clamps it into the npcLevelRange of the NPC's location, or the region's range if the location defines none. Each NPC level adds +2 to the NPC's base damage.
healthMultiplier
Per-NPC scalar on the NPC's calculated maximum HP -- the value derived from level and tier. Default 1.0; 0.5 halves the pool, 2.0 doubles it, with values clamped to the 0.1–100 range. Affects the HP pool only, not damage output. Ignored when hpMax is set explicitly -- use one or the other, not both.
personality
Must be an Array<string>, not a single string. The editor textarea auto-converts to an array on save, but JSON authored directly must already be an array or validation fails. Keep entries behavioral ("calculates every conversation for leverage") not adjectival ("smart, ruthless, charming").
abilities
Narrative context for the AI, not references to the top-level abilities section. They are not validated against that section and cannot be used by the player. Each entry is a prose capability description; the final entry is a fighting-style summary. See abilities format under Authoring tips for the writing conventions.
Note (exposure and per-turn sampling):
abilities(along withbasicInfoandhiddenInfo) reach the AI only when the NPC isdetailType: "detailed". They feed the combat-intent and detail-generation tasks but are not sent to the story narration. When generating combat intents the engine samples about 3 of the NPC's abilities at random each turn, re-sampling every turn — so a long ability list surfaces variety over a fight rather than all at once.
visualDescription
Read only by the image generator, never by the story narrator. The generator uses visualDescription when it is set and falls back to basicInfo when it is empty. Because the narrator never reads visualDescription, any appearance you want described in play must live in basicInfo regardless — the narrator has nothing else to draw from. So basicInfo always carries the narrated appearance, and visualDescription is an optional companion for portrait-only details: leave it empty and the portrait falls back to basicInfo (the simple default), or set both when you want the image to show specifics the narrator should not lock in.
There is one legitimate reason to populate visualDescription: when you want appearance prose fed only to the image model and explicitly not to the story narrator. Example: the story AI describes a character as "dressed plainly" without locking in colors or patterns every scene, but the image generator sees "faded blue tunic with patched sleeves, leather belt, scuffed boots" so portraits come out consistent across regenerations. In that case the split is the point. Outside that narrow case, leave the field empty.
initialKnown
Whether the NPC starts in the player's journal. Set to false for NPCs the player must discover, and use a known-entity trigger effect to reveal them at the right story moment. During play the party keeps its own record of which NPCs it knows.
currentLocation
Key of the location the NPC is in; matching ignores case and whitespace. Required. A key that names no location raises a warning. A blank "" keeps the NPC off-stage until something places it, such as an npc-placement trigger effect.
currentArea
Area inside currentLocation. Required. A blank "" means somewhere in the location: the NPC can appear in any of its areas, so set an area only to pin the NPC to it. In a location with no areas ("areas": {}), leave it blank; a non-empty name there points at nothing and raises a warning. If the NPC should stand somewhere specific, add the area to the location first.
initialRelationship
Optional starting relationship score toward the players, a number from -100 to 100; an explicit 0 is neutral. Omit it to let the AI choose a starting score using the generateNPCUpdates relationship initialization guidance. A value outside -100 to 100 is a validation error. The engine keeps the score as it moves during play separately, so this field only ever sets where an NPC starts.
name
Display name of the NPC, shown to players. Required; see Keys and name and properName for a hidden true name behind it. Don't name an NPC (key, name, or properName) allSceneNPCs, anySceneNPC, allPartyNPCs, anyPartyNPC, or satisfyingNPCs: an NPC answering to one takes over that trigger selector, and Voyage warns.
gender
"male", "female", or "non-binary".
faction
Key of the NPC's faction in factions, or "" for none.
portraitUrl
Portrait image URL for this NPC, used as-is (skips AI portrait generation when set; the engine generates one when it is empty). Portraits are portrait-orientation: Voyage's own generator produces 896×1200, and the minimum is 600×600. The in-game card crops the image, so keep the face clear of the edges. In the editor you can upload your own or generate one from a prompt — both set this URL.
portraits
Optional map of named portraits for the NPC, keyed by portrait name. A trigger's npc-portrait effect switches the NPC to one of them by giving its key as the value, see trigger effects.
portraitFocusX
Positions the visible window over the source image along the horizontal axis, as a percentage: 0 holds the left edge, 50 centres it, 100 holds the right edge. Defaults to 50. Saved by the crop control rather than typed by hand; applies to an authored portrait, and generated portraits ignore it.
portraitFocusY
Positions the visible window over the source image along the vertical axis, as a percentage: 0 holds the top edge, 50 centres it, 100 holds the bottom edge. Defaults to 0 (the top). Saved by the crop control rather than typed by hand; applies to an authored portrait, and generated portraits ignore it.
portraitZoom
Scales the image inside its frame, as a percentage of the unzoomed fit: 100 fills the frame with no magnification, 150 shows it at one and a half times, cropping to the area picked by the focus fields. Ranges from 100 to 300, default 100. Saved by the crop control rather than typed by hand; applies to an authored portrait, and generated portraits ignore it.
portraitHistory
Previous portrait image URLs for this NPC, shown as Previous portraits in its details window so a player can restore one. Voyage adds to it when the portrait is replaced.
hpMax
Maximum HP. An authored hpMax is used exactly as written: the game's difficulty never modifies it and healthMultiplier is ignored. Omit it to let the engine derive HP live from (npcHealthPerLevel * level + npcMinHealth) * tier modifier * healthMultiplier * difficulty modifier (see Other Settings for the per-level values). hpMax: 0 with hpCurrent: 0 spawns the NPC dead or dying.
hpCurrent
Current HP; defaults to hpMax when omitted, and is clamped to the final hpMax.
voiceTag
The TTS voice for this NPC. See the Voice Catalog for the voices available to name. An NPC left without one is given a voice during play, matched from its gender and traits, so set it to pin a specific voice rather than take whichever fits. A tag outside the catalog is replaced with a catalog voice.
worldVoiceId
Points at a worldVoices entry by its key, giving this character that voice. It overrides the stock voiceTag pick for this NPC, whether or not the voice is offered in character creation. Use it when the voice is one the world defines and more than one character may share.
vulnerabilities
These union with the NPC's npcType arrays; the engine merges both. Use only when this specific NPC needs a damage profile beyond what its type provides.
resistances
These union with the NPC's npcType arrays; the engine merges both. Use only when this specific NPC needs a damage profile beyond what its type provides.
immunities
These union with the NPC's npcType arrays; the engine merges both. Use only when this specific NPC needs a damage profile beyond what its type provides.
successBonus
Only for NPCs that should roll better or worse than normal: 25 points shifts every roll one success tier; a negative value lets an NPC fumble. Optional. Setting it at all, 0 included, also hands the narrator that NPC's rolled outcome, so its successes and fumbles show up in the prose; an NPC without the field, on itself or its type, rolls the same ladder unnarrated. An NPC that leaves it unset uses its npcType's successBonus, if the type has one. The editor's control accepts -1000 to 1000.
damageModifier
Percent change to outgoing damage (100 doubles it, -100 removes it). Only for NPCs whose hits should land harder or softer than level and tier imply. Optional, and an exception: an NPC without it behaves exactly as its level and tier describe. Set on npcs entries only. The editor's control accepts -100 to 10000.
damageReductionModifier
Percent reduction to incoming damage (100 is true immunity). Only for unusually tough or untouchable NPCs. Optional, and an exception: an NPC without it behaves exactly as its level and tier describe. Set on npcs entries only. The editor's control accepts 0 to 100.
Keys and name
The outer key is the entry's id, and the engine resolves references by key. It must be identical to the inner name, character for character, and Voyage rejects a world where the two differ. Among the keyed sections that carry a name, quests is the exception: its key is free.
Combat mechanics
tier controls three things at combat time: HP, damage output, and intent complexity. When hpMax isn't authored, HP derives from (npcHealthPerLevel * level + npcMinHealth) * tierHPModifier * healthMultiplier * difficultyHealthMultiplier.
HP multipliers
Applied to the NPC's level-derived base HP.
| Tier | HP multiplier |
|---|---|
| trivial | 0.15x |
| weak | 0.5x |
| average | 1.0x |
| strong | 1.25x |
| elite | 1.5x |
| boss | 1.7x |
| mythic | 1.85x |
Damage multipliers
Applied to NPC damage output.
| Tier | Damage multiplier |
|---|---|
| trivial | 0.65x |
| weak | 0.8x |
| average | 1.0x |
| strong | 1.12x |
| elite | 1.25x |
| boss | 1.35x |
| mythic | 1.55x |
NPC base damage scales at a flat +2.0 per level with no milestone bonuses, before the tier multiplier above. Players scale at +2.5 per level plus the every-5-levels milestone bonus, so an equal-level player slightly out-damages an average-tier NPC by design.
NPC success rolls
NPCs have no skills or attributes to roll, so each NPC attack's success level is fixed RNG every turn:
| Outcome | Chance |
|---|---|
| critical success | 10% |
| great success | 20% |
| success | 40% |
| basic success | 30% |
The only thing that pushes an NPC attack below basic success is combat conflict: when a player's defend action succeeds, it degrades the attacking NPC's outcome (a strong defense can turn the NPC's attack into a failure).
Per-NPC combat modifiers
Three optional numbers override what an NPC's level and tier produce. Leave them out and the NPC behaves exactly as its tier and level describe.
| Field | Editor range | What it does |
|---|---|---|
successBonus | -1000 to 1000 | Only for NPCs that should roll better or worse than normal: 25 points shifts every roll one success tier; a negative value lets an NPC fumble. Present at any value, 0 included, it also hands the narrator the NPC's rolled outcome |
damageModifier | -100 to 10000 | Percent change to outgoing damage (100 doubles it, -100 removes it). Only for NPCs whose hits should land harder or softer than level and tier imply |
damageReductionModifier | 0 to 100 | Percent reduction to incoming damage (100 is true immunity). Only for unusually tough or untouchable NPCs |
successBonus shifts the success ladder above; damageModifier adjusts what the NPC deals and damageReductionModifier what it takes. An NPC that carries successBonus also has its rolled outcome passed to the narrator, so the prose describes a fumble as a fumble; one without it, on itself or its type, rolls the same ladder silently. damageModifier and damageReductionModifier sit on npcs entries only, so a damage modifier that should apply to every NPC of a type is set on each one. successBonus can also be set on an npcType as the default for its NPCs: an NPC that leaves its own unset uses the type's.
Encounter difficulty multipliers
Encounter difficulty scales NPC damage and health by engine constants (not configurable), applied on top of the tier multipliers:
| Difficulty | NPC damage | NPC health |
|---|---|---|
| very easy | 0.7x | 0.5x |
| easy | 0.85x | 0.75x |
| medium | 1.0x | 1.0x |
| hard | 1.15x | 1.25x |
| very hard | 1.3x | 1.5x |
Combat intent complexity
| Tier | Intents per turn | Behavior |
|---|---|---|
| trivial / weak | 1 | Simple, direct actions |
| average | 1-2 | Basic tactics |
| strong | 2 | Uses abilities when appropriate |
| elite / boss / mythic | 2-3 | Tactical and dramatic |
Death countdown
NPCs with tier elite, boss, or mythic — and party member NPCs — use a 3-turn death countdown rather than dying instantly at 0 HP:
| Turn | Status | Description |
|---|---|---|
| 1 | near death | Just went down - can still be healed or stabilized |
| 2 | dying | Slipping closer to death |
| 3 | dead | Dead; revivable only as described below |
Standard tiers (trivial, weak, average, strong) die instantly at 0 HP.
Positive healing clears near death and dying. A dead character is revived only by explicit healing (an NPC, a player action, an item, a spell, or a story event), and only when permadeath is off; passive recharge and rest never revive. Recovering and reviving restore 35% of max health.
A party-member NPC below elite is automatically promoted to elite when it levels up alongside the party, so long-term companions become major NPCs over time — gaining the death countdown and the higher HP and damage modifiers rather than dying instantly.
Authoring tips
- Use
detailType: "detailed"for story NPCs you've carefully defined. The AI won't overwrite them. Use"basic"for background NPCs who can be lightly improvised. - Mind who stands in a starting area. An NPC whose
currentAreais a story start's opening area is in the opening scene on every run that starts there; place story NPCs elsewhere unless that is the point. - Keep
basicInfoconsistent withcurrentArea. IfbasicInfonames where the NPC is, name the same area the field does.
basicInfo format
One to several sentences integrating role, one specific appearance detail, and current situation. The most effective entries fuse these into a paragraph that reads as continuous narrative rather than a checklist. Length scales with NPC importance: minor NPCs can be a single sentence, named story NPCs warrant a full paragraph.
Two techniques that distinguish memorable entries from flat ones:
- Behavioral contradiction embedded in appearance: "An easy slouch that straightens faster than it should. Grins too easily but watches too carefully." The contradiction signals hidden depth without stating it.
- Current situation for major NPCs: What are they doing or trying to do right now, not just what they generally are. "Studying maps and watching newcomers" tells the narrator more than "a strategic planner."
hiddenInfo structure
hiddenInfo carries the full interior life of an NPC — what the narrator knows that the player doesn't. A single "secret that contradicts basicInfo" is the minimum. For named story NPCs, strong hiddenInfo addresses several layers:
- The contradiction — what is false or incomplete about
basicInfo - Real motivation — what the NPC is actually trying to achieve
- Mechanism of concealment — how they maintain the facade, who else knows, how they operate
- Leverage point — their vulnerability, pressure point, or the thing that can change their behavior
- Connections — which other NPCs or factions know what about them
For minor NPCs a single sentence per layer is enough. hiddenInfo reaches the story narration, the NPC's combat intents, and its own dialogue, so named story NPCs benefit from the fuller version.
personality format
Several behavioral phrases, labeled descriptions, or short behavioral sentences. The core principle: behavioral, not adjectival. "Calculates every conversation for leverage" is better than "calculating." "Remembers every slight, names none of them" is better than "holds grudges." Each entry should describe something specific and observable.
Three formats that all work in practice:
- Phrase fragments (dense, vivid):
"warmth indistinguishable from genuine compassion","watches exits before faces" - Label: explanation (readable):
"Conflict Avoidant: seeks peaceful resolution before escalation","Forest Guardian: deep connection to the wilds" - Behavior sentences (comprehensive):
"Acts far more feeble than actually is","Maintains secret vanity about appearance"
A speaking-style entry is optional but useful for NPCs with dialogue: include it when the NPC's voice pattern is distinctive enough to warrant consistent enforcement.
abilities format
Recommended for combat-relevant NPCs: at least five abilities followed by a fighting-style summary as the final entry.
Each ability entry is a string in this shape:
"Ability Name: 3 sentences - what it is, what it does, how it can be used."The fighting-style entry is longer and more detailed, and starts with a literal \n character so it appears on its own line when displayed:
"\nfighting style: [5 sentences covering combat approach, ability synergies, emotional tone in combat, tactical preferences, adaptation]"Sample ability array shape:
"abilities": [
"Investigation: constructs and pursues evidence chains; comfortable working with incomplete information. Tracks contradictions across statements; follows leads to their source. Useful for any scene requiring deduction or interrogation.",
"Combat Reflexes: trained to react before deciding. Reduces hesitation in ambush situations and chaotic melee. Lets her engage from a non-ideal starting stance without penalty.",
"Streetwise: reads the political weather of any neighborhood within minutes. Identifies who matters, what protections are in place, and which doors are open to her. Useful for navigating cities cold.",
"Intimidation: uses presence rather than threats. Makes people decide cooperation is the easier option without any specific pressure being applied. Loses effectiveness against opponents who outrank her socially.",
"Patience: outwaits an opponent's first move. Comfortable holding position for hours until conditions favor her. The longer she's been in a stakeout, the harder she is to displace.",
"\nfighting style: She fights like an investigator who happens to be armed -- patient, observant, looking for the moment when an opponent commits. Her Combat Reflexes pair with Patience for ambush kills, but she will pivot to Intimidation if a fight can be settled without one. She is unhurried under pressure and does not telegraph her intentions, making her hard to read in the early rounds. Against multiple opponents she falls back to terrain and lets them sort themselves out before engaging. She adapts more readily to new opponents than most fighters because she treats every fight as a problem to solve, not a routine to execute."
]Writing rules:
- Ability descriptions directly influence NPC combat behavior. The AI references abilities by name and uses their descriptions to generate varied actions. Vague descriptions produce repetitive output.
- Each entry should cover a range of related actions, not one narrow technique.
"Investigation: constructs and pursues evidence chains; comfortable working with incomplete information"is more useful than three entries each describing a single specific deductive action. - For higher-tier NPCs (
elite,boss,mythic) that take 2-3 intents per turn, cover 4-5 genuinely different situational domains: combat, social, institutional, domain-specific expertise, sensory/attunement. Breadth across domains matters more than depth within any single one, because the AI will otherwise repeat the same ability entries. - Magic-capable NPCs: use the form
"<Type of magic> - Sub-capability: specific application"to telegraph the magical school the AI should reach for.
For all valid
voiceTagvalues and audio previews, see Voice Catalog.
Tier guidance
- Most named story NPCs →
elite - Regular background NPCs →
averageorstrong - Boss-tier enemies →
boss, unique monsters →mythic - Civilians and non-combatants →
trivial - Bandit lookouts, minor creatures →
weak - Standard guards, common enemies →
average - Veteran soldiers, mid-tier enemies →
strong - Zone bosses, major antagonists →
boss - Unique world-defining entities →
mythic(use sparingly)
generateNPCDetails override
The custom key in generateNPCDetails (and other AI tasks) is appended after all named sub-tasks. To change a default section itself, override that named key; an empty string blanks it. Use custom for additions such as exact labeled fields or content requirements.