唯一的例外可能是《80天:如何以软件工程的思路编写一部互动小说》这篇文章。其中我初步探讨了Inkle工作室在《80天》这个游戏中运用的一种新的思路:构建一种基于文本的世界模拟引擎。这种方法的本质是让叙事内容依附于某种游戏世界状态模拟,而不再是独立于游戏机制的一套自成一体的内容,而成为游戏机制执行过程的一种呈现方式。 事实上,包括《80天》在内的很多新型交互叙事内容组织结构,都能够用Emily Short最先提出的一种“故事块(storylet)”架构来描述。
这种架构由一个“所有可能的游戏世界状态所组成的空间”概念出发,将玩家在一次具体游戏中的经历看作是在这个空间中的游历(Traversal)。叙事作者不能控制玩家具体的游历路线,但是可以给这个空间的子空间赋予特殊叙事含义(Narrative Meaning),并用原子化的故事块去定义这个叙事含义。最后玩家在这个空间中的游历、配合作者分配给不同子空间的故事块,就形成了与游戏机制紧密相关的、由玩家和游戏开发者共同创作的完整叙事。
下面的文字稿来自我在落日间所组织的游戏研究小篝火线上讲座系列所做的一个分享。其中介绍了Emily Short的故事块(storylet)架构,并讨论了这种叙事内容组织架构结合基于大语言模型的叙事内容自动生成能够为游戏互动叙事带来的全新可能性。
交互叙事从定义上来说,指在讲一个故事的过程中,情节的展开不是固定的,而会根据观众对叙事系统的输入而发生变化,这样能使观众产生一种参与到故事之中的感觉。电子游戏因为本身就是以交互性机制作为它的一个核心特点,就很自然地成为交互叙事的平台。
交互叙事有很多种形式。RPG游戏中的对话选择支可能是我们最熟悉的一种形式。除了直接去点选这些对话分支以外,我们还可以直接以游戏中的行动作出选择。还有一些游戏甚至会直接把展示了情节分支结构的流程图展示在玩家面前让玩家直接去选择其中的节点。交互叙事在游戏以外也有很多存在形式,Netflix也在前些年试验过在影视剧中引入一些交互分支。
其实早在计算机远远没有普及的年代,就已经有纸质书来实现交互叙事。当时在欧美有一个非常有名的Choose-your-own-adventures系列的小说。会在情节当中插入一些选择支,根据读者选择哪一个分支,会提示读者翻到指定的页数去看这个选择支对应的故事后续发展。这种交互叙事的实现方式听起来非常原始,但是已经能够实现很复杂的交互叙事结构了。
比如上图是当时的一本纸质书The Cave of Time的情节分支结构图。可以感受到这个规模和复杂性也已经很可观。而实际上,即使是像今天这样,电子游戏的相关技术已经比当年先进了很多,当大家想到交互叙事的时候,也往往脑海里首先浮现的还是这样的流程图结构。
它其实是像小说、电影这样的线性叙事的一个很简单粗暴的扩展。它本质上其实就是去写多个版本的线性故事,然后把这些线性故事共通的部分归并起来。
线性分支的叙事结构,虽然非常普遍,几乎成为了交互叙事的代名词,但它其实是有一些严重的问题的。
首先,去编写线性分支的叙事结构,工作量非常巨大。创作者需要提前去预测玩家行动的所有可能性,然后给每个可能的行动都编写一个后续。而即使是这样,玩家往往都还会抱怨游戏的自由度不够。
另一个问题是,这样的叙事,与游戏机制本质上是分离开来的一套另外的系统。创作者在写故事的过程中只能参考当前所写的这个事件之前发生的那些事件,但是他没法去参考实际游戏中发生了什么。
这就造成这个很著名的问题——英文叫做Ludonarrative Dissonance,中文翻译为叙事失调问题。它指的是游戏中讲故事的那个部分和游戏玩法的部分之间会有矛盾冲突,影响玩家的沉浸感。一个很典型的例子就是巫师3中一个玩家可能每天都在沉迷昆特牌,但是在剧情中却把主角当作是在一门心思找失踪的女儿来看待。
如果我们去认真思考这两个问题,可能会想到同一个解决方案。
那就是有没有可能不去做这样一个跟游戏机制分离的叙事层,而是让叙事从玩游戏的过程中自然而然地浮现出来,也就是让游戏机制本身成为一个叙事引擎?
我们考虑一个非常经典的例子——矮人要塞,这是纯沙盒模拟的游戏,它几乎没有任何编剧事先设计好的剧情。它也是一个以涌现叙事著称的游戏。网上流传挺多的这个游戏在玩的过程中会冒出一些非常精彩、但是没有人一开始设计好的那种情节——比如猫的离奇死亡。
那么我们有没有可能将这种完全的涌现叙事推广成为一种解决线性分支叙事的问题的一般方案呢?
首先,一个显而易见的问题是,像这种沙盒游戏,虽然偶尔会有非常精彩的情节浮现出来,但是绝大多时候的游戏实况是没法给你一种像“读了一个精彩的故事”那种享受的。如果你直接把玩游戏过程中玩家的行动、NPC的行动、系统的行动记录下来去阅读,那甚至你读到的东西80%都是无意义的。它更像是在读一个系统日志,非常的微观和琐碎,而精彩的情节是要站在一定程度的宏观角度才能出现的。
另一个问题是,如果你的叙事引擎完全只是一个沙盒,那到底哪里还有创作者去进行表达的余地呢?
毕竟读一个故事的诉求和玩一个游戏的诉求是不完全一样的。当我们读一个故事的时候,很多时候我们是在读这个故事的作者,是在通过故事走进作者的内心,它其实是一种交流沟通的行为。这种体验不是我们能够在纯沙盒游戏中获得的。
刚刚我们的讨论其实暗示了一个非常根本的问题:就是在创作者的表达和玩家的自主性之间似乎存在着什么根本性的冲突。
这里我们可以看到一个区间,越往左边表示玩家自主性越强,越往右边表示创作者的表达空间越强。这个区间最左边的位置就刚好对应了我们刚刚说的沙盒游戏,而最右边则是我们最开始说的那种线性分支结构的叙事。
市面上绝大多数的作品往往是在这两个极端的中间,但我们发现它们的叙事多多少少都会偏向两个极端之一,意味着在玩家自主性和作者的表达之间,只要强调了其中一各方面,似乎就要牺牲另外一个方面。
而交互叙事之所以困难,就在于它实际上追求的是一个很难达到的目标:
同时兼顾玩家自主性和创作者的表达。
接下来我们来介绍一种比刚刚介绍的两种方案看起来更有希望的第三种方案。
这种方案最初由Emily Short在一部基于网页的文字冒险游戏《伦敦陷落 (Fallen London)》中提出。方案主张把叙事内容组织成一种叫做Storylet的结构。Storylet中文我们把它翻译成故事块,一个storylet指的是一种原子性的叙事内容模块,用来组装成完整的叙事。
熟悉Jonathan Blow的朋友可能会认得这张图。这是Jonathan Blow的他的一个GDC演讲上提出来的。他认为一切游戏都无法逃开这个最基本的主循环结构:首先接受玩家输入,然后进行一番游戏规则驱动的模拟,最后把模拟的结果用某种可视化的方式展现在玩家面前。 在这个过程中实际上完成的是世界状态的根据玩家行动的一个变化。这个世界状态。你可以理解为是游戏中用来记录当前游戏状态的所有那些变量的总和。比如RPG游戏里可能有玩家的血条、蓝条、攻击力、防御力之类,战略游戏里可能有每个基地的兵力、资源之类。
游戏的过程就是不断地接收玩家的输入,根据玩家的输入和当前的世界状态,根据游戏规则得到下一个时刻的世界状态。
现在我们有了这个世界状态的概念。我们可以想象一个所有可能的世界状态所组成的(数学意义上的)空间。一个世界状态由一组变量的取值来定义,那么我们就可以想象每一个变量都对应一个坐标轴,这些坐标轴组成了一个非常高维的空间,其中每一个状态变量就对应了一个维度。
现在我们来看一个具体的例子。想象一个类似文明、帝国时代、魔兽争霸那种即时战略游戏,这个游戏里有三个势力在互相作战:有一个现在正在掌权的帝国、有一个想要推翻帝国统治的民主共和势力,另外还有一批人想要复辟旧王朝。作为一个即时战略游戏,它的世界状态肯定是要有非常非常多的变量来描述的,但我们现在简化一下,假设就三个变量,分别对应了这三个势力现在的力量强大程度和他们的胜算。每一个变量对应一个坐标轴,我们就有这样一个简化的三维空间,这个空间中每一个点都表示一种世界状态,离某一个角距离越近,就表示这个世界状态中这个角对应的势力越强大。
(注:这个例子改编自Emily Short在2024年的国际会议Foundation of Digital Games上的一个演讲How Many Storylets Are Enough? Scoping Your Systemic Narrative)
现在,假设你要在这个游戏基础上讲一个故事。比如你要讲一个民主共和体制优于专制统治的故事。大家可以想一想你一般会怎么去讲这个故事。
一般人可能会想,那这个民主共和新政府肯定最后得获得胜利。但是最一开始,因为帝国是当权的,所以帝国肯定最开始是最强大的,后来新政府渐渐累积实力,开始跟帝国抗衡,中途可能还冒出这个旧王朝复辟势力来搅了一下浑水,最后帝国和新政府展开了命运的决战。我们一般写故事都会采用欲扬先抑的做法,所以我们会让帝国最后占据一个绝对的优势,后来新政府通过一个巨大的逆转,还是取得了最后的胜利。
我们可以看到,这个故事可以表示成为这个世界状态空间中的一条路径。随着我们这个故事进程的发展,这条线会在不同阶段有不同的世界状态变量的取值,我们实际上是在用这些世界状态变量取值的变化在讲这个故事。其实这也是传统的线性叙事的做法。
但是另一方面,玩家也在玩这个游戏。玩家玩这个游戏的过程,实际上也在这个世界状态空间中画了一条路径。可能玩家所扮演的势力一开始跟旧王朝复辟势力很友好,跟他们是盟友,帮他们打了很多胜仗。后来随着玩家探索地图,他逐渐发现了另外两个势力。他本来想去打帝国,结果出现几个重要的操作失误,导致最后帝国赢了。这整个过程完全是由游戏机制和玩家的操作决定的,跟作者想讲的故事没有任何关系。
到这里我们就会发现,这个叙事失调问题的本质是什么?它实际上是游戏的玩法和游戏的故事在争抢这个世界状态空间中的游历路线的控制权。如果控制权完全交给游戏的玩法,那就没有任何故事可言。但如果为了讲这个故事,时不时去强行改变当前的游历路线——比如说新政府明明输了,我们非要来个剧情杀说这个时候忽然天降大火烧死了帝国军,就让玩家觉得他在这个游戏中的行动实际上是没有有意义的后果的。
那这样的话,我们该怎样去以一种不会与玩法产生竞争的方式去讲故事呢?这里我们就要说到故事块思想的核心了。
我们现在来重新定义一下叙事。不再把它看作是一个具体世界状态空间中的游历路线——因为这个游历路线已经交给游戏的玩法去控制了——我们把叙事看作是对世界状态子空间所做的诠释。 这是什么意思呢。我们现在来看一看,在这种故事块的思想下,我们会怎么讲这个“民主共和大法好”的故事。
首先我们要识别出这个世界状态空间中具有叙事意义的那些子空间。比如说这里,如果世界状态处于一个中间的位置,也就是三方势力没有一方有明显胜算的位置,这就是一个比较平均的、信息量不大的、或者说熵值比较高的状态。这些状态对于我们讲故事没有很大的重要性,那我们就不去管它,或者你可以认为这些状态下的叙事是完全交给玩法的。
但如果你去看这里三角形的三个角,也就是三方势力有其中一方占了压倒性优势的那些状态,这些状态就很值得关注了。为了能讲好我们的故事,我们需要去对这些状态做一些解读。
比如这里,为了讲一个“民主共和大法好”的故事,我就可以这样。如果最后确实是这个民主共和新政府获胜了,我就可以播放这样一段剧情: “新政府的建⽴引进了全新的民主共和体制,⼈民群众终于当家做主,不再将⾃⼰的命运寄托在某个独裁者⾝上…”
当然我是控制不了最后到底谁会获胜的,但是我可以向玩家表达我对那些其他剧情走向的解读。比如如果帝国最后获胜了,我就这样去描写结局:"帝国的暴政继续持续,⼈们的⽣活民不聊⽣"。而如果旧王朝复辟势力获胜了,我就这么写:“暴君被推翻,⼈们憧憬着新⽣活,然⽽灾难很快又再次重演”。
因此这里我们看到,故事块叙事的核心思想就在于,我控制不了玩家在这个世界状态空间中会走到哪里,但是我可以通过对不同的子空间进行解读或者诠释来表达我的叙事意图。
当然你也可以让一个故事块的发生去影响世界状态,比如说如果帝国赢了,这个游戏里又有一个国民满意度的数值,你可以定义说这个故事块的发生会产生降低国民满意度的结果。
但是这种做法就需要讲求一个适度。因为这种做法实际上也在跟游戏机制争夺对世界状态变化的控制权。
因此这里就有一个跟传统的线性叙事的一个本质上的差异。传统线性媒体是在用一个具体的事件序列来进行表达,而在游戏中,尽管游戏的玩法现在夺走了对这个具体的事件序列的控制权,但它也同样提供了一个全新的可能性——就是用这整个事件序列的可能性空间来进行表达。
那么故事块叙事,通过将这个对具体事件序列的控制权交还给游戏的玩法,来解决这个叙事失调问题。
那么这里总结一下,传统的线性分支叙事是这样的结构:我有很多事件,这些事件相互之间有依赖关系,一个事件可以派生出很多事件,很多时间也可以汇集成同一个事件——这些都需要作者一开始设计好。
故事块叙事架构首先要将这些事件之间的依赖关系去除,然后将所有的依赖关系都转变成是事件对世界状态的依赖关系。作者只去设计这些模块化的原子叙事内容,然后由玩家的行为和游戏机制来决定这些叙事模块是如何组装成为完整的故事的。
至此我们讲了一些故事块叙事架构的大致的原则和设计哲学,我们没有具体讲如何在实际的游戏设计和开发中实现和应用故事块架构。关于这些具体的主题,如果大家想了解的话,可以去阅读下面这三篇落日间最近发布的文章:
那么我们刚刚讲了那么多,其实都是在说如何解决这个叙事失调的问题。
那么还有另一个问题,就是工作量巨大的问题,其实还没有从根本上得到解决。
我们前面说要将事件之间的依赖关系转变成事件对世界状态的依赖关系,但是世界状态可以包含非常非常多的内容。之前的例子是为了简化,所以只谈及了三个变量,但一个实际的游戏会需要非常多的变量来描述世界状态。
回到这个例子。我们现在考虑帝国获胜的这个三角区域。虽然这个区域中所有的世界状态中都是帝国最强大,但它们还是有区别的。
比如左下角的这个顶点和右下角这个顶点就不一样,左下角这个顶点的世界状态下,帝国的主要威胁是旧王朝复辟势力,而右下角的顶点中帝国的主要威胁是新政府。
更别提还有很多其他这里没有提到的描述世界状态的变量。同样是帝国获胜,在获胜时有哪些帝国的人物还活着、那些已经永久死亡了,都可能在不同的世界状态下不同。
这种情况下我却用这样一段静态的剧情去一刀切地描述这整个三角区域。那要么我的剧情得说得很抽象,不去提及那些具体的细节。而如果我提及了具体的细节,就有可能会在这些细节不成立的那些世界状态造成叙事失调。
解决这个问题的方法是继续去细分这个三角形的子空间。
大家可以想象,这个过程是可以一直进行下去的。在最极端的情况下,假设我的世界状态由n个变量来描述,每个变量有m个可能的取值,那我难道需要编写m^n个故事块?
这个工作量显然不是人力可以承担的。因此在实际操作中,这样的细分都会停止在某个阶段。因此在局部还是会或多或少的有叙事内容过于抽象或者叙事失调的问题。
这个时候我们可能就会想到,有没有可能去自动生成叙事内容。这样作者就不用提前去为这么多可能性做设计,而是根据实际玩游戏的时候的世界状态去临时针对性地生成叙事内容。
那么有关叙事自动生成的具体技术,我也不打算在这个讲座中多做介绍。欢迎大家去看我之前的两篇文章:
今天我想详细聊一聊的是最近流行起来的大语言模型给叙事生成带来的可能性。
传统的线性故事情节描述的是非常具体的人物和事件,比如下图是伊索寓言中的一个童话故事:
传统的故事呈现在观众面前的样子,就是作者完成它时的样子,不管面对的是怎样的观众,或者说不管玩家在游戏中做了什么,他看到的叙事内容都是同一个样子。
作者必须在最开始的故事中就写清楚每一个细节,才能让读者感受到其生动和精彩。而作为代价,这种生动和精彩面对每一个观众都是相同的,不可能为不同的观众定制。
而大语言模型带来了一个全新的可能性,它允许作者先以某种方式定义自己抽象的叙事表达意图,然后将这个叙事表达意图的具体实现推迟到观众加入的那一刻,并根据观众的情况来为他们定制这个具体实现的形态。
比如说,上面这个伊索寓言中的故事,实际上是在讲一个“好人有好报”的故事。我们可以将它的内容本质抽象出来,得到下面这样的的情节梗概:
这个故事梗概就像是一个模板或者公式,不管填入什么具体的内容,都可以保证讲的是一个“好人有好报”的故事。
如果这个故事发生在一个游戏中,我们就可以根据玩家的行动和游戏中的世界状态来决定应该将怎样的具体细节填入这个模板。
假设现在游戏中有鸽子、蚂蚁和猎人三个人物。每个人物都有生命值、口渴值和饥饿值属性。当蚂蚁的饥饿值为30, 口渴值为80的时候,针对“人物1遇到了危险”这个情节的具体展现方式就可以是:
蚂蚁⼜渴了,到河边去喝⽔。蚂蚁不⼩⼼掉进了河⾥。
而如果现在蚂蚁的饥饿值为80, 口渴值为30,就可以生成与这种世界状态更相符的情节:
蚂蚁肚⼦饿了,到树下的草丛中寻找⾷物。⼀阵风将蚂蚁吹到了河⾥。
即使蚂蚁这个人物在游戏中不幸永久死亡了,剧情也不会进行不下去,我们可以换另一个人物来执行这段故事:
鸽⼦在树丛中飞过。猎⼈尝试射杀鸽⼦。
我们甚至可以在一个完全不同的世界观和人物设定下讲这个"好人有好报"的故事。下图是这个故事在斯坦福小镇设定下的具现化: 在这种创作方式下,作者所创作的不再是观众最后看到的作品的最终形态,而是一种中间形态,这个中间形态定义了作者的叙事表达意图,但没有定义这个叙事表达意图具体应该以什么样的方式实现。
通过作者控制权在“叙事意图该如何实现“这个问题上的撤离,我们留下了让玩家和游戏机制参与进叙事内容创作的余地。最后呈现在玩家面前的叙事内容,是作者、玩家以及游戏机制三者的共同创作——在作者拥有一个大方面上的控制权的同时,还与涌现叙事的可能性兼容。
如果说传统的线性叙事对应的是世界状态空间中的一条路径的话。这种抽象的情节梗概,在大语言模型的翻译下能够对应于世界状态空间中的一个面了。
因此尽管作者编写的还是一个线性的故事,在大语言模型的加持下,这种抽象化的表达也能实现从线到面的转变了。
之前我们在故事块叙事架构中说到,交互叙事的作者应该将具体情节的控制权交给玩家和游戏机制,而用这个情节的可能性空间去进行叙事表达,以此来解决叙事失调问题。
现在我们则进一步提出,在赋予每一个子空间的模块化叙事内容上,作者也应该放弃去设计非常具体的、静态的叙事模块,而是去设计一个接收世界状态作为输入,然后输出动态的叙事内容的叙事函数。大语言模型能够帮助我们去实时地计算这些函数的值。
这样我们就能够还是只用一个故事块去支撑一整个子空间的叙事,而不是像我们前面讲的,去无限地细分这个子空间。我们去赋予这些子空间的内容,现在变成了具有连续性的叙事内容,而不是像原来那样是离散的叙事内容
以这种方式,我们能够以相对较少的工作量,去提供更加生动具体的叙事内容,并最大限度地减少叙事失调。
我们在Autodesk Research的团队在今年的Foundation of Digital Game国际会议发表了一篇论文具体介绍了实现上面这种创作方式的一个叙事生成系统,也欢迎大家阅读论文。 今天的这个分享,我们探讨了互动叙事面对的根本性难题:平衡创作者表达和玩家自主性的问题。
将具体的情节的控制权交给玩家和游戏机制
通过情节的可能性空间来进行叙事表达
根据具体世界状态和作者的叙事表达意图来实时地生成叙事内容
其中前两点是由故事块(Storylet)叙事架构提出的设计原则,而第三点则是生成式AI所带来的技术上的可能性。
有了这样的设计原则作为指导,又有了技术上的可能,我个人愿意相信我们将很快看到能够真正兼具创作者表达和玩家自主性的作品。
而这也将是生成式AI为我们带来的真正意义上的新的叙事表达艺术形式。
作者公众号: junjunstorytelling
评论区
共 3 条评论热门最新