원클릭으로
traits
Schema and rules for creating traits
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Schema and rules for creating traits
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Schema and rules for editing AI instructions
Check character counts and limits for Voyage World config files. Use when checking how much space is used, before adding large content, or when approaching size limits.
Schema and rules for creating locations
Schema and rules for editing settings
Schema and rules for creating triggers
Schema and rules for creating narrative events
| name | traits |
| description | Schema and rules for creating traits |
| context | fork |
| agent | traits |
Edit tabs/traits.json.
Traits must be organized into categories in tabs/traits.json under traitCategories.
| Field | Description |
|---|---|
name | Display name for the category |
maxSelections | How many traits player can pick. 0 means none can be picked — don't use it |
traits | Array of trait keys in this category |
Category patterns:
maxSelections: 1maxSelections: 1maxSelections: 3Category selection at character creation ignores requirements, unlockedBy, and excludedBy — those only affect level-up trait picks (see below).
| Field | Requirement |
|---|---|
name | Must match object key exactly |
description | What the trait is — shown to players at character creation (full paragraph) |
traitNarrativeEffects | The narrator's reference for portraying the trait. Usually the same as description; elaborate further or add hidden aspects the player shouldn't see |
attributes | Array of attribute modifiers (can be empty []) |
skills | Array of skill modifiers (can be empty []) |
resources | Array of resource modifiers (can be empty []) |
startingItems | Array of items granted (can be empty []) |
abilities | Array of ability names granted (can be empty []) |
requirements | Array of requirement objects (can be empty []). Only gates level-up trait picks — ignored at character creation |
unlockedBy | Trait prerequisites (OR logic). Only affects level-up trait picks — ignored at character creation |
excludedBy | Trait conflicts. Only affects level-up trait picks — ignored at character creation |
For non-species traits:
description and traitNarrativeEffects carry the same content — write both as full paragraphs.description is shown to players at character creation. traitNarrativeEffects is the narrator's reference during play.traitNarrativeEffects is the elaborated, fuller version.Older configs used a field named quirk for this; it is auto-migrated to traitNarrativeEffects verbatim. Always write traitNarrativeEffects in new configs.
For species traits, see the Species Traits section below.
| Field | When to Include |
|---|---|
attributes (non-empty) | Class/background traits that affect core stats |
skills (non-empty) | Traits that grant expertise or training |
resources (non-empty) | Traits that affect resource pools |
startingItems (non-empty) | Class/background traits with signature equipment |
abilities (non-empty) | Traits that unlock special perks or powers |
requirements (non-empty) | Traits in the level-up pool that should be gated behind stats, skills, other traits, or character level |
vulnerabilities / resistances / immunities | Traits that should change how much typed damage the player takes in combat (e.g. a fire-elemental species immune to fire). Values must match combatSettings.damageTypes |
Traits can be offered as level-up rewards via progressionSettings.levelUpTraitPool in tabs/settings.json (default cadence: 1 pick every 10 levels). When a pick is pending, the player chooses from pool traits they don't already have whose unlockedBy/excludedBy conditions pass and whose requirements are met; the chosen trait applies immediately, exactly like a starting trait. An empty pool means no picks are ever granted.
Gotcha: requirements, unlockedBy, and excludedBy do nothing at character creation — they only filter the level-up pick list. To keep a trait out of starting selection, leave it out of every trait category.
All modifiers use the same structure:
{ attribute: string, modifier: number } // For attributes
{ skill: string, modifier: number } // For skills
{ resource: string, modifier: number } // For resources
The modifier is an additive value (positive or negative). Multiple traits stack.
Traits should be balanced around a point budget. Use these guidelines:
| Modifier Type | Point Cost |
|---|---|
| Attribute | 1 point |
| Skill at modifier 0 | 1 point |
| Resource per 10 | 1 point |
| Starting item | 1 point |
| Ability | 1 points |
Every trait within a single traitCategory should be roughly equal.
Target values:
isHealth resource should be set at roughly 100.{ item: string, quantity: number }
The item must reference a valid item key from tabs/items.json.
Array of prerequisite checks. All must be met for the trait to appear as a level-up pick. Same format as ability requirements.
{ type: 'skill', variable: 'skill name', amount: 3 } // Skill level >= 3
{ type: 'attribute', variable: 'strength', amount: 14 } // Attribute value >= 14
{ type: 'characterLevel', amount: 5 } // Character level >= 5 (no variable)
{ type: 'resource', variable: 'mana', amount: 50 } // Resource max >= 50
{ type: 'trait', variable: 'fire affinity', amount: 1 } // Has trait (amount ignored)
interface TraitCategory {
name: string
maxSelections: number
traits: string[]
}
interface Trait {
name: string
description: string
traitNarrativeEffects: string
attributes: Array<{attribute: string, modifier: number}>
skills: Array<{skill: string, modifier: number}>
resources: Array<{resource: string, modifier: number}>
startingItems: Array<{item: string, quantity: number}>
abilities: string[]
requirements: TraitRequirement[]
unlockedBy: string[]
excludedBy: string[]
vulnerabilities?: string[]
resistances?: string[]
immunities?: string[]
}
type TraitRequirement =
| { type: 'resource' | 'attribute' | 'skill' | 'trait'; variable: string; amount: number }
| { type: 'characterLevel'; amount: number }
When creating a trait that represents a species (playable race):
description contains lore paragraphs + skill blocks separated by \n\ntraitNarrativeEffects contains lore paragraphs only (no skills)description, Trait description, and Trait traitNarrativeEffectsSee Species Consistency Rules for the full requirements.
For detailed documentation, see traits-reference.md.