游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事

本文首发:腾讯游戏学院GWB
【游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事】作者:Canny 腾讯互动娱乐 游戏策划
程序化生成叙事是什么?如何用程序实现故事创作?是否可以通过程序化生成叙事 , 让玩家在游戏实现真正的“一千个读者就有一千个哈姆雷特”?
2017年 , 好友告诉我上海有个《Sleep no more》的沉浸式戏剧 , 会带给人独一无二的体验 , 一定要抽时间去看 。 作为业余戏剧爱好者 , “沉浸式戏剧”也听说过 , 但这是第一次去看 。
上海的冬夜特别冷 , 麦金侬酒店外排满了哈着白气跺着脚的人 。 整栋建筑五层楼都是舞台 , 当莎士比亚的经典悲剧《麦克白》一遍遍上演时 , 观众可以随心所欲地在5层楼里游走 。 准确地说 , 是奔走 。 为了追上你想要跟随的角色 , 很多时候不得不狼狈地在楼上楼下奔跑穿梭 。

游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事
文章插图

观众都带着白面具簇拥在演员一臂之遥的位置
是的 , 戏一直在上演 , 你可以选择你想去哪儿 , 想看什么 。 Sleep no more像是提供了一个庞大的叙事空间 , 每个走入其中的人体验到的故事都是独一无二的 。 官方还特意设置了一间酒吧 , 用来让看完表演的观众们交流自己刚刚看到的故事 , 聊聊自己没看到的部分 。
拆除“第四堵墙”让观众走进戏剧里 , 让每个人都变成了跳进兔子洞里的爱丽丝 。 不光是戏剧 , 游戏中我们也希望给玩家带来独一无二的故事 。
这就要聊到游戏叙事中一个值得探索的方向了——程序化生成叙事(Procedual narrative) 。
一、什么是程序化生成叙事
在roguelike游戏中 , 程序生成关卡和地图已经不是新鲜事了 , 我们熟知的《洞窟探险》(Spelunky) 中每个关卡都是程序自动生成的 。 设计者制定基本的规划 , 让地块、敌人、物品、出入口按一定规则随机分布 , 玩家每一次打开游戏体验绝不雷同 。 比起手工编辑关卡 , 这种方式用很小的成本实现了游戏内容的极大丰富化 , 对提升游戏可重玩性非常有帮助 。
和关卡类似 , 游戏剧情某种程度上来说也是一种消耗品 , 特别是对于线性剧情的游戏来说 。 文字AVG类游戏通常会提供“跳过已读文本”的选项 , 因为重复观看同样的剧情会让大多数玩家厌烦 。 甚至提前知道结局 , 被剧透 , 也会减损玩家观看剧情的乐趣 。

游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事
文章插图

《探案法》游戏设置“跳过已读剧情”选项
我们希望游戏剧情也能像关卡一样 , 按一定规则自动随机生成 , 让玩家每次体验时都能看到不一样的故事 , 提升其新鲜感和可重玩性 。 进一步说 , 我们还希望故事可以最大程度上让每个人满意 。 萝卜青菜 , 各有所爱 , 我们希望无论玩家有何种偏好 , 都可以在游戏叙事中得到满足 , 每个人都能得到自己想要的 。
可这并不是一件容易的事 。
随机生成剧情本身不难 , 难的是如何通过程序生成让玩家满意的精彩故事 。
我们小时候可能玩过这样一种游戏:在纸条上写好人名、时间、地点、事件 , 揉成团后分类放好 , 然后依次从里面抽出一张纸组成一句话大声念出来 。 这种游戏往往会成为拿同学开涮的好时机 。 因为人名用的是同班同学的名字 , 很多时候会达到一些戏剧效果 , 组成类似“张三早上在家脱裤子放屁”之类的话 。
累积足够多这样的句子 , 能成为故事吗?可以 , 但未必是好的故事 。 我们不能将故事元素拆分 , 单纯地随机组合后推到玩家面前 。 好的故事 , 对于角色(人物)、事件(情节)、场景的编排 , 必定要按叙事目的来进行 , 这样才能传达某种特定而具体的情感或是观念 , 让观众看过后感到有意义 。
二、程序化生成叙事的两种实现思路
在写故事的时候 , 可能会有两种出发点 , 一种是重在编排精彩的吸引人的情节 , 一种是重在塑造令人难忘的人物 。 对于很多剧作者或小说作家来说 , 这甚至是两种不同的创作出发点 。 但往往会发现 , 有的故事情节性强 , 人物却很扁平、脸谱化;有些故事人物刻画栩栩如生 , 情节却如白开水一样平淡乏味 。 不管怎么说 , 大多数好的故事是两者兼备 。
在程序实现故事创作时 , 我们也许可以从这两种角度出发去思考 。

游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事
文章插图

情节驱动 VS 人物驱动
我们可以从人物出发去构建故事 , 定义人物的姓名、外貌、性格、经历(也就是人设) , 再根据这些特性来匹配人物的动机、人物和人物之间的关系 。 把人物建立好了 , 再让人物和人物进行互动 , 自然就产生了故事 。 例如《模拟人生》系列 , 就是从这种角度出发创造了丰富多样的涌现式叙事 。
另外 , 我们也可以从情节出发去构建故事 。
下面我分别举两个游戏的例子来讲讲他们的实现思路 , 也许会带来一些启发 。
【基于人物的叙事生成】Wildermyth
《漫野奇谭》(Wildermyth)是近年来我看到做程序生成叙事最好的一款作品 。

游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事
文章插图

开始随机小队角色
这是一款回合制策略RPG , 玩家一开始可以获得三个角色 , 角色外貌、属性、经历和特性都是随机生成的 , 职业分别是战士、猎人和法师 。 三个角色共同组成一个小队在地图上冒险 , 由玩家操控在战棋式的战斗模式中消灭怪物 。 最开始玩家可以指定三个角色之间的关系 , 是朋友、恋人或对手 , 这会在一定程度上影响后续的剧情对白 。 初始设置完成后 , 三人踏上冒险征程 , 后续的传奇故事由玩家来撰写 。
一进入游戏 , 我立马被多格漫画式的剧情表现形式给吸引了 。 我们知道有些既有表现效果野心 , 又想要让玩家体验叙事自由度的游戏 , 成为了无底洞开发成本的奴隶 , 最后只能用精美的3D过场动画 , 来呈现玩家选择带来的一丁点微不足道的变化 。 而《漫野奇谭》无疑是非常聪明的 , 无论是极简的角色画风 , 还是多格漫画的剧情表现方式 , 他们选择了不给自己挖坑 , 也带来了更大的自由度 。

游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事
文章插图

多格漫画形式的过场剧情
再往后推进 , 会发现游戏的剧情、旁白和人物对话都会因玩家所定义的角色和所做的选择而有所不同 。 一个鲁莽的角色和一个诙谐的角色在面对同一件事时发表的评论完全不同 , 而当一个角色遭遇危险时 , 和他关系是恋人还是对手 , 也会影响另一位角色说出的话是关切还是嘲讽 。 虽然剧情脚本进行了一定随机 , 但无论玩家选择怎样的角色 , 大部分时候都非常自然贴切 , 这是如何做到的呢?

游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事
文章插图

一幕故事由一位作者负责撰写
事实上 , 《漫野奇谭》每一幕的故事都是由一位作者独立撰写的 。 故事作者编写一幕幕演出 , 组成一个演出库 。 他们会标记这个演出需要特定的角色参与 , 例如某个演出指定要领袖、莽夫和傻瓜三位角色 , 这就对应玩家创建角色时的性格特点 。 当玩家选择的三位主角经历到一个情节点时 , 系统便会去演出库里搜寻 , 看有什么合适这三位的演出 。 这好比是开拍的时候 , 根据演员特点从库里筛选合适的剧本 。 每个演出都有自己的演出参数 , 只要演员就位马上就可以开演 。
这种方式的好处在于把控制权交给了故事作者 , 也就是故事脉络和内核仍紧紧由作者把握 , 不会因为程序随机和组合 , 产生无意义或失控的故事 。 但是 , 根据角色特点匹配演出时 , 如果筛选条件过于严苛 , 很多演出都没有机会上演;如果条件过于宽松 , 角色又会前后不统一 , 观众无法从角色行为的一致性上感受到他的性格特点 。
为了解决这个问题 , 他们又加入了一些细节设置 。 游戏里每个事件都会有一套标记系统 , 可以让作者根据参演角色特定的性格、关系 , 甚至是玩家在游戏中宏观的一些状态 , 来设置一些不同 。 这是从喜剧演出中寻得的灵感 , 在剧场上演的喜剧常常会有即兴发挥的部分 , 即是剧本之外的带有演员个人理解的发挥 。 这种发挥往往让观众感觉到更真实可信 。
制作者接受采访时也透露 , 他们曾尝试过基于情节去做故事生成 , 但发现太难实现了 。 你可以安排玩家遭遇随机事件 , 但体验一连串毫无关联的事件并不能让玩家感觉到“意义” 。 没错 , 一个好的故事必须要将事件组合成有战略意义的序列 , 从而激发特定而具体的情感 , 或表达一种特定而具体的人生观 。
在基于情节生成叙事这点上 , 我们可以看看另一个例子 。
【基于情节的叙事生成】80Days
《80天》(80Days)是一款基于凡尔纳原作改编的叙事类杰作 。 这款游戏中我们能看到很精妙的基于情节的叙事生成 。
游戏讲述的是 , 为了完成和别人打的一个赌 , 福克和仆人路路通要从伦敦出发 , 在80天以内环游地球一圈 。

游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事
文章插图

一个赌注把一对主仆送上险象迭生的奇妙旅程
游戏并非一开始就将整个地图的路线铺开在玩家眼前 , 而是让玩家在每个地点对即将踏上的几条路线和目的地做决策 。 在各地购买火车路线图、轮船航班表等物件的话 , 可以挖掘出自己能走的更多的路线 。 衡量要走哪条路的同时 , 玩家还要考虑路费、福克的健康状况、花费的天数等因素 。

游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事
文章插图

从伦敦启程 , 一步步展开的路线规划
整张游戏地图可看做是由各个地点和其之间的可通行路线组成的一张有向图(如下) 。 以伦敦为起点 , 每次启程玩家都可以从1至N个地点中选择一个作为下一个目的地 , 在那里停留一定时间 , 经历一些事件 , 然后再次启程 。 这种“图”式的叙事结构 , 比起以往树状的结构来说要讨巧很多 , 因选择而形成的实际路径数量要多得多 , 两个玩家游玩这款游戏时几乎很难走到完全相同的路线 。
事件中玩家会经历一些选择 , 绝大部分选择对于实际游玩路径和通关并无影响 , 但在故事上会带来完全不同的体验 。 一个选择可能带给你一段风流的艳遇 , 而另一个不解风情的选择则会让你错过 。 非常巧妙的是 , 一些早期经历里的选择 , 会在后续经历的事件中得到呼应 , 这确实给人一种玩家能影响故事的感觉 。

游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事
文章插图

由国外玩家整理的4-5次通关后所涵盖路线的大地图
制作者使用自行开发的Ink引擎来实现 。 我曾看过他们的介绍 , 这个引擎是为了在创作互动叙事时 , 对编剧(剧情策划)更友好而设计的 。 不需要像传统开发时填excel表 , 或是写lua脚本把游戏剧情文本用引号插在代码逻辑中 , 而是直接写下剧情文本 , 插入少量的代码来实现逻辑 。
下面是游戏开头一段剧情在Ink中呈现的脚本示例 。 我们会发现文本中的选择部分前打上了各式各样的标记(zany和dull) , 玩家在前段做出的选择 , 会影响后续能看到的分支文本 。 除了根据玩家的选择进行标记和呈现 , 引擎还支持用简洁的语言来实现重复同一段话时 , 具体表述会有些微不同(橙色部分) , 会根据标记来决定呈现哪种表述给当前状态的玩家 。

游戏|如何让玩家拥有独一无二的故事体验?浅谈程序化生成叙事
文章插图

《80Days》Ink引擎脚本示例
当然 , 工具一定程度上决定了产出效率 , 但能够支撑《80天》实现其较高自由度叙事体验的 , 还是设计者对整个叙事的把控 。 越是高自由度的叙事 , 越需要设计者条理清晰地把控整个游戏体验中玩家经历的前因后果、逻辑顺序 。
据说 , 游戏制作者称 , 整个游戏约拥有75万字的海量文本量 , 而单次游玩通关大约只能看到其中的3% 。 这3%完全是由玩家自己决定的 , 叙事情节和玩家选择路线绑定在了一起 。 海量的文本加上“图”式的叙事结构 , 让每个玩家进行游戏时都能看到独一无二的风景 。
三、总结
或许是因为采用程序化叙事生成的方式可以打破游戏机制和故事的界限 , 让两者更融合 , 玩家可以更多地参与到故事中 , 才让我对此如此感兴趣 。 读者不再是翻不过五指山的孙猴子 , 只能跟着作者定好的路线行走 。 故事会因为玩家的选择、游戏中的状态和属性而变化 , 从而让人真正拥有近似独一无二的体验 。 两个玩家玩过同一款游戏后 , 可以坐在一起好好聊聊自己经历的故事有什么不同 。
但是在使用程序化生成叙事时 , 也需要多加权衡利弊 , 不要为了用而用 。 否则很可能会因为过度追求技术实现 , 导致将事情复杂化 。 要么会有最终生成质量不够好的问题 , 要么会陷入无底洞的开发成本 。
另外 , 我感觉使用程序化生成叙事 , 需要非常小心玩家的信任感破灭 。 当玩家意识到生成的故事有小小的不和谐之处 , 很容易破坏他们对这个故事的信任感 。 或许这可以称之为程序化生成叙事的“无趣谷效应” 。 一旦玩家意识到 , 这只是一个由计算机编造的故事 , 信任破灭 , 他们很快就不会再对这个故事有期待 。
附:
【一些程序化生成叙事案例】
Wildermyth(《漫野奇谭》)
80 Days(《80天》)
Sunless sea(《无光之海》)
Dwarf Fortress(《矮人要塞》)
The Shrouded Isle(《迷雾岛》)
Curious Expedition(《奇妙探险队》)
Middle-earth:Shadow of Mordor(《中土世界:暗影魔多》)

    推荐阅读