完整世界文件模式
世界是角色扮演根目录 worlds/ 下的一层文件夹。格式尽量兼容 world-simulation-engine 的导出格式,差异会明确说明。未列出的字段会被忽略,以便文件携带新版本数据。字段缺失、null 和空字符串都表示未设置。缺少预期文件的文件夹、普通文件和符号链接会跳过。
worlds/<world folder>/
world.json
calendar.json
characters/<character folder>/character.json
factions/<faction folder>/faction.json
locations/<location folder>/location.json
items/<item folder>/item.json
lore/<lore id>/lore.json
plots.json
variables.json
triggers.json
world.json
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 世界的稳定身份,最多 100 字符,在全部世界中唯一。会话通过它引用世界。缺失时首次读取会生成并写回,之后保持不变。重复 ID 会报告,后出现的世界不列出。 |
name | string | 必填。 |
description | string | 世界卡片的提示说明。 |
opening_message | string 或列表 | 可选开场。纯文本视为一段旁白;列表按阅读顺序包含 { "type": "narration", "text": "..." } 或 { "type": "utterance", "character": "<character id>", "text": "..." }。省略 type 表示旁白。角色必须存在。会话在玩家输入前直接写入该内容,不调用模型。 |
alternate_openings | 列表 | 其他可选开场,每项为 {title, text, character?};character 是某个可扮演角色的 id,带它的开场只提供给扮演该角色的玩家。开始会话时选择,写为首个完成回合。 |
starting_time | ISO 8601 字符串 | 模拟故事起点。无偏移或 Z 时按 time_zone 的墙上时间解释,只有日期时为当天午夜。缺失则从创建会话的时刻开始。 |
rules | 字符串或字符串列表 | 世界禁止事项,最多 30 条,每条最多 300 字符。开始会话时复制,主持人每回合都能看到;违反规则的玩家行动在故事内失败,违反规则的 OOC 命令被拒绝。 |
time_zone | string | IANA 时区,默认 UTC。现实模式未在设置中指定时区时使用计算机时区。 |
author | object | name 必填,url 可选。作者嵌入此处,不使用独立 author.json。 |
metadata.tags | 字符串列表 | 目录标签。 |
cover_media_id | string | 在 media/manifest.jsonl 中按 id 查找 file。文件必须位于世界内,格式为 png、jpg、jpeg、webp、gif 或 avif。缺失时显示占位图。 |
lorebooks | string[] | 可选,资料库中世界书的名称(字母、数字、-、_)。除非开始请求给出自己的列表(空列表表示不带任何世界书),该世界的会话以它们开始。资料库中没有该名称不会阻止开始,但会告知玩家。 |
sampling | object | 可选,世界为其故事建议的采样设置:master 与 characters(温度,0 到 2)、topP、topK、minP、frequencyPenalty、presencePenalty、repetitionPenalty。故事开始时复制进它的设置,优先级低于预设自带的值和开始请求中的选择;需要精确的辅助者不会采用它。 |
preset | string | 可选,资料库中预设的名称(字母、数字、-、_)。除非开始请求选择其他预设或 none,该世界的会话以它开始。资料库中没有该名称不会阻止开始,但会告知玩家。 |
narration_voice | string | 旁白的提供方声音 ID。开始会话时复制,之后可按会话修改。 |
variables | object | 世界范围变量的初值,以变量键为属性。 |
calendar.json
该可选文件定义世界节日及季节所依据的半球。hemisphere 为 north 或 south,默认 north。holidays 最多 60 项, 每项包含唯一的 id、显示 name 和非空 on 日期标记列表。ID 最多 60 字符,由字母、数字、- 和 _ 组成。
on 可使用 mon 到 sun、jan 到 dec、年度日期 12-24、一次性日期 1912-09-21、日期区间、dom:1 或 dom:last、nth:mon:1 或 nth:fri:last、season:winter 以及 ! 排除项。节日定义不能引用 holiday:,避免循环。日程和触发器可通过 holiday:<id> 使用已定义节日。开始会话时日历复制到会话元数据。
characters/<folder>/character.json
每个角色一份文件。定义在游玩中不变,start 表示故事刚开始后的存档点;后续状态只保存在会话中。
定义
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id | string | 文件夹名 | 世界内唯一,最多 100 字符,用于世界文件间引用。导入会映射为内部 ID。 |
name | string | 必填。 | |
aliases | 字符串列表 | [] | 昵称和其他称呼。头衔由角色行为体现,不列在此处。 |
age | string 或 number | 未设置 | 可用自由文本。 |
gender、pronouns | string | 未设置 | 代词可与性别不同。 |
kind | person 或 group | person | group 表示作为一个参与者行动的群体或组织。 |
tier | principal、supporting、background | principal | 主角自主行动;配角在场景涉及它时行动;背景角色只在世界变化时反应。 |
role | playable 或 npc | npc | 世界可提供多个可扮演角色。playable 必须是 person 且不能为 background。 |
summary | string | 列表与预览使用的一两句话。 | |
personality、background、appearance | string | 分别保存性格、经历和外观。 | |
speech.style | string | 语域、节奏和语言习惯。 | |
speech.examples | 字符串列表 | [] | 示例台词。 |
voice | string | 未设置 | 角色发言的提供方声音 ID。 |
visual_identity | object | 未设置 | 稳定、与提供方无关的外观。description 必填,可选 tags、negative_tags 和会话内全局唯一的 global_id。不包含当前表情、衣着、活动或环境。 |
start
| 字段 | 类型 | 说明 |
|---|---|---|
public_state | string | 在场者可观察或推断的状态。 |
inner_state | string | 只有角色自己知道的思想和感受。 |
activity | string | 角色实际正在做什么,可与表面状态不同。 |
emotion.baseline | object | valence、arousal、dominance,各为 -1 到 1,默认 0。存在 emotion 时必填。 |
emotion.immediate | object | 当前情绪,同一结构;缺失时等于 baseline。 |
location | string | 初始地点 ID;缺失时角色尚无位置。 |
position | string | 地点内的文字位置,需要 location。 |
feature | string | 所在地点的特征 ID,需要 location。 |
intents | 列表 | 角色驱动力,格式见下文。 |
variables | object | 角色范围变量初值。 |
relationships
可选列表描述本角色指向其他角色的单向看法。另一方向在对方文件中另行定义,也可以不存在。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
to | string | 必填,另一角色 ID,每个目标最多一项。 | |
label | string | 必填,一两个词,如 sister、rival。 | |
summary | string | 关系来源和当前状态。 | |
familiarity | 0 到 1 | 0 | 从陌生到亲密。 |
trust | -1 到 1 | 0 | 从不信任到完全信任。 |
affinity | -1 到 1 | 0 | 从厌恶到喜爱。 |
tension | 0 到 1 | 0 | 当前紧张程度。 |
每个角色最多 60 项。没有关系表示该角色不知道对方存在。仅知道存在时可用 familiarity 为 0 的中性关系。游玩中见面会建立中性 acquaintance,之后事件可改变标签和印象。
knowledge
可选对象列出角色在开场时知道的非角色实体。知识采用闭世界模型,只表示能识别,不透露当前位置、持有者、内容、在场者或状态,也不会传递展开。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
locations | ID 列表 | [] | 已知地点。起始地点及其可见目的地会自动获知。 |
items | ID 列表 | [] | 已知物品。起始地点的可见物和携带物会自动获知。 |
exits | 对象列表 | [] | { "from", "to" } 的有向通路,必须有对应世界出口。起始地点可见出口自动获知。 |
lore | ID 列表 | [] | 角色设定查询可返回的规范条目。 |
factions/<folder>/faction.json
阵营是具有机构状态和策略的持久组织,不是场景演员。需要让巡逻队、人群或委员会在场景中发言行动时,应使用 kind: "group" 的角色。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id | string | 文件夹名 | 世界内稳定。 |
name | string | 必填。 | |
aliases | 字符串列表 | [] | 其他检索名称。 |
summary、description | string | 简短与详细机构描述。 | |
values | 字符串列表 | [] | 组织声称或遵循的原则。 |
structure | string | 组织与领导方式。 | |
start.public_state | string | 可公开观察的机构状态。 | |
start.inner_state | string | 私下压力、争议或政策,不表示集体意识。 | |
start.goals | intent 列表 | [] | 战略目标,只影响成员,不代替成员行动。 |
members | 列表 | [] | character 必填,另可含 role、rank、status、public 和 0 到 1 的 commitment。status 为 active、inactive 或 former,public 默认 true。 |
relationships | 列表 | [] | 阵营出发的单向关系。to 为 { "kind": "character" 或 "faction", "id": "..." },其余字段同角色关系。 |
成员关系与外界是否知晓分开。成员会中性地知道所属阵营,其他人是否知道其成员身份由感知和记忆决定。阵营关系始终有方向。
意图
| 字段 | 类型 | 默认值 |
|---|---|---|
name | string | 必填 |
description | string | 空 |
type | need、obligation、quest、agenda、aspiration、relationship、habit、reaction | agenda |
status | active、paused、completed、failed、abandoned | active |
horizon | immediate、short、day、long、open_ended | short |
priority、urgency | 0 到 1 | 0.5 |
plan、open_threads、constraints | 字符串列表 | [] |
deadline | ISO 8601 日期或日期时间 | 未设置 |
variables.json 与初值
可选列表声明故事需要额外跟踪的值。内建情绪变量为 valence、arousal、dominance。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
key | string | 必填,以字母开头,只含小写字母、数字和 _。 | |
name、description | string | name 必填。 | |
kind | number、flag、choice | number | |
subject | character、item、location、world | character | 每个值的对象;world 只有一个全局值。 |
only | ID 列表 | 全部 | 限定可使用该变量的对象。 |
min、max、integer | 数值设置 | 数字边界及是否只允许整数。 | |
options | 字符串列表 | choice 的 2 到 12 个选项。 | |
default | 对应值 | 0、false 或第一选项 | 未修改时的值。 |
baseline | boolean | false | 是否同时保存基线。 |
visibility | public、private、hidden | public | private 只适用于角色变量。 |
bands | {up_to, label} 列表 | 按上限从低到高定义数字范围名称。 | |
always | boolean | false | 即使等于默认值也显示。 |
可在此重写内建变量的名称、描述、分段和可见性,但不能改变其本质。初值写在 character.json、item.json、location.json 或 world.json 的 variables 对象中。角色的 start.emotion 设置三个情绪变量的基线和当前值。
routine
character.json 的可选日程是按顺序匹配的时间窗,第一个匹配项生效。没有日程的角色停留原处,必要时世界作者可在游玩中补充。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
days | mon 到 sun 列表 | 每天 | 跨午夜时间窗属于开始的那一天。 |
on | 日期标记列表 | 每天 | 月份、日期、区间、每月日期、月内第几个星期、季节、节日及 ! 排除项;与 days 同时满足。 |
from、to | HH:MM | 必填。to 早于 from 表示跨午夜,相等表示空窗。 | |
activity | string | 必填。 | |
location、feature、position | string | 地点、特征及文字位置;feature 需要 location。 | |
interruptible | boolean | true | 是否会为临时事件中断日程。 |
每个角色最多 24 个时间窗,按对话时区解释。
locations/<folder>/location.json
世界可以没有地点,此时所有人视为在一起。每个地点 最多 30 个特征和 30 个出口,世界最多 500 个地点。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id | string | 文件夹名 | 世界内唯一。 |
name | string | 必填。 | |
description | string | 告知所有在场者。 | |
visual_identity | object | 未设置 | 与角色相同结构。 |
parent | string | 无 | 容纳该地点的地点 ID,只表达包含关系,不表达通路,不能成环。 |
features | 列表 | [] | {id, name, description}。ID 只含字母、数字、-、_,在地点内唯一。每次最多向模型提供 12 个。 |
exits | 列表 | [] | 离开此地的有向通路。 |
variables | object | {} | 地点变量初值。 |
出口的 to 必填。还可含 description、one_way、back_description、整数 travel_time_seconds(按日程前往某处的角色,要等沿途开放通路所需的时间过去才算到达;玩家的行程决定一轮至少多长)、state、note 和 opened_by。one_way 默认 false,会自动生成反向通路。state 为 open、locked 或 blocked,默认 open。锁定出口的 opened_by 最多十个物品 ID,并作用于两个方向。角色通常只能沿开放出口移动;故事强制搬运可绕过。开始会话时地点复制到数据库,后续变化不修改世界文件。
items/<folder>/item.json
所有可移动、持有、穿戴、打开或使用的实体都使用 item。不可移动的桌子和窗户应建为地点特征。世界最多 2000 个物品。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id | string | 文件夹名 | 世界内唯一。 |
name | string | 必填。 | |
description | string | ||
visual_identity | object | 未设置 | 与角色相同结构。 |
quantity | 正整数 | 1 | 可堆叠物品数量。 |
unique | boolean | false | 唯一物品不能拆分或合并,也没有 quantity。 |
quality | string | 文字状况。 | |
notable | boolean | false | 重要物品优先显示,不从短列表省略。 |
hidden | boolean | false | 找到前无人可见。 |
wearable | string | 穿戴槽位 ID。 | |
container | object | state 为 open、closed 或 locked,默认 closed;opened_by 最多十个开启物品 ID。 | |
owner | string | 所有者角色 ID,与当前持有者分开。 | |
variables | object | {} | 物品变量初值。 |
物品必须且只能以一种方式开始:location,可带 position 和 feature