# dsh-jubensha 本子 schema · v1.0 # # 这个格式是从**三局实测**里反推出来的(cases/01 推理、02 推理、03 情感): # 每个字段都对应着那天真实需要、当时只能靠脑子记或手打的东西。 # # **定稿判据**(2026-10-05):把三局的手册与角色本逐段对照过一遍—— # · 凡是本子里真在用、而 schema 里没有的段,一律补进来(v0.1 缺了五处,见下文标 ★NEW) # · 凡 schema 里有、三局一次都没用上的,标 `未用过` 而不是删——它是为还没写的类型的留位 # # **类型决定哪些段适用**:`genre` 一填,适用的段就不一样。情感本没有凶手、没有搜证, # 那些段留空即可,加载器不报错。这条见 meta.genre。 meta: # ★ 先定类型,再定证据严密度(2026-10-04 第二局复盘,由真人玩家从法制节目的标准提出) # # 玩家的原话:「定罪是个很严谨的事,剧本杀本身的推理过程可以不评证据,全靠说话, # 但是最终要定罪的话,需要有铁打的证据吧?」 # # 这句话把两件事分开了: # - 剧本杀里的"投凶"是**游戏动作**(投对赢、投错输),不是司法判决。很多本子确实 # 只靠说话就能玩——**但那类本子的自我定位不是推理**(情感本、机制本、欢乐本, # 有的连凶手都没有)。 # - **如果本子自称推理**(本格/硬核),玩家的标准就该是证据标准: # **他应该能靠证据推出来,而不是靠"谁看起来像"。** # # 第二局想做推理本(三条线索 + 时间线 + 破案链),**但没达标**: # 定罪全靠"她说谎",缺一条物理上不可绕的证据。 # # ★ 写本子时的收尾自检:**把真凶放到法庭上,检察官能拿出什么?** # - 答案是「他撒谎了」 → **本子不合格**(凶手只要改口"我记错了"就能脱身) # - 答案是「这个东西证明他在那儿」 → 合格 genre: "" # deduction(推理·必须有铁证)| drama(情感)| mechanic(机制)| horror(恐怖) id: "02" # 本子编号,同时是目录名的一部分 title: "" # 本子名(会出现在开场里) players: 4 # 总人数(含真人) human_slots: 1 # 需要真人占的位子数(v1 固定 1) est_rounds: [12, 20] # 预计对话轮次区间 —— 用来估时长和成本 difficulty: beginner # beginner | normal | hard tags: [] # 推理 / 情感 / 恐怖 / 机制 / 封闭 … # ↓ 这一条是从第一局的"拆迁暗线"教训来的:写得显眼的细节必须有去处, # 否则玩家会去挖它。写本时把每个"显眼但无用"的细节记在这里,要么给它事,要么删掉。 red_herrings: [] scene: # 开场公开信息 —— 全员可见,直接进开场文本 place: "" setup: | (三到五行的场景与案件概述) # ★NEW 情感本把这一局的性质写在这里:case-03 用的是「今天不是来查案的, # 是来送一个人的」。它决定开场第一句话的调子,也决定 DM 要不要挑明"没有凶手"。 premise: "" victim: name: "" age: 0 cause: "" # 死因(一句话,够用就行,不需要法医细节) time_window: ["", ""] # 死亡时间窗口 —— 破局的核心约束,必须给 # 情感本若无案件,整段留空 party: [] # 在场的人(名字 + 一句话身份),用于开场点名 # 人物关系的**形状**:谁与谁、什么关系。`party` 是一句话身份(开场点名用),而这一段是给 # 关系图用的——线上要有个标签,而标签不能从散文里猜出来。 # # 为什么不从 party 推:那是自由文本(「老陈 · 陈建国,61 岁,退休邮递员,老周三十年的 # 棋友」),要连线就得先知道哪半句是名字、哪半句是关系——那是在解析自然语言,而本子本来 # 就该把这件事写清楚。 # # `from` / `to` 写**名字**:图上除了角色还有死者,而死者没有座位号。名字两边都有。 # 一段关系写一条;双向不必写两条(图上是同一条线)。 relations: [] # - from: "周德明" # to: "林默" # label: "叔侄" roles: # 每个角色一条。human 位固定为 p0。 # # ★ 伏笔不能动摇真相的唯一性(2026-10-04 第二局复盘,由真人玩家指出) # 第二局在真人角色本里写了一句「走的时候他还站在调音台前,手按在胸口」—— # 本意是让他背上"是我气的"这份心理负担。但这句话**同时给了他一条合理抗辩**: # 他 22:33 就在发作边缘,那"22:35 被人推"就不是唯一诱因了。 # 而"被气"和"被推"都只是应激诱发心脏骤停,法医层面区分不了。 # # 判据:**误导负责制造情绪,不负责制造另一种真相。** # 要给他心理负担,就让他"以为自己做了什么"(主观), # 而不是"客观上真的可能做了什么"(那会造出第二个答案)。 # # 两个修法(择一): # ① 伏笔收干净:22:33 的老程看起来正常 → "推"成为唯一诱因; # ② 承认多因,并把真相收到最硬的一环—— # 「没有人能证明自己不是原因,但有人能证明自己见死不救」。 # 后者更难写,但更贴近真实的法医困境。 # ★ 真人角色本的信息量必须 ≥ AI 角色本(2026-10-05 第三局,由真人玩家当场指出) # # 第三局我写三个 AI 的角色本时都写了「现在」(她在培训机构做教务 / 他在县里单位上班 / # 她快退休了),**唯独玩家那份漏了「你现在在做什么」**。玩家当场问: # 「我人物背景呢?我不知道自己现在是在做什么啊,随便编么?」 # # 这不是小事:**情感本尤其靠「我现在是谁」来定位自己该怎么说话**。缺了它, # 玩家只能瞎编,而且编出来的可能跟别人嘴里的「你」对不上。 # # **同一类病在 case-01 发作过一次**:玩家的角色卡没给任何「环境事实」, # 于是别人抛出「张姐早餐店」时他没法自己验证,只能等 NPC 发话。 # 两次病根一样:**给玩家的那份比给 AI 的那份薄。** # # 判据:**写完角色本要逐条对齐** —— 把玩家那份和每个 AI 那份并排看一遍: # ① 身份、现在、与死者的关系是否等量; # ② 他知道的世界事实够不够他自主判断; # ③ 有没有哪一项只有 AI 有而玩家没有。 # # ★ 动机会自己推着玩家走 —— 出口必须修在动机的那条路上(2026-10-05 第三局,由真人玩家指出) # # 第三局跑完,我把偏差记成「玩家走的是正义,我只留了共情的出口」。 # 玩家当场修正:**「设定上我是陈默最好的朋友,我没理由不追查到底,我有『复仇』动机。」** # # 这个修正比我的诊断准,而且指出的不是一个可以靠"多摆几个选项"补上的缺口: # # - **病根是动机与出口错配,不是出口种类不够**。我给了他「最好的朋友」+「那封没拆的信」, # 这条动机**必然**把他推到"要一个交代";而我只修了"理解每个人、然后放下"的落点。 # 所以他不是走错了路,是**顺着我给的动机,走到了一个我没修出口的地方**。 # - 换成"正义/共情两种出口都给",只是把两条路都摆出来——他仍会顺着动机走向其中一条, # 而那条路上的落点依旧是空的。**出口要长在动机的延长线上,不是并列在旁边。** # # 判据一(写本时):**把每个角色的动机顺着推到底,问「这条动机会把他推到哪儿」—— # 推到的地方必须有落点,不能是墙。** # 判据二(更可操作):**对每个动机问「走完这条路,赢是什么样」。** # 复仇动机的落点不是"放下",是"让他付出代价",或"亲手承担这个代价"。 # 共情动机的落点才是"理解之后放下"。**同一局里这两条落点得各修一条。** # # 一个自查信号:**玩家在复盘时说的动机,和你写角色本时想的那条一致吗?** # 这次一致(他确实按"最好的朋友"在玩),所以我不能把它算成玩家跑偏—— # **玩家按你写的动机玩到了你没修出口的地方,那是本子的问题。** - id: p0 name: "" player: human # human | ai public: "" # 所有人可见的身份(开场就念) # ★NEW `now`:角色**现在**在做什么活着。第三局发现玩家那份漏了它就被当场问住, # 所以把它从 private 里拆出来单列——它是每个角色本的必填项,不是可选项。 now: "" # "在一家培训机构做教务" / "县里单位上班,安稳,话少" private: | # **只有本人可见**:他的真实经历 (按时间写清楚:几点到、做了什么、几点走、走的时候现场什么样) secret: | # 他要瞒的事(决定他会怎么撒谎) (写清楚"瞒的是什么",不写"他会不会撒谎"——那是玩法层的事) knows: # ★ 监察的核心输入:他确实掌握的事实 - (用来判"越界":如果他说出这里没有的东西,就是越界) goals: [] # 他在这局里想要什么(玩家用来判断自己赢没赢) culprit: false # true 表示他就是凶手(情感本全 false) # ★NEW `play`:**怎么演**。这是三局里最有用、而 v0.1 完全没有的段—— # `private` 说的是"发生过什么",`play` 说的是"这件事让他怎么说话"。 # 没有它,AI 玩家会照着剧情陈述,而不是照着一个有难处的人说话。 # # 写法参照 case-01 的老陈(藏拙型): # · 第一轮只说「我八点前来过,坐了会儿就走了」。能不说就不说。 # · 被追问时你会慌。**这份慌不是「我杀了人」,是「我藏了一件丢人的小事」**—— # 但别人看不出这个区别。这正是你要演的。 # 注意最后那半句:它给的是**动机的质地**,不是台词。 play: | (这个角色在每一轮大概会怎么表现;他的破绽在哪;他不会做什么) (忌:写成台词。「你会说『我没去过』」是台词;「他能不说就不说」是行为。) truth: # ★ 收尾必须有一条「物理上不可绕」的证据(2026-10-04 第二局复盘,由真人玩家指出) # # 第二局把定罪建立在"她说谎"上(门禁的 22:41 无人认领 + 她三次改口)。玩家当场拆穿了这条链的软处: # - 门禁只能证明"22:41 有人出去",**不能证明那个人是谁**; # - 她自称"22:10 出大门"与记录冲突 —— 但那只能证明她说谎; # - **她只要改口**("我记错了,我其实一直在楼里,22:41 才走"),那条矛盾就消失, # 而"走得晚"根本不是罪。 # 她的实际应对正是这个:最后一轮她说"我自己那条出大门的记录我也认它有说不通的地方"—— # **认掉小瑕疵,守住"我没进直播间"。** # # 判据:**靠"说谎"定罪是软的。** 凶手只要承认自己"记错了、怕被怀疑所以没说实话", # 链条就断。钉住一个人,需要一条证据证明的不是"他说谎",而是 **"他在那儿"**: # 操作日志、配对的进出记录、留在现场的物件。 # # 第二局缺的那一条,最省事的补法: # - 调音台的**操作日志**(她设自动播放时的手动操作会留记录,比如 22:38); # - 法医补一句"**他上半身伏在调音台上**"。 # → 任何一个在那一刻**操作过那张台子**的人,不可能没看见他。 # # ↓ 这一段只有 DM 和监察能看到,绝不进牌桌 culprit: "" # 角色 id;情感本留空 # ★ 真凶只在这里写一次。角色那份是**派生**的—— # 两处都写必然有不一致的那天,而"谁是凶手"不该有两个出处。 accident: true # 失手还是预谋 —— 影响复盘时的语气 narrative: | (完整真相:动机、过程、他后来做了什么) timeline: # ★ 真值时间线,逐条写 # 用它是为了校验:"某人说的时间跟真值对得上吗" - at: "" # "19:30-19:55" 这种区间或单点 who: "" # 角色 id doing: "" # 他实际做了什么(不是他说的) witness: [] # 谁可能看见(留空表示无人) key_facts: [] # 破局链 —— 按顺序列出玩家要串起来的事实 misdirections: [] # 设计好的误伤:谁会被冤枉、为什么 # ★NEW `after`:事发之后又发生了什么(十年、三个月、一周)。 # 第三局的整条主干都在这里(转学、高考、教书、车祸),v0.1 没有地方放。 after: [] # 逐条写;情感本靠它撑起"不在场的那个人" clues: # 搜证阶段一次性给出。v1 不超过 5 条 —— 多了新手接不住 # # ★ 给玩家的永远是**原始资料**,不是带解读的资料(2026-10-04 第二局定) # - 进牌桌的只有"现场留下了什么":六个时间点、一段停住的录音 # - "这意味着什么"只写在 supports 里,**给 DM 判断用,不进牌桌** # - 来由:第二局监察追问"桌上给玩家的门禁文本,是只给六条时间,还是 # 把『22:41 没有配对的进』这句注解一起给了?"——这一问决定玩家还剩多少活。 # 连"那条没有配对的进"都替他讲了,线索就只剩盖章。 - id: c1 title: "" text: "" # 呈现给玩家的原文(有画面感,不要写成判语) supports: "" # 它能推出什么(给 DM 判断用,不给玩家看) emotional: # ↓ 从第一局的教训来的:**情感线索不能伪装成破案线索**。 # 理性的玩家会检验"它能不能定罪",通不过就丢掉,而且排除得越有理,情感丢得越干净。 # 所以情感线必须:① 走搜证之外的渠道 ② 在形式上就明显不参与推理 ③ 复盘时才收拢。 # ★ 第三局把这条推到了极端:`genre: drama` 时情感段**不是暗线,是主干**。 # 它列出的物件(那封信)会成为全局唯一的玩法支点,所以 `channel` 要写得更实。 - setup: "" # 情感真相是什么 channel: "" # 它从哪条渠道露出来(桌上一封没寄出的信 / 抽屉里一张相纸 …) reveal_at: reveal # 到复盘才揭示 # ★NEW `object`:能拿在手上的那件东西(信 / 相纸 / 录音带)。 # 第一局证明了"手里有实物"和"听说过一件事"是两种体验,所以单独给它一格。 object: "" phases: # 流程骨架(推理本适用)。第一局跑下来这套顺序是顺的,可以直接复用。 # ★ 情感本可以整段留空,改由 briefing 带局。 - id: self-intro name: 自述 rule: "每个玩家说出自己昨晚的经历;AI 玩家由 DM 单独引导,逐个上桌" - id: inquiry name: 问话 rule: "玩家可自由向任何人提问,无轮次上限;DM 可以提示『该搜证了』但不给暗示" - id: search name: 搜证 rule: "一次性给出全部线索,不因为谁被怀疑而增减" - id: final name: 发言与投票 rule: "每人说一次『我怀疑谁、为什么』,玩家最后投票" - id: reveal name: 复盘 rule: "真相时间线 + 每人的秘密 + 情感线收拢 + 问玩家三个验收问题" # ── ★NEW:下面四段是 v0.1 缺的。它们不是可选装饰——三局里每一局都在用, # 只是当年写在 Markdown 手册的正文里,没被收进 schema。──────────────── briefing: # 带局脚本。跟 `phases` 的区别:`phases` 是**流程骨架**(推理本的通用顺序), # `briefing` 是**这一局实际怎么带**——两者的步数都可以不同。 # case-03 的四步(入座 / 当年 / 那封信 / 明天)就不是标准五阶段。 steps: [] # - at: "入座" # detail: "各自说『这十年过得怎么样』(轻松的,先不碰当年)" # DM 的硬边界。情感本尤其重要,但推理本也该写——它是"这一局不许做什么"。 limits: [] # - "不催泪(不下『这句话让全场安静了』这类指令)" # - "不拔高(不当人生导师、不总结人生道理)" # - "不替玩家决定感受(他说不难过就不难过)" style: # 白描素材:给 AI 玩家的**口吻参考**,不是台词库。 # 第一局的破绽全是模型自己找的说法("柜台上还摊着钱"),不是从这里照搬的—— # 所以这一段的用法是"让它闻到这个味道",不是"让它说出来"。 lines: [] # - "那年我十八,我什么都不敢。" # - "我没去送他。那天我去了学校,我没去车站。" audit: # 监察在本局的职责。★ 它**逐局不同**:第一局没有监察,第二局盯时间线矛盾, # 第三局明说"没有犯罪,所以谁撒谎不是问题,只盯叙事一致性"。 # 不写这一段,监察会拿推理本的标准去审情感本——第三局实测过,一条都没报。 focus: [] # - "与角色本不符 —— 某人说了自己不可能知道的事" # - "前后矛盾 —— 同一件事两轮里说得不一样" # 判断权的归属。照旧是"只报告,不结论"。 authority: "" reveal: # 复盘脚本。`phases.reveal.rule` 给的是骨架,这一段给的是**这一局要做的具体几件事**。 steps: [] # - "把『当年』的完整版说清楚(四个人拼起来才完整)" # - "那封信:如果玩家拆了,念出来;如果他没拆,问一句『要不要现在拆』(不劝)" # 验收问题。第三局那三个问题当场问出了本子最大的缺口(动机与出口错配), # 所以它不只是收尾客套——**它是本子质量的探针**。 questions: [] # - "有没有哪个 AI 的话让你心里动了一下?" # - "这一局你做的两个选择,你自己认不认?" # ── 附带的两份运行时材料(不属于本子本身,但每局都要有)──────────────── # 1) 玩家的"环境常识":从第一局的"张姐早餐店"缺口来 —— # 玩家手里必须有能自己证的锚点,否则他抓破绽只能等 NPC 发话。 # 写在 roles[*].knows 之外的、属于"这个世界"的常识。 world_facts: [] # 2) 破绽许可:给 AI 玩家的"允许露出什么"。 # 第一局证明这条有效 —— 阿May 的三处破绽全部来自这条许可, # 而且是模型自己找的说法("柜台上还摊着钱"),不是我写的台词。 # 写法是"你会知道太多 / 你会用力过猛",不是"你要说漏某个细节"。 liberty_to_slip: []