文字与道具纪律
文字与道具纪律
给 coding agent 的执行参考。每一节的结构固定:推导依据 → 规则 → 判据 → 边界。先读推导再动手;跳过推导直接抄规则,下一轮会重犯同一个错。
顺序即优先级。前三节是元规则,改动成本最高,动它们之前先确认自己不是在为了一个具体句子返工。
0. 元规则:文字的唯一出处与权威顺序
**先建一个「全部可见文字的唯一出处」。**所有字——道具上的、界面上的、提示层的——都必须从这一处生成。散落在代码里的字符串是后期矛盾的主要来源。
权威顺序写死,并落到项目文档里:
代码 > 交接文档 > 设计文档
**任何字与设定冲突时,改字,不改设定。**默认动作是删句,不是改机制——绝大多数「文案和实现不一致」的正确解法是让字闭嘴,不是让实现追字。
**顺手把它改对。**发现冲突时不要只报给用户,同时提交修改建议或直接改完。留下一个已知的假话比留下一个尴尬更糟。
判据:
- 断言:可见文字的唯一出处存在,且不存在第二个直接产出玩家可见字符串的模块。
- 断言:
权威顺序字符串出现在项目文档中(可被 grep)。 - 人工:抽查任意一句道具文本,能指出它的唯一出处位置;指不出的即为违规。
1. 旁白只在画面给不出这条信息时说话
推导:旁白与画面同处一个屏幕。重复表达同一信息会互相抵消——玩家刚看到「她走过去了」,文字再说一遍「她走过去了」,这次演出就被降级成字幕。文字层唯一不可替代的功能,是提供画面放不下的东西。
保留三类:
- 机制的状态反馈:动了、数乱了、她走过去了。
- 画面外的信息:另一个人在动、她的位置、已知的旧规矩。
- —— 不属于旁白:操作话术归「提示层」,见第 6 节。
删三类:
- 复述眼前陈设(「走廊很长,墙上挂着画」)。
- 复述音效(「远处传来钟声」——那声音已经在响了)。
- 进门报房名(「你推开门,走进厨房」)。
判据(删除检验,很锋利):
把这句删掉,玩家损失的是一个信息还是一次判断?损失判断的,删。
辅助判据:把这句读给没玩过的人听,如果他获得的只是情绪总结或机制提示,删。
实测样本(亲历):一次清扫把这类文字从 122 句砍到 66 句,剩余的每一句都能填出「它替代了哪一次判断」。
边界:玩家故意没看画面时,状态反馈仍然有效——那是重复,不是干扰。
2. 零括号
推导:括号是「这是解释 / 这是内心独白」的元标记。玩家读得懂时不需要这个标记;带上括号等于作者替玩家声明「这里要动脑」。它在替玩家划重点,而重点应该由玩家自己划。
规则:全库括号数 = 0。
判据:
assert count(left_paren in visible_text_source) == 0
assert count(right_paren in visible_text_source) == 0
例外:键位分隔符(如 [E] 的方括号)、配置语法、文件名。界面覆盖层同样适用。
3. 零标点,一句一句
推导:这些标点(逗号、破折号、冒号)承担语气与表演功能,而表演属于画面与音频层。文字层的任务只报事实。
更锋利的推导:两句里第二句通常是第一句的推论,而推论是替玩家做判断。「呼吸放轻。」之后不需要再补「她听见了。」——玩家听得到。
规则:
- 每句只许一个句号。句中不许逗号、破折号、冒号。
- 一段里只留一个句子。
判据:
- 断言:可见文字中不出现
,—:。 - 人工:过一遍所有「X。她听见了。」式的补刀句,删掉后半句,确认信息量没有丢失。
4. 可见文字不出现人名
规则:只用「我 / 妹妹 / 她 / 姐姐」这类关系称呼,以及床位号、职务、年龄、日期。被抹掉的名字用划痕、水渍、湿墨画出来。
三条推导:
- 姓名把抽象身份钉死成具体人,削弱从「制度性恐怖」到「个人悲剧」的转译空间。叫出名字,读者就不再是任何机构里的任何人。
- 姓名天然产生一致性问题:改一个字要在几十处纸面图上同步。制度性设定不需要这种维护成本。
- 机构文件的姓名本该「在纸上」——既然游戏永不解释矛盾,玩家拼的是格式:谁被划掉、谁有编号、谁被重签了。格式比名字更有信息量。
判据:
- 断言:可见文字源中不出现任何角色专名(专名表作为白名单传入检查)。
- 人工:所有「本该有名字」的位置,确认改用划痕/水渍/编号/职务表达。
边界情况(关键,否则会被过度执行):
机构文件上的名字属于文件,不属于叙述。
纸上的人名与叙述里的人名是两个世界的字。叙述层守零人名,文件层允许并应当使用真名——那正是制度性恐怖的载体。混掉这两层会把整个制度感抹平。
5. 不数数(给结果,不给过程)
推导:计数器与滚动数字把节奏做成界面元任务。玩家会盯着数字看,而不是听环境。而「数」这件事的可信度来自你数出次数时的分心感,不是从屏幕上读出来。
规则:计数器只留状态短语 + 音效,不留数字滚动。界面与可见文字里不出现连续数字。
判据:
- 断言:界面上不存在连续变化的数值渲染;
counter_display只接受枚举短语。 - 人工:把所有出现数字的位置分类,剩余的必须是静态的实物属性(日期、床位号、刻度)。
边界:静态数字(门牌、刻度、年份)不受限,见第 11 节。
6. 提示即按键,且提示不许与事实不符
规则:
- 操作性提示只写「键 + 动作」。后果说明、规则编号引用、一切「你会……」的句子,一律删除。
- **说谎的提示会永久破坏玩家的信任。**玩家按提示躲了,但那声音根本没引来任何东西——一次之后,所有提示都不可信了,包括说真话的那些。
判据:
- 每条提示能指出触发它的世界条件。
- 代码里有对应的状态守卫;守卫为假时提示不出现。
assert prompt_visible(im) == world_condition(im)
- 人工抽查:任取一条提示,写出它成立所需的观测事实。写不出的删掉。
边界:教学提示在首遇之后必须消失。重复出现的教学等于没收走的手电筒。
7. 锁只报锁
推导:内容量不高时,玩家把一间房翻一遍就会拿到钥匙。替玩家指路会把探索降级成照清单办事。
规则:锁的反馈只表达状态(「锁着」),不含方位、不含藏匿位置、不含获取顺序。解法属于玩家。
判据:
assert not any(dir_word in text for text in lock_feedback_texts)
assert not any(hiding_word in text for text in lock_feedback_texts)
方向词与藏匿描述的词表写进项目文档,随项目语言扩展。
边界:内容量确实很大、玩家真的找不到时,换别的引导手段——例如让目标道具自己被注意到(反光、异常声音、放在视线交点)。仍然不是文案指路。
8. 物体上只许有它物理上真的有的东西
这一节要写足,因为它是道具系统最常见的一类崩坏。
推导:统一模板化的道具(居中抬头 + 红色分隔线 + 右上角审核章)会让所有纸都读起来像「同一套界面的换皮」。机构章盖在私信上是世界观硬伤——私信是私人行为。更根本的问题是:
那不是「一张纸」,那是「一个文本框」。
规则:
- 系统说明(抬头、目录式标题后缀、编号)不许印在道具上。抬头是排版,不是内容。
- 公文有它自己印的抬头与版式分隔线;只有机构用纸才有章;寄出的信才有邮戳;私信、日记、字条、谱夹什么都没有。
- 标注只走两条路:角色第一人称内心,或可辨识界面。
六字段模型作为统一出口:
| 字段 | 内容 | 例 |
|---|---|---|
| 形制 | 印刷公文 / 海报 / 手写 / 墙面本身 / 画 | 决定其余五个字段是否合法 |
| 物体自己印着的抬头 | 仅印刷件有 | 公文抬头、海报名 |
| 机构章 / 邮戳 | 仅机构用纸 / 寄件有 | 印章、邮戳 |
| 角色内心话 | 第一人称内心 | 角色的批注 |
| 重读列表里的称呼 | 界面上的物品名 | 「值班记录」 |
| 版面与污渍 | 纤维、霉斑、撕边、折痕、墨渗 | 材质可信度 |
所有「身份信息」必须落在这六个字段里。不允许在别处再维护一张 id → 样式清单——两张表必然分叉,分叉就是两个真相源。
判据:
- 逐件看图问一句:「这个东西上本来就有这个吗?」答不出即判违规。
- 断言:手写件无抬头、无分隔线、无章。
- 断言:机构章有一份白名单,新增机构纸必须同步白名单(未同步则检查失败)。
- 断言:描述性红色批注(舞台指令腔,如「颤抖」「犹豫地」)计数为 0。
- 断言:样式全部由六字段推导得出,代码中不存在独立样式表。
8.1 一旦定成原则就要普查同族
反馈里出现「这条是基本原则,别的地方也有,你也要查一遍」时,把反馈读成类,不读成条目。本篇的类是这样界定的:
- 「凡声称是镜面/反射面的东西都要检查」
- 「凡能反复触发的功能物都要检查」
- 「凡印着字的平面上,所有字都必须符合六字段」
规则:
- 给每一类写一条可写的判据,写进项目文档,不写进一次性修复的提交信息。
- 落成可自动化的断言,否则下一轮还会重犯。
- 收尾时显式交代「同类排查已完成」,不要让用户自己去发现漏网的那件。
- **主动声明工具的盲区。**例:通用可达性探针只测未被门禁的交互物,恰好跳过被门禁住的那批——必须手工覆盖盲区,或明说它没被测。
同类普查的通用规程(账本字段、试玩提问清单、收尾模板、覆盖范围的报法)不在这里,见 verification-and-forensics.md 第 1 章。
9. 说谎禁令:文本不许描述已经不存在的东西
推导:机制或关卡改动后,旧文案变成未兑现的承诺。玩家的归因是「游戏坏了」,不是「我记错了」——他不会怀疑设定,只会怀疑产品。
实例(亲历):一扇锁着的门仍在报「钥匙挂在门后面,得先摸到挂钩」,而挂钩早已被移除。
规则:任何引用世界物件或状态的句子,世界重做之后必须重审。
判据:
for s in sentences_referencing_world_objects:
assert world.contains(resolve(s.object_reference))
- 人工:关卡改动提交里必须包含一次可见文字重审的确认;没有确认就拒绝合并。
- 断言:引用世界物件的句子集合可枚举(不是靠人肉扫)。
10. 非信息类物品必须有交互上限或条件
推导:同一动作无限重复时,收益不变而成本递减 → 玩家用最优解刷分,并绕过整个游戏。而「机关用完了」本身就是世界可信度。
规则:
- 信息类(纸、画、登记簿)可反复读,每次给不同角度。
- 功能类(乐器、八音盒、开关)必须有交互上限或触发条件。实例:琴两回后「弦不响了」;八音盒一回后「发条拧到了头」。
- 耗尽后不再有任何副作用——无声、无收益、无特写。否则玩家会为了省成本而必须重复,反而被绑在一个已经没意义的动作上。
判据:
- 断言:每个功能物有显式的
exhausted状态;exhausted后调用路径不产生任何可观测输出。 - 人工:列出所有可反复触发的交互物,逐个确认有上限或条件。
11. 数字即伏笔,出处铁律
规则:任何一句可见文字里的数字、年份、人名,必须能在年表或某份可读记录里找到出处。找不到就改字。
每个关键数字至少出现两次:一次埋,一次收。
推导:不可靠档案的手法是「多份记录互相矛盾、都摆在玩家手里」。这个手法的前提是每份记录本身是真的。一旦有一句无出处,玩家拼图时会把矛盾归因到 bug 而不是设计——整个不可靠档案的乐趣归零。
判据:
- 为每个数字建一条出处条目(指向年表某行或某份可读记录的某页)。
- 断言:可见文字中的每个数字都能解析到出处条目;解析失败即检查失败。
- 断言:每个标记为「关键」的数字在可见文字中至少出现两次。
12. 道具即世界:出处四问
每件新物件必答,四个问题缺一不可,答案写进物件记录。
- 形制:它物理上长什么样?印刷公文、海报、手写、墙面本身、画。
- 谁会在上面写字 / 盖什么:章与邮戳在这一件上是否合法。
- 它支撑在哪:贴墙、摊桌面、夹本子、落地——各带倾角与阴影。
- 它朝哪:朝向必须显式写出。平面件必须有倾角,否则命中角为零,玩家会以为点不中。
判据:
- 断言:每件可交互物件的记录含四个字段,缺任一字段即检查失败。
- 断言:所有平面件的倾角非零且已声明。
- 人工:新增物件提交里贴出四问答案,作为评审项。
13. 纸面即画面
规则:文字刻画的画面直接画给玩家。台历、练习本、登记簿、拆封的信都已经是整页图——浏览纸面时不再有任何旁白。
推导:竖排读长文本是最没人读的形式。可信度来自版面、材质、笔迹、污渍这类视觉属性,不来自字数。把「画里有什么」变成「一段描述红字」是退化。
判据:
- 阅读层不含标题标签、不含容器透明叠层、不含描述性红字。
- 断言:每张纸面至少具备纤维 / 霉斑 / 撕边 / 折痕 / 章 / 手写墨渗中的若干项(阈值写死,例如 ≥ 3)。
- 断言:纸面浏览路径上不产生任何旁白调用。
配套教训(呈现契约):纸的世界态要有方言——印刷体、刻痕、手写、画,而不是一张通用纸套四段文字。一屏滚动读完长文本会被读成「太玩具」,长文本必须分页。
边界情况:**墙上刻的字就用墙来读。**场景里已经有专属渲染时,不要额外做一张誊抄墙面内容的纸——那只是重复。做法是给那面墙一个不可见的交互目标,读它 = 读那面墙的特写。
14. 留白总纲:能用画面和声音说的,不要用字
这是全文最重要的一条,放在最后,因为它凌驾于前面所有条之上——前面任何一条与这一条冲突时,这条赢。
推导:解释一旦出现,玩家的判断权就被收走。而判断才是恐怖体验的载体。玩家自己推出的结论,比作者告知的结论可怕得多——作者告知的结论已经被消化过了,消化过的东西不再产生恐惧。
规则:
- 因果、结论、动机一律不说。给现象,不给解释。
- 「你发现了秘密」这类弹窗是纯粹的作者侵入:玩家在锁着的门后找到箱子时,已经知道自己发现了秘密。
- 台词写两层:表面说的 vs 真正想的。
判据:
- 全文 lint 一个因果框架词表:
原来 / 所以 / 这就是 / 代价是 / 因为 / 意味着,计数为 0。 - 人工:抽查任意一段文字,逐句问「这句是在报事实还是在下结论」。下结论的删。
- 判据(团队级):目标不是「吓到玩家」,而是让玩家感到任何选择都是错的、且从来都是错的。若一段内容的成功指标是「玩家被吓到」,它在执行本条。
Corner cases
- 玩家截图后逐字分析:不要因此加密或打乱字序。逐字分析的成本由玩家承担,他们算出的结论仍然是自己推出的,判断权没丢。
- 玩家把规则抄成攻略:这是成功不是失败。让他们的攻略比真实规则更完整、更优雅(见恐惧设计文档「玩家解释力超过真实实现」)。
- 零括号与「需要区分语气」的冲突:语气归音频与画面,不归文字。若某句去掉括号就不可读,说明这句本来就不该存在。
- 六字段与外文/少数民族文字:外文纸上的抬头是真有的,仍合法;但机构章不能盖在私人信件上——白名单按载体类型而非按语言维护。
- 道具数量爆炸时的样式一致性:不要靠人肉维护。断言从六字段推导样式,宁可让某一件道具缺字段而报错,也不要给它兜底默认值。
- 玩家在读纸时被敌人打断:读纸时不要冻结世界状态,除非明确设计为安全区。冻结会让读纸成为最优解。
- 界面覆盖层也算可见文字:第 2、3、5 节的 lint 范围包含全部覆盖层,不只道具。
- 一句文本同时服务两个系统(例如既是道具抬头又是界面条目):只保留物理载体上的那个,界面另出一条符合第 5 节规则的短名。
- 年表本身被玩家读到:年表是「可读记录」,允许矛盾;可见文字不允许矛盾。矛盾要放在两份都真的记录之间。
- 同一物件在两次遭遇中的文字不一致:允许,且这是特性——但两次的文字必须各自符合第 8 节的六字段,不能用不一致当借口加字。
- 玩家问起某句道具文本的含义:不要用游戏内文字补解释。答案要么在世界其他可读记录里,要么不存在。
- 工具扫不出的项:通用可达性探针只测未被门禁的交互物。收尾时显式列出未覆盖范围(第 8.1 节)。
判据速查
| 纪律 | 可机检判据 |
|---|---|
| 文字唯一出处 | 单一产出模块;无第二处可见字符串 |
| 权威顺序 | 代码 > 交接文档 > 设计文档 可 grep |
| 旁白删除检验 | 删后损失「一次判断」才保留 |
| 零括号 | 括号计数 == 0(键位分隔符除外) |
| 零标点 | 无 , — :;每句一个句号 |
| 零人名 | 专名表白名单外的角色名计数 == 0(文件层豁免) |
| 不数数 | 无连续数值渲染;计数器只收枚举短语 |
| 提示即按键 | prompt_visible == world_condition |
| 锁只报锁 | 锁文案无方位词/藏匿词 |
| 物体六字段 | 样式由六字段推导;无独立样式表 |
| 手写件 | 无抬头、无分隔线、无章 |
| 机构章 | 白名单内,且新增机构纸须同步 |
| 描述性红字 | 计数 == 0 |
| 同族普查 | 每类一条可写判据入项目文档 |
| 说谎禁令 | 引用物件的句子可解析且世界存在 |
| 功能物耗尽 | exhausted 后无可观测输出 |
| 数字出处 | 每个数字解析到年表/可读记录;关键数字 ≥ 2 次 |
| 出处四问 | 每件可交互物件含四字段;平面件倾角非零 |
| 纸面即画面 | 无标题标签/透明叠层/描述红字;材质特征 ≥ 3 |
| 留白总纲 | 因果框架词表计数 == 0 |
行业互证
这些是外部已验证的同向结论,用来支撑上面的规则,不替代上面的判据。
- 优先级 Do > Show > Tell。只要能用玩家行动制造故事就行动;不得不用就展示;口述是最后选择。(Marc Laidlaw, Game Developer)
- 技巧层面同向:脚本、关卡、物件都能承担叙事,不必都由文字承担。
- clutter vs text:一个有索引性的痕迹旁边放一块解释牌,等于剧透。「烟 → 有火」,不是「这里发生过什么」。
- 索引性叙事(Clarissa Fernández Vara 的理论):放痕迹,不放结论——拖痕、这一块干净那一块脏。
- 一个空间只讲一个故事,不叠太多层;必须给玩家「休息」去处理细节。
- 故事与玩法对齐:叙事必须约束玩法,玩法必须兑现叙事承诺——文字层的「未兑现承诺」(第 9 节)与这条同源。
- 旁白应把解释权交还给玩家。有团队明说故事大量刻意留给玩家解释,目标不是「吓到玩家」。
- 态度与压强的机制化(SIGNALIS 报道):环境压迫可以用状态与反馈的形式表达,而不是靠叙事说明。
- 工具与手段的局限:早期开发者社区就在争论「该怎么传达信息」,结论倾向于少字、靠机制与场面传达。
来源
亲历项目(原型实践中提炼,未经公开):元规则与权威顺序、122 句 → 66 句的清扫样本、锁住的门仍报旧挂钩方位(说谎禁令实例)、琴两回 / 八音盒一回的耗尽文案、墙上刻字用墙来读的边界处理。
公开资料:
- Do > Show > Tell、编剧与设计的分工、玩家承担解读——Game Developer: What Every Game Developer Needs to Know About Story
- 书面叙事技巧、痕迹与文本的分工——Game Developer: Techniques of Written Storytelling
- 游戏里的字太多、清理文字的收益、clutter vs text 解释牌——Game Developer: Games Have Too Many Words、Game Developer: Uncharted 4 Postmortem
- 叙事由玩法承载而非弹窗、索引性叙事、环境叙事综述——Game Developer: Outer Wilds 价值、环境叙事综述、美术总监 dev talk
- 压迫性机制、机制化叙事而非说明性叙事——SIGNALIS 报道
- 「该怎么传达信息」的早期争论与少字结论——r/gamedev 讨论