與 Ren'Py 的功能對等
Novella 的功能目標是與 Ren'Py 對等,同時採用它自己的 API 和程式設計風格。本頁面記錄第 1 次迭代中各功能領域的現狀,依據的是引擎的程式碼,而不是計劃。已支援表示其行為符合 Ren'Py 使用者的預期;部分支援表示可以使用,但有所述限制;尚未支援表示沒有該功能。有些差異是有意為之,標記為設計如此。
| 領域 | 已支援 | 部分支援 | 尚未支援 |
|---|---|---|---|
| 指令碼語句 | 帶屬性的對話、臨時 @ 屬性、一次性說話者、臺詞 id,以及在臺詞出現之前播放的轉場(with);旁白;extend;帶 at、behind、zorder、as、onlayer 和內聯 ATL 的 show、scene、hide;with;pause 和 pause hard;帶標題、條件和 set 的 menu;具名選單(menu name:),可以在故事的任何地方像標籤一樣被跳轉或呼叫;jump、帶實參的 call、帶值的 return,以及 expression 目標;標籤參數;if/elif/else;while;$ 賦值;play、queue、stop;voice 和 voice sustain;movie;input;window;nvl clear;notify;pass;define 和 default;帶 ATL 塊的 image name: |
自訂語句是用 C# 或 Divooka 實現的 run 命令,而不是新語法;call expression 不接受實參;在選擇啟用 Python 的遊戲中,python: 和 init python: 通過 IronPython 執行真正的 Python,但 $ 是 Novella 自己的表示式語言,設計如此;程式碼塊建立的、故事變數無法容納的東西(物件、字典、集合)會被 pickle 到一個隱藏變數中,就像 Ren'Py pickle 它的 store 一樣,而函式和類會在啟動時重新定義,因此應放在 init python: 中;標準庫隨遊戲一同提供 |
init 優先順序;show expression;camera 和 show layer |
| 表示式 | 數字、字串、布林值、none、列表和索引;算術、鏈式比較、in、and/or/not、條件表示式;約三十個內建函式以及遊戲自身的查詢(visited、seen_label、seen_image、heard、achieved、showing);persistent. 變數;[expression] 插值;可由回滾重放的隨機抽取 |
函式可以從 C#(RegisterFunction)、從 Divooka 圖(Register Expression Function)新增,在選擇啟用 Python 的遊戲中也可以從指令碼通過 init python: 新增;在用 C# 故事構建器編寫的故事中,條件或效果可以是作用於故事變數的 C# lambda,而在以節點編寫的故事中,可以是交給 From Function 節點的 Function 圖,二者都沒有指令碼形式 |
作為故事值的字典、物件和類(Python 可以建立它們並保留在存檔中,但故事自身的表示式無法容納它們) |
| ATL | 屬性設定;使用 Ren'Py 的緩動函式(warper)和 Penner 系列進行插值;pause;帶轉場的圖片行,用於逐幀動畫;作為時間線的影像(image name:);repeat 和 repeat n;block;parallel;帶權重的 choice;time;on show、on replace 和 on hide,變換處理 hide 的影像會一直保留到處理程式結束;contains;function,呼叫遊戲在 C# 中註冊的函式;按名稱並帶參數引入的變換;show 和 scene 下的內聯時間線;標準位置;在讀檔或回滾後可精確重放的時間線(包括隨機選擇),因為每個顯示的影像都保有一個已儲存的種子 |
屬性集涵蓋位置、錨點、對齊、偏移、縮放、旋轉、透明度、模糊、飽和度、亮度、色調和尺寸,但不包括 crop、極座標、matrixcolor 或平鋪;時間線表示式可以讀取變換的參數,但不能讀取遊戲變數 |
event 語句(解析器將其報告為錯誤),以及用於影像自身的 show、replace 和 hide 之外其他事件的 on;樣條和 circles |
| 轉場 | dissolve、fade、flash、pixellate、move、ease;movein、moveout、easein、easeout 系列;四個方向的 slide、slideaway、push、wipe;irisin、irisout、zoomin、zoomout、vpunch、hpunch、blinds、squares、crossfade;帶遮罩的 imagedissolve;帶實參的具名轉場;舞臺語句、對話臺詞以及 show screen 和 hide screen 上的轉場;關閉轉場的偏好設定 |
帶轉場的 call screen 會在轉場的時長內讓被呼叫的介面淡入,無論轉場是哪種型別,因為被呼叫的介面不屬於舞臺 |
MultipleTransition、ComposeTransition、AlphaDissolve 及其他轉場類 |
| 影像和分層影像 | 由檔名定義的影像;內建的 black 和 white,無需定義;保留目前屬性的屬性解析;顏色影像;缺失美術素材的佔點陣圖;影片影像;濾鏡(灰度、復古褐色、色調、翻轉、縮放、裁剪、模糊、透明度、亮度、飽和度);composite;條件切換;側邊影像;帶分組、multiple、預設值和條件的分層影像 |
分層影像缺少 if_any/if_all/if_not、逐層變換和偏移,以及 auto 屬性 |
作為影像定義的文字、框架及其他可顯示物件(displayable);動態可顯示物件 |
| 舞臺和圖層 | master、transient、screens 和 overlay 圖層,其中 transient 在每句臺詞、選單、輸入和點選繼續的暫停之後清空;用 onlayer 以其他任意名稱建立的圖層,繪製在 master 之上、transient 之下,按名稱排序;z 順序和 behind;用 as 指定的標籤 |
圖層變換和鏡頭 | |
| 音訊通道 | music、sound、voice、ambience 和 audio,以及帶混音器、迴圈、預設淡出和 norestore 的自訂通道;淡入淡出、佇列、單次播放音量、if_changed、別名和播放清單;音樂、音效和語音的音量及靜音;讀檔和回滾時恢復通道;打字音效;WAV、MP3、AAC、FLAC、Vorbis 和 Opus 解碼 |
音訊濾鏡和聲像 | |
| 影片 | 帶 noskip 和 keepmusic 的全屏 movie;舞臺上的迴圈影片影像;經混音器輸出的影片聲音;無頭遊玩時對影片截圖,並在影片可跳過時點選跳過 |
帶 alpha 遮罩的影片 | |
| 語音 | voice、voice sustain,以及按臺詞 id 或角色根據檔案模式自動配音 |
從歷史記錄重放某句臺詞的語音;按角色設定語音音量 | |
| 介面和介面語言 | 所有預設介面:主選單、遊戲選單、存檔、讀檔、偏好設定、歷史記錄、選項、輸入、NVL、快捷選單、確認、通知、畫廊、音樂空間、成就、關於和幫助;啟動畫面標籤;寫成標籤的主選單;全部使用由主題生成的具名內建樣式繪製;介面語言,可以在指令碼中寫成 screen 定義,也可以在 C# 中用 ScreenBuilder 或用 Screens 節點編寫:容器 vbox、hbox、grid、frame、fixed,以及可裁剪、可滾動的 viewport;if/elif/else、for 和 use;介面變數(default);文字、影像、文字按鈕和圖片按鈕(支援 sensitive)、進度條、輸入框、空白、計時器和按鍵;用 at、align、pos 和 anchor 定位;動作 return、jump、set、toggle、notify、play、open(存檔、讀檔、偏好設定、歷史記錄、畫廊、音樂空間、成就、主選單)、close、show、hide 和 run;每幀根據故事變數重新佈局。介面用 show screen 顯示,用 call screen 呼叫;玩家未作答就關閉的被呼叫介面返回 none |
介面語言無法表達的內容用 C# NovellaScreen 類實現,它優先於同名的已定義介面;主選單之外的內建介面可以重新設定樣式,但不能替換 |
拖放;影像對映(imagemap)的熱點裁剪;介面元素上的變換 |
| 樣式 | 帶父樣式的具名樣式(style name is parent:),第二次定義會補充第一次;狀態字首 idle_、hover_、selected_ 和 insensitive_,外加用於在之前的遊玩中選過的選項的 visited_,以及複合字首 selected_idle_、selected_hover_ 和 selected_insensitive_,尋找方式與 Ren'Py 相同(在每個樣式上,先找最具體的字首,再找不帶字首的屬性,然後找父樣式);背景可以是顏色、圖片、frame(...)、solid(...) 或任何影像函式(Frame 和 Solid 兩種寫法均可);文字、容器、佈局和聲音屬性;74 個內建樣式(say_window、say_dialogue、choice_button、save_slot 等),每個內建介面都用它們繪製,它們由主題生成,因此主題的設定起到 Ren'Py 的 gui 變數的作用,而故事中的同名樣式會對其進行細化;介面上的 style 和 style_prefix,以及直接寫在元素上的屬性;角色的 window_style、namebox_style、who_style 和 what_style,以及 what_size 40 這樣的部件屬性;{style=name} 文字片段;在 C# 和 Divooka 節點中同樣可用;lint 會檢查父樣式、迴圈引用、屬性名和值,以及所命名的每個樣式 |
Novella 自己的屬性集:outlines、xpadding 或 xminimum 等 Ren'Py 屬性要寫成 Novella 的屬性(outline_width 和 outline_color、padding、xsize),或者沒有對應項;背景是一個影像來源(圖片、框架、顏色、合成圖或經濾鏡處理的圖片),而不是任意可顯示物件 |
Frame 的 tile,以及動畫背景;在遊戲執行時更改樣式;文字片段的 {=style} 寫法 |
| 存檔、讀檔、回滾、快進、自動 | 帶縮圖的分頁存檔位、刪除存檔、輪換的自動存檔、快速存檔和讀檔、Continue;以可讀 JSON 格式儲存的存檔;after_load;帶限制和 rollback_past_choices 的回滾與前進;快進已讀文字、未讀文字以及選項之後的內容;自動前進;隱藏對話方塊;截圖 |
即時指令碼(live script)不能存檔、讀檔或回滾,用 Call Label 執行的故事標籤也不能;存檔的名稱會被儲存,但存檔介面不會詢問名稱;pickle 無法寫出的 Python 值(生成器、已開啟的檔案)不會被保留 | 從指令碼阻止或固定回滾(block_rollback、固定回滾);雲存檔 |
| 歷史記錄 | 按顯示內容記錄的臺詞和選項,已翻譯,帶上限 | 語音重放;從歷史記錄返回到某句臺詞 | |
| 持久資料 | 預設值只應用一次的 persistent. 變數;已讀臺詞、已見影像、已聽音訊和已到達的標籤;之前遊玩中做出的選擇;成就;偏好設定,與存檔分開儲存 |
在多個遊戲之間共享的資料(Ren'Py 的 MultiPersistent) | |
| 畫廊和音樂空間 | 在其影像被看到時或按條件解鎖的畫廊條目,並附帶檢視器;被聽到時或按條件解鎖的音樂空間曲目 | ||
| 成就 | 定義、achieve、隱藏成就、通知、Achievements 介面、achieved() |
Steam 及其他平臺後端 | |
| 翻譯 | 按顯式或推匯出的 id 翻譯臺詞;字串表;在某種語言中刪去一句臺詞;語言偏好設定;translate() 和 language();引擎介面的簡體中文、繁體中文和日文版本;由 lint 報告的覆蓋率 |
繁體中文和日文的介面表不完整,缺失部分回退為英文 | 按語言設定字型和樣式;生成翻譯檔案的工具 |
| 文字 | Ren'Py 的文字標籤,包括注音(ruby)、{w}、{p}、{nw}、{fast}、{cps}、內聯影像和空白;{a=} 連結,在臺詞顯示完畢後可點選,可以跳轉到某個標籤、呼叫某個標籤後回到該臺詞,或開啟網址;插值;NVL 頁面;置中文字;按角色設定的字型、字型大小、顏色和引號 |
{vspace}、{k} 和 {clear} 會被接受並忽略 |
自訂文字標籤 |
| 無障礙和自動朗讀 | 文字大小和對話方塊不透明度偏好設定;轉場開關;預設開啟的文字陰影 | 自動朗讀:該偏好設定會被儲存,但偏好設定中沒有對應開關,背後也沒有語音合成器;無障礙選單;字型和對比度覆蓋 | |
| 開發者工具 | Lint(NovellaPlayer lint、Validate、主控台的 lint、Check Story 和 Check Game 節點);可以求值表示式、設定變數、列出問題並用 jump label 跳轉的主控台(Shift+O);重新載入(Shift+R);從某個標籤開始(--label);帶描述截圖的無頭遊玩;用 NovellaPlayer bench 測量幀時間 |
重新載入會從目前標籤的開頭重新開始,而不是從目前臺詞開始 | 跳轉到某個檔案和行;互動式導演工具;影像位置拾取器;變數檢視器 |
| 不使用指令碼的故事 | C# 故事構建器和 Divooka 節點都能表達指令碼語言所能表達的內容,包括 Python 程式碼塊、動畫影像和使用容器佈局的介面;Novella 的測試會用兩種方式構建同一個故事,並比較各自列印出的指令碼來驗證這一點;用程式碼構建的標籤不會落入下一個標籤,lint 會在標籤可能執行到末尾之外的地方給出警告 | 構建器和節點傳給標籤、命令或介面的實參是在構建故事時就固定的值,而指令碼中的實參是在遊玩時求值的表示式(Add Use Screen 接受表示式,因此列表的某一行可以把它的條目傳下去);lambda 或 From Function 圖沒有指令碼形式,因此使用了它們的故事無法從其指令碼讀回 | |
| 發行和構建 | 遊戲可以作為 C# 程式執行(像任何 .NET 10 應用程式一樣構建),可以作為用 NovellaPlayer 執行的指令碼資料夾,也可以作為在 Divooka Compute 或 Explore 中的 Divooka 文件 |
打包遊戲以供發行的命令;通過 Divooka 執行器範本一鍵釋出到桌面;Android、iOS 和 Web 構建 | |
| 遊戲手柄 | 用手柄操作每個介面,包括遊戲自己的介面:A 繼續和選擇,B 返回或開啟遊戲選單,Start 開啟遊戲選單,方向鍵和左搖桿在按鈕之間移動,肩鍵回滾和前進,X 隱藏對話方塊,Y 切換自動前進,Back 切換快進 | ||
| Live2D 和 3D | Live2D;3D 舞臺 |
缺失功能的計劃見 RFC 170。剩餘的差距簡要如下:介面中沒有拖放或影像對映熱點裁剪;不能在執行時更改樣式;沒有 ATL event;沒有 Live2D、3D 舞臺或自動朗讀;沒有移動端或 Web 構建;沒有生成翻譯檔案的工具;也沒有 block_rollback 或固定回滾。