可能太干而没人看?《星舰铳犬》叙事结构的两难&管理海量文本法

  大家好,我们是宇宙殖民工作室,是即将在2月20日发售的视觉小说《星舰铳犬》的开发组,来自联合王国的威尔士。

  今天,我们想来分享一个非常干的话题——叙事结构和海量文本的处理办法

  由于这篇文章可能比较偏向纯开发者向,所以我们认为,可能会比较枯燥。但是这确实也是之前有不少中国玩家提出希望知道的。本着分享的目的,而非流量,所以刊发在此。希望大家能够喜欢。

  《星舰铳犬》的主要故事发生在《铳犬号》这一空间中,是整个太阳系物语的一个微观断片,所以如我们之前所说,我们擅长描绘微观图景,而非宏大叙事。当时项目立项时恰逢疫情初期大家都被迫在家隔离,和“卡在驾驶舱里却帮不上忙”这种状态在情感上有几分相通——都是无能为力地困守在一个封闭空间里。Jonathan常开玩笑地说,玩《星舰铳犬》就能体会我的 2020 到 2024 心路历程,其实也不算夸张(笑)。

  玩过试玩版的话,你会发现,《星舰铳犬》的每一幕都让玩家角色“从某件事已开始”的状态中出现,因为我们觉得直接把玩家抛到进行时比从头铺陈更有效,还能给玩家一些留白,让他们自己推想:上一幕和这一幕之间到底发生了什么?对融入角色的情绪也更有帮助。

  叙事结构上的两难

  从类型上看,《星舰铳犬》确实有点“既不像纯视觉小说,又不像纯日式文字冒险游戏(ADV)”。我更愿意叫它“图形冒险(graphic adventure)”,但这称呼也很模糊。它兼具视觉小说的文本量和分支剧情,同时也提供ADV 式的探索与交互,稍微比传统视觉小说玩法多样,又比经典ADV 游戏(比如我最爱的小岛秀夫监督的早期作品《Snatcher》)的解谜要素更轻。

  这种混搭形式的难点在于剧情结构的编写。纯视觉小说只要依照玩家选的对话分支推进,纯冒险类游戏(ADV) 则往往把情节锁在几条主线或特定解谜环节。可在《星舰铳犬》中,你既能在不同地点来回走动,又可能在多条对话线里触发额外事件。庞大的变动量,自然会催生出大量的可选文本。

  举个试玩版里的例子(小剧透):和汉森打完之后,玩家去舰桥见凯西,那场战斗可以有四种结局,所以与 凯西的对话也随之变化。如果你先前还在另一个场景拿到了一块巧克力并交给她,对话则会出现更多分支——并不是简单地把“巧克力”给她,她收到这么简单,而是让她之前对玩家战斗表现的反应,与收到巧克力的剧情结合,形成不同的对白和情感波动。(注意:我们游戏中有很多剧情变化,但是目前大家体验到的内容可能让你感知不明显,这点我们也再想办法看要怎么提升。)

  这只是冰山一角。后面的故事里,玩家过去的好几个决定都会叠加在一起,让剧本的分支成倍增长。尽管主线剧情大方向依然是比较线性,但这些细节仍然让我们花了很多心血,但我们并不后悔,因为正是这些细微差异,让《星舰铳犬》具有某种独特的变化感。

  由于玩家可以在游戏里自由出入不同场景,所以我并没有像传统 VN 那样按“路线”把文本拆分成不同文件,而是分成一个“主脚本”文件(核心叙事)和一系列“场景脚本”文件(相当于各个地点)。它们都按时间顺序排列,并且针对不同逻辑状态进行标注。

  管理海量文本的方法

  既然玩家可以自由进出许多场景,我就不能像一般视觉小说那样分“路线”来写,所以我把内容拆分成一个主脚本文件(主线剧情)和若干个场景脚本文件(每个地点对应一个文件),用时间顺序和逻辑分支来标注。

  这种做法带来的问题是:文件越写越多,分支越理越复杂,到后来文档可能显得又长又冗繁。也正因此,Ben(程序员)在“Operation M”中开发了新叙事引擎,希望能让剧情的编排更直观、逻辑关系更清晰。

  在此之前,我主要通过流程图来追踪剧情,每个事件在时间线上发生的先后次序、原因、与其他事件的联系都能一目了然。下面是一个高层示例图(为防剧透,进行了缩放),但你可以想象,如果要把所有细节都纳入,还会更庞杂。

  伪代码:让脚本更易导入

  为了能让上述工作更加高效有机,工程师Ben给了我一份 Ren’Py 可以识别的“命令简表”,我就可以一边写台词,一边加伪代码指令,最大化减少编程时的重复劳动。当然,一些比较复杂的操作还得 Ben自己另行搞定,这也是为什么他会在“Operation M”中直接做一个功能更强的叙事引擎。

  其实,开发中还有非常多的心得和感悟,但是我们暂时只希望针对大家玩过的体验版来说一些分享,最关键原因是我们只想要先介绍大家玩过的内容背后的制作趣闻,对于还没有放出的正式版内容,我们既怕剧透,也怕提前说的太过,以至于被大家认为是过度宣传,就先按下不表,希望发售后能有机会和大家分享。

  总之,这就是我这次想分享的内容。真的非常感谢各位的支持,你们的鼓励对我们团队来说意义非凡。

更多游戏资讯请关注:电玩帮游戏资讯专区

电玩帮图文攻略 www.vgover.com