Settings
Edit tabs/settings.json.
Power Level Framework
Characters progress through four power levels based on skill proficiency:
| Power Level | Skill Range | Experience |
|---|---|---|
| I | 1-10 | Fails almost every roll - training arc |
| II | 10-30 | Fails most rolls - underdog experience |
| III | 30-40 | Succeeds most rolls - capable hero |
| IV | 40-60 | Succeeds almost always - master |
The balanced values below support this progression curve.
Required Fields by Category
Attribute Settings
| Field | Balanced Value | Notes |
|---|---|---|
startingAttributeValue | 0 | Traits determine attributes, not point-buy |
startingAttributePoints | 0 | No point allocation |
maxStartingAttribute | 0 | No hard cap (traits handle limits) |
attributeBonusModifier | 2.5 | Each attribute point = +2.5 to checks |
lowAttributeThreshold | 8 | Below this grants weakness traits |
Skill Settings
| Field | Balanced Value | Notes |
|---|---|---|
trainingCooldown | 10 | Ticks between training opportunities |
skillBonusModifier | 1 | Each skill level = +1 to checks |
maxSkillLevel | 999 | Effectively uncapped |
maxSkillSuccessLevel | 999 | Cap on the absolute contribution any single skill, attribute, ability, random roll, or context modifier can make to a success check |
startingXPToLevelUpSkill | 50 | Fast early progression |
additionalXPRequiredPerSkillLevel | 50 | Consistent XP increase per level |
baseXPFromSkillUpgrade | 100 | Bonus XP when skills level up |
charXPPerSkillLevel | 100 | Character XP from skill progression |
baseChanceToLearnNewSkill | 1 | Use 1 if world allows learning new skills, 0 if fixed |
skillLearningBonusModifier | 1 | Use 1 if world allows learning new skills, 0 if fixed |
xpFromNewSkill | 200 | Character XP when learning a new skill |
newSkillGenerationEnabled | true | Allow the AI to invent skills not in the config; false restricts characters to predefined skills |
Skill XP Rewards
| Field | Balanced Value |
|---|---|
skillXPRewards.small | 50 |
skillXPRewards.medium | 100 |
skillXPRewards.large | 150 |
skillXPRewards.huge | 200 |
Location Settings
| Field | Balanced Value | Notes |
|---|---|---|
regionSize | 100 | 100km regions. Every location’s x/y must sit within half the region size of the origin (within 50km at the balanced value) |
simpleRadius | 5 | 5km simple interaction radius |
complexRadius | 10 | 10km complex interaction radius |
avgTravelDistance | 40 | 40km average between locations |
minTravelDistance | 20 | 20km minimum between locations |
regionLocationCount | 0 | Designer defines per world |
encountersEnabled | false | Enable random wilderness encounters during travel |
regionMapBorderFeatheringEnabled | false | Feathered border / rounded frame treatment on region map images. Defaults to false; set true to enable |
Item Settings
| Field | Balanced Value | Notes |
|---|---|---|
startingItems | [] | Starting items come from traits |
Combat Settings
| Field | Balanced Value | Notes |
|---|---|---|
baseCombatXP | 200 | Combat is rewarding |
minCombatXP | 50 | Trivial fights still meaningful |
abilityCooldown | 0 | Cooldown for AI-generated (learned) abilities + throttle on learning new ones; does not affect predefined abilities |
abilityBonus | 10 | Default bonus for AI-generated (learned) abilities; does not scale predefined abilities |
npcDailyHealingAmount | 999 | NPCs fully heal daily |
NPC Health (otherSettings)
| Field | Balanced Value | Notes |
|---|---|---|
npcHealthPerLevel | 10 | NPC HP per level |
npcMinHealth | 0 | NPC base HP |
Player HP scaling lives on the health resource (
resourceSettings.health.maxValueandgainPerLevel), not inotherSettings. See the ai-instructions skill for the Resource schema.
Character Progression (progressionSettings)
Required section. Character XP and level-up configuration lives here (legacy configs with XP fields in otherSettings migrate automatically).
| Field | Balanced Value | Notes |
|---|---|---|
startingCharacterLevelUpRequirement | 500 | Base XP for first level |
extraRequiredXPPerCharacterLevel | 100 | +100 XP per level; 0 = flat curve (only field allowed to be 0) |
maxCharacterLevel | 999 | Effectively uncapped |
abilityPointEveryLevels | 1 | Grant ability points every N levels |
abilityPointsPerGrant | 1 | Ability points per grant (1/1 = one per level) |
attributePointEveryLevels | 5 | Grant attribute points every N levels |
attributePointsPerGrant | 1 | Attribute points per grant |
maxAttributeValue | 999 | Cap on attributes raised by spending points |
traitPickEveryLevels | 10 | Grant trait picks every N levels |
traitPicksPerGrant | 1 | Trait picks per grant |
locationDiscoveryXP | 10 | XP per party member on first entering an area |
levelUpTraitPool | [] | Trait names offered on level-up picks — empty means no trait picks are ever granted; entries must name existing traits (see the traits skill) |
milestoneTitles | defaults | { levelGranted, title }[] — titles granted when a level is hit exactly; levels unique positive integers, titles non-blank |
All numeric fields must be positive whole numbers except extraRequiredXPPerCharacterLevel (non-negative).
World-Specific Fields
These must be configured per-world:
| Field | Guidance |
|---|---|
attributeSettings.attributeNames | Thematic attribute names for the world |
attributeSettings.lowAttributeTraits | See lowAttributeTraits format below |
attributeSettings.attributeStatModifiers | Only where narratively sensible (e.g., Constitution to Health) |
attributeSettings.attributeDamageModifiers | Optional. Per-point % bonus to outgoing damage, keyed by attribute (e.g. { strength: 1 } = +1% damage per point). Positive values only |
attributeSettings.attributeDamageReductionModifiers | Optional. Per-point % reduction to incoming damage, keyed by attribute (e.g. { dexterity: 1 } = -1% damage taken per point). Positive values only |
skillSettings.skillTypeDifficultyBonus | Always include "none": 0, others creative |
itemSettings.currencyName | Thematic currency name |
itemSettings.itemCategories | Always include "Armor", "Consumable", plus world-specific |
itemSettings.itemSlots | World-specific |
combatSettings.damageTypes | Types that fit world theme |
combatSettings.damageTypePresentation | Required (use {} for none). Keyed by damage type, each entry { emoji } sets the emoji shown for that damage type in the UI. Emoji characters only, no text |
otherSettings.visualNovelModeByDefault | Optional. true/false sets visual novel mode once when a player first enters the game. Leave unset to let each player’s own device preference decide |
characterCreationMusic | Optional top-level field. "fantasy" or "nonfantasy" background music for the character-creation screen. Defaults to "fantasy" |
imageModelSource | Optional top-level field. Pins which platform-provided image model renders all generated images (portraits, location/area images, region maps) while editing the world; games created from it start with this as their default but can pick their own. One of falai-gpt-image-2-low, falai-gpt-image-2, google-nano-banana-lite, google-nano-banana-pro, falai-flux-2-dev. Omit to use the platform’s current default |
worldVoices | Optional top-level field. Catalog of reusable voice presets (see worldVoices below) that NPCs and premade characters reference by worldVoiceId |
successLevelSettings | Required top-level field: the world’s outcome ladder as named score bands with narration notes; firstSuccessfulTierId marks where failure turns into success. Start from the stock ladder in the example world (Critical Failure through Critical Success) and keep it unless the world wants different outcomes. Trigger action-success-level conditions name tiers by their name |
worldVoices
Optional record of voice presets keyed by an id you choose. Each preset pairs a display label with one of the character voice tags (voiceTag), plus optional delivery instructions, a speed, and audio effects. NPCs and premade characters point at a preset with worldVoiceId; the id must exist in worldVoices. Set exposeInCharacterCreation: true on presets players may pick for their own character at character creation; presets without it can still be assigned to NPCs and premades.
effects is a partial object of sub-effects (pitch, reverb, echo, eq, distortion, output), each with an enabled flag plus its own parameters. Omit any sub-effect you do not use. The engine trims labels and tags and clamps out-of-range values (speed to 0.5-2, pitch to -12..12 semitones, mixes to 0-1, and so on), and the catalog size is capped, so keep the list to voices the world actually uses.
lowAttributeTraits Format
Each entry follows this structure: “You have a weak [domain]. [What skill types this affects]. [Effect on learning and usage].”
- Sentence 1: State the weakness plainly (“You have a weak X”)
- Sentence 2: Name the skill types powered by this attribute and state the consequence
- Sentence 3: Describe the practical effect on learning and reliability
- Reference skill/ability type names, not individual skill names
- Not every attribute needs an entry; omit attributes where a low value doesn’t make narrative sense
Schema
interface Settings {
attributeSettings: AttributeSettings
skillSettings: SkillSettings
locationSettings: LocationSettings
itemSettings: ItemSettings
combatSettings: CombatSettings
otherSettings: OtherSettings
progressionSettings: ProgressionSettings
characterCreationMusic?: 'fantasy' | 'nonfantasy'
imageModelSource?: 'falai-gpt-image-2-low' | 'falai-gpt-image-2' | 'google-nano-banana-lite' | 'google-nano-banana-pro' | 'falai-flux-2-dev'
worldVoices?: Record<string, WorldVoice>
successLevelSettings: SuccessLevelSettings
}
interface OtherSettings {
npcHealthPerLevel: number
npcMinHealth: number
visualNovelModeByDefault?: boolean
}
interface SuccessLevelSettings {
firstSuccessfulTierId: string
tiers: SuccessTier[]
}
interface SuccessTier {
id: string
name: string
minScore: number | null
maxScore: number | null
prompt: string
imageUrl?: string | null
}
interface WorldVoice {
label: string
voiceTag: string
instructions?: string
speed?: number
effects?: {
pitch?: { enabled: boolean, semitones: number }
reverb?: { enabled: boolean, space: 'room' | 'hall' | 'cavern', mix: number }
echo?: { enabled: boolean, delayMs: number, feedback: number, mix: number }
eq?: {
enabled: boolean
highPass: { enabled: boolean, frequency: number }
lowShelf: { enabled: boolean, frequency: number, gainDb: number }
bell1: { enabled: boolean, frequency: number, gainDb: number, q: number }
bell2: { enabled: boolean, frequency: number, gainDb: number, q: number }
highShelf: { enabled: boolean, frequency: number, gainDb: number }
lowPass: { enabled: boolean, frequency: number }
}
distortion?: { enabled: boolean, drive: number }
output?: { enabled: boolean, gainDb: number, compressor: boolean }
}
exposeInCharacterCreation?: boolean
}
Reference
For detailed documentation, see settings-reference.md.