基于故事大纲与世界设定,把故事细化为"网状的事件图"——声明全局状态变量 + 事件节点 + 带解锁条件的有向边,按严格 JSON 模板写入 /project/events.json。当需要生成或修订事件图时使用。
日本語の概要は準備中です。原文の説明を表示しています。
为某个事件设计"可玩的情节图"——由若干情节 beat(旁白/独白/对话/选择点)与带解锁条件的有向边组成,effects 是唯一写状态处,按严格 JSON 模板写入 /project/scenes/<event_id>.json。当需要生成或修订某个事件的内部情节时使用。
インストールする前に、エージェントに与えられる指示の中身を確認できます。
把某一个事件的内部展开成一张可玩的情节图,写入 /project/scenes/<event_id>.json。它是
"事件的内部细化",也是唯一写状态(effects)的地方:由 情节 beat + beat 之间的有向边 组成。
核心心智(务必理解,否则会建错模型):
label 是选项文案)。effects 留下不同状态,由事件层的边条件在情节结束后分流到不同的下游事件。effects 里。变量不在这里声明——它们在事件层
(events.json 的 state_variables)已全局声明,这里只引用其 id 来读(边 condition)或写(effects)。location:只能引用世界设定 locations 分类里已存在的地点卡片 id(如 loc-2),
供试玩时给情节配背景图。不得凭空造地点,相邻/同场景的 beat 尽量复用同一地点;确需新地点则提示"先补世界设定再重生成"。内容与发言人分离(重要):
dialogue(对话):content 只放纯台词,不写"某某说:"前缀、不夹旁白;说话角色写进 speaker。monologue(内心独白):content 只放纯独白内容;独白角色写进 speaker。narration(旁白):content 只放场景/动作/氛围的客观叙述,speaker 留空;不含引号台词、不写"某某说/道/点头道"。choice(选择点):content 只放一句面向玩家的提问/引导(尽量 ≤20 字,如"你如何回应?"),speaker 留空;场景铺垫与角色台词一律不写进 choice,要放到 choice 之前的独立 narration/dialogue beat。speaker 必须是 world.json 里已有设定卡片的 id(六类均可:角色、系统/其他、势力等)。先建卡再写 speaker;禁止角色名、简称或尚未存在的 id。系统、组织等非角色卡片可以发言。narration/choice(即使不带引号、不写"说:",只是用冒号或"只说/点头道"这类弱化表达夹带)——这同样违反内容与发言人分离,必须避免。判定标准:只要这句话是"某个具体角色表达的观点/条件/评价/判断",就该拆成一个独立的 dialogue beat(speaker 填该角色),narration/choice 只负责场景过渡本身、不承载任何角色的具体话。
{"kind":"narration","content":"堂叔也点头:能把小东西用在要处,就是本事。"}{"kind":"narration","content":"堂叔看你处理妥当,微微点头。"} + {"kind":"dialogue","speaker":"char-uncle","content":"能把小东西用在要处,就是本事。"}{"kind":"choice","content":"堂叔带来举荐名额:过试炼可习武吃粮,过不了也许能留个杂役差事,你如何回应?"}{"kind":"dialogue","speaker":"char-uncle","content":"若过了试炼,能习武吃粮;过不了,也许能留个杂役差事。"} + {"kind":"choice","content":"你如何回应堂叔的提议?"}规模约束(控制篇幅,别把整段小说铺进来):
read_file /project/events.json(关键:找到目标事件节点的 title/summary 作为本张情节图的内容依据;并拿到全局 state_variables 的 id/类型/取值域,供 effects/条件引用);再 read_file /project/world.json(关键:读全部六类设定卡片,speaker 只能填其中已有 id;拿 locations 里可用的地点卡片 id 供每个 beat 的 location)。若本回合主 Agent 已先写入新卡片,用新 id,不要用角色名。按需 read_file /project/intent.md(创作意图)。必要时 ls /project/materials 逐个分页读全素材(可能为空)。event_id 与标题)。本张图的 event_id 必须等于该事件节点的 id。set 写确定的
flag/enum/scalar 里程碑,不依赖未知入场状态;只有确实表达累计过程时才用 add。label,新增分叉立即检查取值域覆盖。无条件兜底是推荐而非强制。
对话/独白把说话者写进 speaker(必须是已有设定卡片 id,系统/组织等非角色也可发言),每个 beat 都从世界设定选择真实 location。若还没有对应卡片,不要用角色名凑合,在摘要里说明需先补世界设定。set/add
都遵守 min/max,add 会在运行时截断,但不能在未知当前值时把小幅累加当作必然达到门槛。/project/scenes/<event_id>.json:
write_file 创建。read_file 读全现有内容,再用 edit_file 只改该改的部分,保留其余既有内容(含用户手改),不要整体重写。/project/meta.json、events.json、world.json、outline.md;本轮只写这一个事件的情节文件。{
"event_id": "ev-master",
"beats": [
{ "id": "b-open", "kind": "narration", "speaker": "", "location": "loc-1", "content": "你走进师傅的静室,檀香弥漫。", "effects": [] },
{ "id": "b-choice", "kind": "choice", "speaker": "", "location": "loc-1", "content": "师傅问你为何而来,你如何应答?", "effects": [] },
{ "id": "b-humble", "kind": "dialogue", "speaker": "char-2", "location": "loc-1", "content": "弟子愚钝,恳请师父指点。", "effects": [ { "var": "rel_master", "op": "set", "value": "盟友" } ] },
{ "id": "b-arrogant", "kind": "dialogue", "speaker": "char-1", "location": "loc-1", "content": "不过如此,何须你教。", "effects": [ { "var": "rel_master", "op": "set", "value": "敌对" } ] },
{ "id": "b-end", "kind": "narration", "speaker": "", "location": "loc-1", "content": "会面结束,你退出静室。", "effects": [ { "var": "power", "op": "add", "value": 5 } ] }
],
"edges": [
{ "id": "s1", "source": "b-open", "target": "b-choice", "label": "" },
{ "id": "s2", "source": "b-choice", "target": "b-humble", "label": "谦逊求教" },
{ "id": "s3", "source": "b-choice", "target": "b-arrogant", "label": "桀骜不驯" },
{ "id": "s4", "source": "b-humble", "target": "b-end", "label": "" },
{ "id": "s5", "source": "b-arrogant", "target": "b-end", "label": "" }
]
}
字段说明(严格契约,系统会拒绝不合规的输出并要求你修正):
event_id / beats / edges;
event_id 必须等于目标事件节点的 id。id/kind/speaker/content/location/effects:
kind 只能是 narration(旁白)/ monologue(内心独白)/ dialogue(对话)/ choice(选择点)。id 在本图内唯一。speaker:仅 dialogue/monologue 使用,且必须是 world.json 六类卡片中全局唯一的 id(硬校验;角色名、简称、未知 id 都会被拒绝);narration/choice 留空 ""。content:纯内容——dialogue 只放台词、monologue 只放独白(不含"某某说:"前缀、不夹旁白);narration 只放客观叙述、choice 只放一句提问(不夹场景铺垫/角色台词)。location:每个 beat 必填,且必须是 world.json locations 分类里已存在的地点卡片 id(硬校验,为空或不存在会被拒绝);尽量跨 beat 复用,不得凭空造地点。effects 是数组;每个 effect 只含 var/op/value:
var 必须是 events.json 里已声明的状态变量 id。op 只能是 set(赋值,flag/enum/scalar 通用)或 add(仅 scalar 的数值增减,value 为增量、可负)。set 的 value:flag→true/false;enum→取自该变量 allowed;scalar→范围内整数。
所有 scalar 的 set/add value 都必须是整数。id/source/target/condition/label:
source/target 必须是已存在的 beat id,且不能相等(禁止自环)。condition(可选)只含 var/op/value:var 须是已声明变量;flag/enum 用 ==/!=;
scalar 可用 >/>=/</<=/==/!=,但必须声明整数 min/max 且比较值为整数。label:出度>1 时呈现给玩家的选项文案;出度=1 可留空。flag/enum)而非裸数值阈值;若某事件边要求某 scalar 达到较高阈值,
确保沿情节能通过 set/add 合理累加到位(跳档优于 1 点 1 点),否则该路径可能玩家永远走不到。event_id/beats/edges 三个键?event_id 是否等于目标事件 id?source/target 是否都存在、无自环?var 是否已在 events.json 声明?op/value 是否与变量类型匹配?kind: "choice" + 各出边有 label?同一后果是否只写了一处(无重复镜像)?speaker 是否为已有卡片 id,旁白/选择的 speaker 是否留空?location,且都取自 world.json locations 里已存在的地点卡片 id(没有凭空造地点)?add 当成必然过门槛?narration/choice beat:里面是否夹带了某个具体角色的话(哪怕没引号、只是用冒号或"点头道/只说"这类弱化表达)?有则拆成独立的 dialogue beat。写入完成后,只向上层回一段简短摘要(beat 数 / 边数 / 主要选择分支 + 写了哪些关键状态),不要复述完整 JSON。
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
基于故事大纲与世界设定,把故事细化为"网状的事件图"——声明全局状态变量 + 事件节点 + 带解锁条件的有向边,按严格 JSON 模板写入 /project/events.json。当需要生成或修订事件图时使用。
日本語の概要は準備中です。原文の説明を表示しています。
从小说/策划案原文与故事大纲中抽取并组织结构化世界设定,按"子类型分组的统一卡片"JSON 模板写入 /project/world.json。当需要生成或修订世界设定时使用。
日本語の概要は準備中です。原文の説明を表示しています。
常见叙事结构模板(三幕/英雄之旅/起承转合等),用于把创作意图与素材组织成节奏合理的"弱格式故事大纲",以自由 Markdown 写入 /project/outline.md。
日本語の概要は準備中です。原文の説明を表示しています。