序章与开局
配置分支序章、可玩角色、AI 队友和预写或 AI 开场。
本页目录
序章与开局方案写在 module.toml 或 module.json;角色自建流程写在对应类型定义中,见阶段式建卡。先完成最小模组,再按下面的规则扩展。
区分序章、建卡与正式开场
| 要做的事 | 配置位置 | 选择依据 |
|---|---|---|
| 选角前介绍背景或进行序章分支 | preludeFlow |
答案控制序章,不自动成为角色属性或全局状态 |
| 确定可选预设、角色类型和开局背景 | gameStarts |
多个入口确实改变起始条件时才提供多个方案 |
| 生成和填写角色初始值 | 角色类型的 creationFlow.workbench |
按明确任务生成,不能靠开场台词或主持临场补出建卡流程 |
| 介绍已确认队伍的眼前局势 | opening |
固定准确台词用 scripted,需要结合实际队伍生成叙事时用 ai |
| 一次性检查或补充开局状态 | opening.instructions |
先核对现状,避免重复发放;不会成为每轮主持规则 |
| 后续持续的查阅与裁定约定 | hostPrompt 与对应规则文档 |
不依赖一次性初始化指令维持整场规则 |
预设角色适合固定关系、入场速度重要或能力需要事先配合剧情的模组。如果选择身份和能力本身就是模组体验的一部分,则适合提供自建角色;也可同时支持,两类角色都要满足字段、资源和剧情入场要求。不能只设置 allowCreate: true 而省略工作台,也不能禁止自建却没有可用预设。
开局背景写在方案简介和开场叙述中。初始位置等玩法事实保存在模组自定义文档;不同方案需要不同初值时,在 opening.instructions 中要求主持读取并保存对应字段,见自定义游戏状态。预写开场中的事件不自动更新游戏状态;开场中已经发生的事实应与保存值一致。人物专属开场和 AI 队友指令也要检查知识范围,不能让某个未选择的角色成为故事成立的隐含前提。
配置开局方案
以下是一个开局方案的完整片段。沿用最小模组时,先复制阿青的角色文档为 character/林舟.toml,将其中的 name 改成“林舟”,保留有效的字段值。
在 module.toml 中保留顶层的 name、description,用下面的内容替换原来的整个 [[gameStarts]] 方案及其子表。这里仍使用 id = "river",直接追加会造成 ID 重复。已有多个方案时,只替换要修改的那个方案;新增方案须使用不同 ID。
[[gameStarts]]id = "river"name = "河岸寻人"description = "从渡口出发,寻找失踪的船夫。"characterTypeIds = ["character"]playablePaths = ["character/阿青", "character/林舟"]allowCreate = false
[gameStarts.aiCompanions]"character/林舟" = "扮演谨慎的林舟。讨论计划时提醒同伴留意水面;先声明行动意图,等待主持裁定。"
[gameStarts.opening]mode = "scripted"instructions = ""
[[gameStarts.opening.beats]]text = "渡口的雾散了,船夫仍没有回来。"
[[gameStarts.opening.beats]]text = '''<message npc path="character/林舟" name="林舟">我们沿着河岸找找吧。</message>'''| 字段 | 规则 |
|---|---|
id |
模组内唯一,最长 80 字符,使用字母、数字、下划线或连字符 |
name、description |
方案名称必填,最长 100 字符;简介可省略,最长 2000 字符 |
characterTypeIds |
至少一种已声明为 character 的类型 |
playablePaths |
允许真人或 AI 选择的预设角色,须属于上述类型;默认空列表 |
allowCreate |
默认 true;为 true 时至少一个角色类型须有建卡工作台;为 false 时必须提供预设角色 |
aiCompanions |
可省略的角色路径到扮演指令映射;键必须来自 playablePaths,指令为 1–8000 字符 |
opening |
必填,选择 scripted 或 ai |
gameStarts 支持 1–30 个方案。路径从模组根目录出发,通常带类型名并省略文件扩展名;格式规则见文档类型与字段。同一文档身份不能重复配置 AI 队友。未写扮演指令的角色只能给真人选择。
只有一个开局时,应用直接采用该方案;多个开局时先展示简介,再由玩家选择。首次确认角色后,开局方案锁定。锁定前切换方案会清除受影响的未确认建卡进度。
角色确认后,如果仍有未占用且支持 AI 扮演的角色,首次确认角色的玩家选择添加同伴或独自开始;组队完成后才正式开场。真人和 AI 共用角色占用规则。后续队友设置与互动见AI 队友。
开发者手动验收:完成后新建冒险,选择阿青并确认,应出现添加 AI 队友的提示;选择林舟作为队友后,再看到两条开场消息。
预写开场与专属开场
mode = "scripted" 必须提供非空通用 beats,最多 100 条。每条包含 1–10000 字符的 text。正文与 AI 回复使用相同的说话人标签,每个分段是一条独立消息;没有标签的正文作为主持旁白,空行只分段落。
opening.overrides 可用预设角色路径作为键,提供该角色的专属 beats。键须属于 playablePaths,每份专属版本包含 1–100 条;自建角色使用通用版本。例如,在上例之后追加:
[[gameStarts.opening.overrides."character/阿青"]]text = "你认出岸边的绳结,那是船夫常用的打法。"旁白与 NPC 台词
选角前序章的介绍正文、开局方案简介和选角后的预写开场都支持下面的格式;AI 开场及后续主持回复也使用同一协议:
<message narrator>你推开酒馆的大门,雨水顺着衣角滴落。</message><message npc path="character/酒馆老板" name="陌生男人">门关上,外面冷。</message><message narrator>他放下手里的抹布。</message><message narrator>你们打算怎么做?</message>标签独占一行。path 必须指向模组内现有的角色文档,保留类型目录、分组路径和文档名称;可省略 .json/.toml/.md 格式扩展名。不要使用绝对路径或 ..。name 是可选的公开称呼,省略时显示玩家可见资料中的名称;资料不可见或无法关联时显示 NPC 占位符。路径用于关联身份,不作为台词展示,头像和资料入口仍受玩家可见性限制。
同一 NPC 的不同称呼不会改变其身份。NPC、AI 队友和预写台词都按角色文档路径匹配模组音色。示例角色需先创建相应文档。
预写内容按分段顺序播完,问句本身不会创建中途选择或暂停步骤。需要玩家在序章中选择时使用 preludeFlow 的问答节点;正式开场的行动邀请放在最后。
AI 开场与初始化
使用 AI 开场时,用下面的片段替换该方案的整个 opening 配置,连同已有的 beats 与 overrides 子表一并移除:
[gameStarts.opening]mode = "ai"prompt = "从河岸清晨开始,结合已经确认的小队介绍渡口的异常,最后询问玩家下一步行动。"instructions = "先查阅世界状态和已确认角色,按规则核对初始资源;不要重复给已经拥有的装备。"prompt 在 AI 模式下必填,最长 10000 字符。instructions 是可选的一次性初始化指令,最长 10000 字符,可用于检查和更新角色或世界状态,不会自动加入后续每轮主持提示。
预写模式也支持 instructions:先完成初始化,再发布 beats。有初始化指令时需要配置模型;没有初始化指令的纯预写开场不需要模型。AI 模式把初始化与叙事放在同一个主持回合中。
位置、参与者、资源等状态由模组定义,平台不会自动创建场景或安排角色入场。需要初始化时,应在 instructions 中说明状态字段、前提和已完成步骤的识别方式,见自定义游戏状态。停止或失败不会撤销已经写入的游戏数据,作者编写 instructions 时应注明资源授予的前提,避免对已有资源再次授予。
分支序章
preludeFlow.steps 位于模组元配置顶层,最多 100 步,在选开局和角色之前执行。序章答案用于序章流程,不直接写入角色字段;需要写入角色卡的回答应配置在建卡任务中。
下面只展示顶层 preludeFlow 属性,不是完整的 module.json 文件。使用 JSON 元配置时,把它合并进现有文件,保留 name、description 和 gameStarts;已用 TOML 时,将同一结构转换为 TOML,或先把整份元配置转换为 JSON,不能同时保留两份元配置。
{ "preludeFlow": { "steps": [ { "id": "welcome", "type": "introduction", "title": "渡口", "body": "天刚亮,你来到渡口。" }, { "id": "route", "type": "choice", "title": "你先观察哪里?", "options": [ { "id": "bank", "label": "河岸", "value": "河岸", "next": "bank" }, { "id": "pier", "label": "栈桥", "value": "栈桥", "next": "pier" } ] }, { "id": "bank", "type": "introduction", "title": "河岸", "body": "泥里留着两串脚印。", "next": "$end" }, { "id": "pier", "type": "introduction", "title": "栈桥", "body": "木桩上系着半截绳子。", "next": "$end" } ] }}type |
内容 |
|---|---|
introduction |
展示 body,不要求回答 |
shortText、longText |
单行或多行文字回答 |
number |
有限数值回答 |
choice |
单选,选项保存值可为字符串或数值,可按选项跳转 |
multiChoice |
多选,保存值必须是字符串,不允许重复 |
开发者手动新建冒险后,应先看到“天刚亮”的介绍和观察地点的选择。选择河岸只出现脚印描述,选择栈桥只出现绳子描述,然后进入选角。
每步需要唯一 id 和 1–120 字符的 title;body 最长 10000 字符,required 默认 true。next 默认前往数组中的下一步,$end 结束序章,只能跳转到后续存在的步骤。单选优先采用选项的 next,再采用步骤的 next;多选不按单个选项分支。
options 中每项需要唯一 id、非空 label 和不重复的 value。也可以用 optionTypeId 从某类文档生成选项,保存不带扩展名的文档标识;optionRoutes 以文档路径为键指定单选分支。来源类型必须有可用文档,分支引用必须存在。
检查完整流程
修改配置后,用CLI检查引用和流程,再由开发者手动新建冒险,走完序章分支、开局选择、预设选角或自建、组队和开场。已有冒险继续使用自己的模组副本,可同步资料更新,但不会重播已完成的开场。当前选角和建卡属于开局流程,确认角色后不能通过主持工具重新进入选角或创建替补角色;想换身份从头体验时,新建冒险并重新选角或建卡。