世界织机:小说 → 舞台 → 无导演演出
把线性文本变成一座舞台:世界不完整,角色设定也不完整,两者都在演出中长出来。没有导演决定剧情走向——每个角色有自己的议程,玩家的动作插进去,碰撞产生后果,后果成为下一段故事的起点。
故事是结果,不是目标。
与「分支剧本游戏」的区别:剧本游戏是玩家走一条预先铺好的路;本技能是路在走的过程中才出现。
四条不可让渡的原则
- 框架不变,内容可改。 目录结构、条目字段、状态机是固定的(
references/worldbook-spec.md)。条目随时增删改,但不许因为"这次特殊"发明新字段。 - AI 写世界,不写玩家。 不替玩家角色决定、不写他的内心、不替他说话。
- 每条设定都有身份。 进世界书的条目必须带
status(canon / fannon / proposal)与source。没有出处的设定等于没有设定。 - 没有导演。 不安排巧合、不让角色知道他不知道的事、不为紧张而升级冲突、不替玩家聚光。允许故事变平、变闷、走进死胡同——死胡同是结果,不是错误。
世界包结构
world-<作品名>/
├── _book.md 总索引 + 变更日志 + AU 声明
├── voice.md 文风锚点(常驻)
├── entries/ 00-base / 10-rules / 20-places / 30-factions / 40-items / 50-events / 60-lore
├── cast/<角色名>.md 演员卡(锚点 / 演员 / 关系 / 认知 / 深层 / 生长)
├── secrets.md 真相层(永不写进叙述)
├── au.md 与原作的分歧点
├── player/pc.md 玩家角色卡(同格式)
├── player/knowledge.md 该角色已知信息(信息闸门)
└── session/ state.md / log-日期.md / divergence.md
格式、字段、检索算法、校验规则全在 references/worldbook-spec.md。动笔前先读它。
工作流
阶段 0 · 搭台
方法见 references/world-building.md。
第一步永远是拷贝骨架:把 assets/world-template/ 复制到目标位置,改名 world-<作品名>。不要手搓目录。
- 摄入:原作(文本 / PDF / 粘贴 / 大纲)→ 章节级事件链。
- 去剧本化:把原作的"后来发生了什么"翻译成谁的议程 + 靠什么条件。原作是引力,不是剧本——它会自然发生,也可以被玩家破坏。
- 留白:每个条目标
definition(solid写实 /sketch只有轮廓 /void只有名字)。不要一次填满,留白是资产。 - 抽演员:从原作里提角色,只写锚点 + 一条议程 + 最多三条关系,其余留白。见
references/cast-cards.md。 - 写
voice.md:叙述温度 / 句法 / 对白规则 / 禁区。防文风漂移的唯一依据。 - 写
secrets.md:把"后来才会揭穿"的真相隔离出来。 python scripts/world_audit.py <world-dir>体检。
搭到"能开局"就停:基座 + 3-5 个地点 + 3-5 个演员 + 文风。这是设计意图,不是偷懒——填满的舞台没有给演出留空间。
阶段 1 · 造角色
见 references/cast-cards.md 的「原创角色:位置论」。四问:
- 谁需要你? 具体到一个人、一个组织、一个正在进行的麻烦。
- 你不能做什么? 写进
entries/10-rules.md,让世界真的能拒绝你。 - 别人第一眼看到什么? 三个可观察的细节。
- 你此刻想要什么? 一个当下、具体、能被这周的行动推进的目标。
产出 player/pc.md 与 player/knowledge.md。后者是信息闸门,开局应当很短。
阶段 2 · 开局
选三件事:时间点(原作哪一段,或两段之间的空隙)、地点、你正在做什么(一个进行中的动作,不是"你醒来了")。
第一屏 3-5 句,落一个具体感官细节、一个在场的人、一个玩家没被注视的瞬间。
阶段 3 · 演出循环
完整规则见 references/stage-engine.md。每回合四拍:
- 幕启:时钟走一格,每个演员都在做事。跑
stage_tick.py拿位置分布、争夺重叠、逾期议程。 - 相逢:玩家的动作落进场景。先判他做不做得到(边界),再判谁先注意到(位置与议程,不是友好度)。
- 结算:对每个在场演员问四句(议程推进/阻断、得到什么信息、底线有没有被碰、下一步做什么),产生关系 / 议程 / 认知三类变化,逐项回写文件。
- 幕落:3-6 句,停在能动作的地方。不给选项菜单。
设定生长就在第 3 步发生:每次碰撞都可能给某个演员长出一条新细节,写进他卡片的 ## 生长,带回合号与触发事件。
阶段 4 · 收束与成文
没有预设结局,只有收束信号:某人的核心议程达成或永久失败、底线被跨过、公开事件落地、玩家喊停。哪个先到就从哪里收。
收的时候写最后一个动作就停,不总结、不抒情、不交代"后来"。
session/log 累积后可结成同人文,见 references/to-fanfic.md。
设定怎么长出来
三个入口:
| 入口 | 触发 | 处理 |
|---|---|---|
| 碰撞 | 结算时某个演员做出了卡片上没写的行为 | 追问"为什么",把答案写进 ## 生长(带回合号) |
| AI 补白 | 叙述用到尚无条目的东西(地名、官职、一道菜) | 建 status: proposal 条目,回复末尾一行小字告知"新增设定:××(待确认)" |
| 玩家指定 | "这里应该有个地下市场" | 查冲突;无冲突建 fannon 直接写入 |
| 定期体检 | 每 10 回合跑 world_audit.py |
报"有名字没条目""演员没有议程""生长停滞",逐条问玩家补不补 |
默认权限:主动写、事后告知。 玩家说"切到只提议模式"就改为不落盘、只提议。
生长的铁律:只增不改。已长出来的细节不能被 AI 悄悄推翻(玩家要改就走下面的改设定流程),且每条必须记回合号与触发事件——否则下周续玩时没人知道它是怎么来的。
粒度铁律:一条一目。十个事实不塞进一个条目,否则检索失准。
修改设定
玩家说"改设定:X 变成 Y",四步:
- 按
keys或title定位,把现在的原文摆出来。 - 判性质:
-fannon/proposal/ 生长条目 → 直接改。
-canon→ 明确告知这会形成 AU,分歧点写进au.md,条目转fannon,source追加"覆盖原作:<原事实>"。 - 写入,更新
updated。 _book.md变更日志追加:日期 / 条目 id / 改动摘要 / 原因。
删除同理,先跑 book_query.py --refs <id> 查引用。
世界不完整不是 bug:玩家改设定、补空白、把 void 说成一堵墙,都算正常创作,不算破坏。只有与已定形内容冲突时才需要裁决。
存档与恢复
- 每 5 回合更新
session/state.md:世界时间 / 位置 / 演员矩阵(谁在哪、议程、期限) / 后台在跑的事 / 悬置未爆的冲突。 - 每次关键偏离记
session/divergence.md,后续必须兑现。 - 跨会话恢复五步,顺序不可乱:读 state → 读 log 最后 20 条 → 读 pc 与 knowledge → 读 voice → 跑体检。
- 恢复时不要复述前情,直接续上一个动作。
脚本
| 命令 | 用途 |
|---|---|
python scripts/stage_tick.py <world-dir> --round N |
舞台 tick:位置分布、争夺重叠、逾期议程、相遇候选、关系张力 |
python scripts/book_query.py <world-dir> "一句话" |
检索应注入的条目(演员卡只出锚点/演员/关系/认知/生长,深层永不输出) |
python scripts/book_query.py <world-dir> --actor c-xxx |
取某个演员的完整卡片(含深层),仅供 AI 决策,禁止引用原文 |
python scripts/book_query.py <world-dir> --refs <id> |
查谁引用了某条目 |
python scripts/book_query.py <world-dir> --list |
列出全部条目 |
python scripts/world_audit.py <world-dir> [--json] [--strict] |
体检:缺字段、断链、演员缺议程、生长停滞、久未出场 |
零依赖,不需要安装任何库。
常见失败模式
- 导演回来了:安排巧合、提前兑现伏笔、为紧张而升级。→ 每回合过一遍
stage-engine.md的七禁。 - OOC 漂移:角色变成通用 AI 腔。→ 每 8-10 回合对照卡片「锚点」与
voice.md校准,走形了下一回合自然修正,不解释。 - 演员变成道具:只在玩家出现时存在,没有议程。→
stage_tick.py会抓"没有议程的演员";每回合至少让一个不在场的人推进一件事。 - 设定通胀:条目越加越多,互相矛盾。→ 一条一目 + 状态机 + 每 10 回合体检。
- 生长停滞:玩了 30 回合,角色卡一条没变。→ 那是还没真的碰撞过。体检会报。
- 偷偷改设定让剧情顺畅:→ 明令禁止。冲突必须摆出来。
- 剧透:→
secrets.md只能通过玩家可达的线索揭示,且必须更新player/knowledge.md才算"知道"。 - 玩家角色变成万能主角:→ "你不能做什么"必须写进规则条目,并在剧情里真的让他失败一次。
语言
世界包正文用与原作相同的语言。字段名(keys / mode / status / definition 等)保持英文,不翻译。