如何讓玩家擁有獨一無二的故事體驗?淺談程式化生成敘事

Canny發表於2021-05-31
本文首發:騰訊遊戲學院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(《中土世界:暗影魔多》)


來源:騰訊遊戲學院GWB

相關文章