將作家變為程序員:如何做更快速、更可持續的劇情研發?
對於很多遊戲而言,故事劇情是帶給玩家沉浸感非常重要的因素。然而,對於大多數的團隊來說,劇情寫作是個很棘手的問題,在缺乏編程知識和工具的情況下,很可能需要巨大的工作量,而且往往很難做出比較優秀的劇情設計。
在此前的GDC演講中,《林中之夜(Night In The Woods)》開發商Secret Lab工作室的Jon Manning與美國知名作家Ryan North探分享了劇情工具Yarn Spinner的研發過程,並討了如何更快速、更可持續劇情工具的研發,並提出了將劇情作家變為程序員的想法。
以下是Gamelook聽譯的完整內容:
傳統遊戲劇情創作工具的問題
Jon Manning:我們今天要分享的內容包括什麼是灰盒劇情(Greyboxing Narrative),如何節約時間和資金以及如何寫更好的故事,還會向你們展示劇情作家成為程序員的想法,那怕只是一點點。
我是Jon Manning,在澳大利亞一家小公司Secret Lab工作,我們最著名的遊戲是《林中之夜》,我還是Yarn Spinner項目的主開發者。
Ryan North:
我是Ryan North,是很多暢銷書的作者,比如《Romeo and/or Juliet》、《生存還是毀滅(To Be or Not To Be)》、《萬物發明指南(How To Event Everything)》、《恐龍漫畫(Dinosaur Comics)》以及漫威系列中的無敵松鼠妹(The Unbeatable Squirrel Girl)等等。
遊戲領域,我參與過《命運2》的DLC(Curse of Osiris)的創作和《Stick it to the man》,而且我也做過一些遊戲研發,並不只是作為劇情作家。
Jon Manning:
很多對話工具都是以節點為基礎的,每行對話都是圖表裡的一個節點,而且這些節點都是相連的,如果一個節點有多個連接,意味著這裡是有選項的。這是絕大部分劇情設計工具的結構,你可以在資源商店找到。
還有很多工作室根據自己的需求打造了自己的工具,比如Obsidian的工具以及Double Fine的工具,這些公司都曾在GDC分享過他們的工具打造經驗。
比如以上這些演講標題,感興趣的讀者可以去回顧。
所有這些工具都是結構化的數據入口,我們可以將其稱之為做對話設計的「圖形」方法,這種視覺化的結構是很容易理解的,你可以從結構中得到很多信息。不過,這些圖表做起來並不容易,因為有時候要從節點內外的視角進行切換,並且在不同節點之間劃線,很容易搞混。
Ryan North:有一個比較好用的工具是表格,它適用於很多簡單的事情,而對有支線的故事來說,這種方法就沒那麼有效率了。我之前也用過這些工具,它們也能完成工作,但你總會想著:是否有更好的方法?
Jon Manning:有這樣的方法,我們過去一直用兩種方法替換,而不是單一的用圖表或者表單方式做劇情設計,我們將兩者綜合,將對作家友好的電影劇本(screenplay)方式與對程序員友好的語言方式進行融合,我們打造了很多的工具,但需要聲明的是,這是可以廣泛應用的技巧。
因為,我們希望既有流控制,又讓劇情寫作更加簡單。
劇情編程語言Yarn Spinner是什麼?
Yarn Spinner是我們用了很久的工具,它是一個電影劇本工具和玩法腳本語言的結合,作為劇情作家,你可以直接寫下對話,也可以做更多事情。
Ryan North:
很高興你提到了電影劇本工具,我用過這樣的工具。表單更適合比較線性化的劇情,尤其是在互動電影式的玩法當中。
不過,你會覺得,這是我們已經擁有的工具,它和我們用的工具沒什麼兩樣,他不是為了玩法而設計,而是為了電影劇本。
Jon Manning:從這個角度來說,Yarn Spinner還是一個完整的編程語言。
Ryan North:所以這就是比較有趣的地方,當你將劇情作家變成了程序員,這就是我們今天的話題。這就帶來了非常有趣的工作流和能力。
Yarn Spinner並不是第一個創造劇情遊戲編程語言的工具,遊戲業最早從Infinity引擎就已經開始嘗試這麼做,比如《博德之門》就使用腳本語言來控制對話。Double Fine也在GDC分享過,他們在《Brutal Legend》和《Broken Age》也做過類似的事情。
不過,有時候你甚至連幻想都沒有,我曾經用Word寫過腳本,還用過在線文檔,我曾在Google Docs寫了整個支線劇情,並且標出了節點,這可能會得到非常混亂的結果,而且整個過程是非常痛苦的。
比如這張圖片中,我是為一款遊戲寫的腳本,教授在使用她的黑板,但需要拷貝大量的東西,而且效率並不高,並不是好的工作流。
Jon Manning:
Yarn Spinner是一個開源項目,並且發布到了GitHub供所有人免費使用,它的靈感很大程度上來自Twine,最初是為《林中之夜》打造的。
Ryan North:Twine用起來可能會有些混亂,這是我的小說《生存還是毀滅》的截屏,你可以看到節點,但很難看出故事發生了什麼。我試圖用這些不同顏色的標記來解釋故事階段以及角色。
即便如此,我還是對它做了大量的簡化,只留下了截屏和圈圈,看得出那個點代表了故事裡的哪個部分。當你增加變數的時候,它只能變得更複雜,很多東西的追蹤在這種視角下都是不可見的。
Jon Manning:Twine比較好的一方面是,它有非常簡單的文本,即便是非全職編程人員也可以用,我們借鑒了這一點。所以Yarn Spinner使用了Twine一樣的文本和電影劇本語義來創造信息語言。這裡的文本和line是單句的對話,意味著電影劇本形成了Yarn代碼。我們為選項設計了最小化文本,有流控制、指令,還有壓縮系統。
我們說劇情編程語言的時候,說的是什麼?
Yarn Spinner的工作流程是這樣的:劇情作家將他們的對話寫成腳本,你的對話會以Yarn腳本的形式出現在文本文件里,它看起來與電影劇本很像,非常容易理解。
編輯器工具閱讀你寫的對話腳本,並將其語義分析為不同節點,這就是我們之前說的圖表上的單個節點。在遊戲玩法期間,Yarn Spinner執行這個腳本,並根據玩家選擇繼續推動故事的發展。
比如這張圖展示了《林中之夜》一個對話的所有元素,我們的話題可以擁有流控制,這裡的輸入值是角色angus,隨後我們還對它增加了不同的數值。
指令是「關閉所有(close all)」,這是《林中之夜》特有的,意思是關閉屏幕上的所有對話。接下來是台詞,這裡我們選的是Angus與好朋友Bea的對話。最底下是選項,比如玩家可以選擇Lasagna或者Brownies,然後會基於玩家選擇運行不同的對話。
因此,Yarn Spinner運行起來就像是一個程序,實際上它就是個程序。
箭頭功能是我們非常喜歡的,因為你不用創造節點然後用線連起來,這讓支線對話做起來成本很低,意味著劇情作家寫選項的時候更簡單。
Ryan North:的確如此,它還可以讓你在寫劇情的時候快速實驗,因為你可以看到這些選項需要什麼,每個選項會帶來什麼結果,如果比較糟糕則可以去掉,對於劇情作家來說,它很大程度上是個實驗場景。
Jon Manning:我們還發現它對過場動畫也很有幫助,《林中之夜》所有的過場動畫劇情都是用Yarn腳本寫的,這對於解決非常線性化的內容輸出是有幫助的。
比如在這裡,除了執行對話台詞之外,在這個腳本中我們還告訴噴泉停止播放動畫,讓音樂淡出3秒,並等待3秒鐘,然後運行一些對話台詞。
Ryan North:所以,當你寫作的時候,就像是看到了播放出來的效果,讓你可以聚焦於打造整個故事,然後將其他東西讓開發者幫你在遊戲里實現。
Jon Manning:故事語言就像是電影劇本和圖表之間的中間點,你在編寫一個線性的文本文檔,這是很多作家比較熟悉的寫作方式,但與此同時,你還在表達更複雜的支線劇情,就像程序員那樣,而且,你在同一個地方可以做這兩件事。
將作家變為程序員:Yarn Spinner是怎麼來的?
所以,隨著越來越多的人使用,我們將它做成了一個完整的項目,於是我們在想,為什麼不為它做一款demo遊戲呢?
Ryan North:這時候我加入了項目,Jon打電話說,要做一個5分鐘的demo遊戲展示Yarn Spinner可以做什麼。
所以我寫了一個提議「I feel fine」,講述的是空間站機器人得知三天後空間站即將被其他機器人摧毀的故事,這是個非常簡單的劇情、發生在一個房間里,你甚至不能移動,只能通過故事推進與角色聊天。
當時我跟Jon是這麼說的,「你覺得怎麼樣?這些東西很多都是可以改變的,能否給一些可以迭代的意見,不需要有大量的對話,你想要從這個基礎上得到什麼樣的結果?」
Jon給我發送了一個Unity應用,讓我可以將腳本放進去,並讓我告訴他最終得到的結果是什麼。這是讓我非常意外的,也很有趣,因為我可以直接開始寫一款遊戲。
你們可以看到,這只是一個很基礎的demo腳本,這是角色說的話,底部是選項,中間是一些基礎的控制。
Jon Manning:實際上,不僅Ryan感到驚訝,我也感到驚訝,因為我們給他的只是一個很簡單的框架,他可以在此基礎上寫故事,可以復活、移動以及去掉一個角色,我們只是用了一天的時間打造,Ryan用這個工具做出了很大的項目。
Ryan North:沒錯,我很快做出了一個很多小時的腳本,而且有一個三天的故事架構,裡面有多個角色結局選項,還有角色愛情故事,這個工具對我來說是非常好用的。
這是一部分遊戲代碼,如果仔細看,你會發現這與Jon最初發給我的結構很相似,只不過現在我們將它交給了真正的故事作家去做。
Jon給我的工具可以讓我不斷的重置故事,以便發現故事劇情和代碼里的bug,並且成為了我寫故事的工具。我請求他們給我發送支持不同變數的最新版本,以便可以像程序員檢查代碼bug那樣,對故事更多方面進行檢查。
這個工具的好處是可以快速寫作,而且編輯起來非常簡單,哪怕是在劇情寫作的後期。我打造了一個三天架構的故事,並且只是在寫作和試錯。而且,它就像是一個可玩的文本編輯器,這是我很喜歡的,由於它是非常簡單的文本文件格式,也非常便於其他軟體的使用。
但它並不完美,因為Jon給我的這個沙盒並沒有我想要的那麼大,因為我需要變通才能完成一些工作。
Jon Manning:很多編程語言都是以主流特定語言的方式思考的,它們只能解決特定類型的問題。Yarn是一個為寫故事而設計的特定領域語言,它在很多的劇情向遊戲里比較有用,因為很多的場景,比如誰說了什麼、做了什麼,就是故事。
這就導致了我們的「劇情灰盒」,關卡策劃們非常喜歡使用這類工具,他們可以在真正做關卡製作之前,通過粗略的形狀與幾何體測試關卡的可玩性。
在劇情灰盒中,作家們實際上可以控制邏輯,這對遊戲劇情是非常重要的,因為它意味著作家們可以在需要的情況下打造自己需要的微型系統,而不必等待程序員來幫忙。對於程序員來說,這種方式也很有效,因為他們可以打造一個系統,然後增加易於替換的對話。
這個截圖是《林中之夜》最初的腳本,其中很多東西都可以輕鬆替換的,哪怕是到了遊戲研發的最後階段。
這張圖是《林中之夜》沒有變化的結構,但很多內容是後來填充進去的,你可以在研發非常後期的時候補充這些台詞。
Ryan North:Jon提到了劇情灰盒的概念,這實際上是在「I Feel Fine」的研發過程中自然而然發生的。我希望能夠根據不同角色聲譽的選擇,可以有多種結局。所以我打造了一個非常簡單的聲譽系統,根據你談話的角色解鎖不同結局。
對我來說,根據自己的需要打造這些是非常簡單的,不需要程序員的幫助就可以完成。
Jon Manning:
我們支持這種工作流動一些方法是,不需要執行大量的信息,台詞只是不同的字元串,非玩家接觸的任何東西都可以編碼為話題標籤,這非常容易寫作,很容易理解而且非常直觀。你甚至可以用表情符號控制角色面部表情。
比如上面這個場景。
我們還不用確定什麼指令可以發送到遊戲里,很多東西可以根據實時需要而打造,並且根據不同的案例使用通用語法「指令」。通過這個工具,作家可以在自己的腦海中為遊戲寫腳本,並且可以根據需要快速做出改變,如果有某個功能缺失,你可以很快自己寫出來。
這還可以讓開發者們不需要去解決有趣的問題,比如很多問題非常有趣、也很酷,但很難帶來即時的用途。
它可以讓開發者為遊戲打造腳手架,給劇情作家簡單的工具,但同時是個沙盒系統,讓他們可以探索自己的想法,而且這還可以給出足夠使用的代碼,讓劇情作家不會成為開發者,我覺得後者可能是有危險的。
這個工具不太擅長的是那些應該放在表格里的數據,特別是那些非常硬核的數據,它們放在Yarn Spinner當中會成為一團亂麻,所以最好還是放在表格中。
給工具開發者的建議
你該如何做呢?實際上,打造一個語法解析器比你想像的容易很多,因為它本質上就是用工具解決不同的問題,第一步就是打造一個工具,將腳本轉換成語法樹。第二步就是,你了解這個語法樹,並且在工作的時候將數據發送給遊戲,根據遊戲狀態跳過語法樹的其他部分,這裡非常感謝我的同事們。
我們使用了ANTLR工具,用來處理腳本語言的所有語法,它為我們向語法解析器生成源代碼,然後我們將這個解析器用到Yarn Spinner的代碼中。
ANTLR在編程領域是一個非常受歡迎的工具,它不是必備的,但我們發現很有幫助。第一個版本的Yarn Spinner並沒有使用這個工具,但由於沒有解析器生成器,結果是一團糟,有了解析器之後,它可以幫你避開很多邊緣案例,節約很大的工作量。
作為一個工具開發者,你不需要解決每一個問題,很多問題是完全可以接受的,你只需要對它保持開放即可,這樣你可以避免為很多設計問題打造專屬的系統。
我們需要處理什麼樣的數據?根本不用在意,你可以將整個字元串發送到遊戲,然後在這個字元串的對應地方找到任何需要的數據。
什麼樣的數據需要做成選擇?不用擔心,你可以將所有用戶接觸不到的數據轉換成話題標籤,它是一個字元串。
我需要將什麼信號發送到遊戲里?完全不用介意,你可以使用指令,因為很多字元串是玩家不用接觸到的,讓遊戲去理解就行了。
所以我對工具開發者的建議是,不要試圖打造一個完整的編程語言,你要做的不是給C#打造一個替代語言,只是為對話增加邏輯。Yarn Spinner不支持一半以上的系統語言功能,甚至不支持你自定義函數。
不要試圖解決看似很有趣的編程語言問題,努力解決特定問題,作為工具開發者,你的角色就是做一個好用的工具,然後站到一邊。
Ryan North:這個工具的好處在於,它可以讓作家與開發者聚焦於各自擅長的事情,同時避免彼此袖手旁觀,這可以帶來非常簡單快速的創意原型、劇情發展以及劇情測試。
因為我們也在於完整編程語言工具打交道,所以我們還可以通過它們的技巧探索更多的新領域。它可以讓作家幾天之內打造劇情,而且大多數時間只需要寫作,而不是調整工具。一旦有了劇情,引擎就可以被加強,資源就可以放進來,隨後,你可以根據這些輸入很方便地調整劇情。
Jon Manning:我對這個方法非常感興趣,而且它已經被很多的遊戲使用,包括屏幕上的這些遊戲。它有可能讓劇情寫作的速度跟故事發展一樣快,對於非線性故事,它帶來的幫助甚至更大,以上就是我們分享的全部內容。
····· End ·····
GameLook每日遊戲產業報道
全球視野 / 深度有料