这是一个能在浏览器里玩的小叙事游戏,叫《雨夜集市的信》。
设定很小:一座雨夜的集市,三个摊位,六条线索。你是一名暴雨夜归来的信使,在茶摊、修理摊、花摊之间走动,查看线索、向摊主问话,最后在集市门口做一个不可逆的选择——一桩没说清的旧事,是把它压在私下里、保住集市那点脆弱的默契,还是公开它、逼出一次公共追责,又或者两个干净的答案都不接、回头要求补更多证据。三条结局,对应三种"这座集市能承受哪一种真相"。
它不是一份概念稿,也不是内部截图。它有手绘质感的雨夜背景、人物立绘,纯文字版就能从头玩到尾;三个结局都被独立跑过,确认可达。但这篇要讲的,不是"AI 又生成了一个游戏"——那早就不稀奇了。要讲的是这一局里它给自己立的、也是最难守的一条规矩。
如果你想先看产物,可以直接试玩: Rain Market Letters — Chapter One。 源码与下载: GitHub demo repo。 这篇用到的生产方式也单独整理成了可复用技能: Narrative Browser Game E2E。
最较真的一条规矩:故事只能有一个出处#
叙事游戏配上生成美术,最容易翻车的地方,恰恰不是画得好不好看,而是画面太好看,会悄悄替你把故事给定死了。
一张漂亮的背景里,多出一把不该有的刀、一个像案发现场的符号、一句和线索对不上的招牌字——观众会默认它是设定。于是图就成了事实的来源,而不是事实的投影。一旦这样,整个故事的"真相"就散落在一堆图片里,谁也说不清到底哪句算数。
所以这一局,最较真的约束只有一条:故事里的事实,只能有一个出处。
整章的真相——每个摊位发生过什么、每条线索指向谁、三个结局各自意味着什么——先全部写进一个故事源文件,锁死在那里。然后才动手做画面。背景、立绘都可以生成,但每出一张,都要回头跟那份故事核对一遍:这张图里有没有混进契约里没有的东西?只要图自己"加了戏",这张就作废、重画。
一句话:画面只能照着故事来,不许偷偷改故事。
它是怎么被生产出来的#
和这个系列里的其他案例一样,它大致分三层:规划、执行、校验。
规划。 先定下故事契约:三个摊位与门口节点、六条线索各自携带的事实条目、三个结局的语义,以及那个收尾抉择的解锁条件。每条线索不是"写得有气氛一点",而是一个带明确事实标注的槽位——它是后面抉择能不能成立的弹药。
执行。 先做"能玩通",再谈"好不好看"。最早连一张正经图都没有,纯文字就能从三个摊位一路走到三个结局。美术是后补的一层,通过一份素材清单绑定到具体场景和角色,而不是散落在界面代码里。
校验。 三个结局是不是都真能走到?那个关键抉择,在线索没集齐的时候是不是真的锁着、不让你乱选?画面上看到的、状态里记的、结局那段文字,是不是同一套说法?这些都被逐条跑过、对过,而不是靠"感觉差不多了"。其中那个抉择的门控尤其关键:线索不够时,可选项是空的——它宁可不让你选,也不给你一个凑出来的假选择。
一个诚实的边界:它现在还需要一台服务器#
这游戏跑通了每一项自动校验,但它有一个一点都不光彩、却很说明问题的边界:你把它下载下来,双击打开,看到的是一片空背景。
原因很无聊也很真实:它要在运行时去读那份素材清单,而浏览器出于安全,会拦住本地文件(file://)的这类读取。换句话说,它需要被一台服务器"端"出来——挂到一个在线页面上,或者本地起一个最简单的服务——图才会显出来。直接双击,故事文字还在,画面却是空的。
这件事本身不大,一个在线链接就能绕过去。但它正好戳中这个系列反复在讲的那条缝:“生成出来"和"能交到一个陌生人手里”,是两回事。 自动校验全过,不等于一个随手点开的人就能看到你想让他看到的东西。把这条边界诚实地标出来,比把 demo 说成成品,重要得多。
这件事真正说明了什么#
它不能证明"多 Agent 已经能自动做任意叙事游戏"。案件的规模、线索结构、结局设定,仍然是人工预先框定的,Agent 是在框架里填内容。
但它说明了一件更具体的事:当生成美术介入叙事时,真正决定它跑不跑偏的,不是模型画得多好,而是你有没有把"真相只有一个出处"做成一条硬约束。 让画面只能投影故事、不能反过来定义故事;让每一张图都要回去对一遍契约——这是把"AI 出图"从一个会偷偷加戏的变量,收成一个可控的产物的关键。
至于那台还甩不掉的服务器,它是个很好的提醒:一个能玩的 demo,和一个陌生人随手就能看到的东西,中间还隔着一段不该被跳过的路。
局限声明:本文基于单次运行的单个案件(n=1)。故事骨架(摊位、线索、结局、抉择条件)为人工预先设计,Agent 在框架内填充叙事内容而非自主创作案件。当前原型为线性推进,不支持自由探索或多路径分支;所选生成美术为原型基线选择,非最终美术验收。所有结论仅适用于本次运行的特定约束与模板条件,不应泛化为多 Agent 系统的一般能力判断。