Novella
型別: 視覺小說框架
包: Divooka.Novella(Novella 工具箱),位於 Divooka Compute 的 Game Development 工作負載中;C# 程式集 Novella.Core 和 Novella
上下文: 過程式(Routine 和 Events 圖)、資料流(Flows 和 Function 圖)、C#,以及純指令碼資料夾
設計: RFC 170
狀態: 第 1 次迭代,即改版版本。本次迭代中,引擎、其指令碼語言、其 Divooka 包、Explore 示例以及示例遊戲均已就緒。

Novella 是 Parcel NExT 的視覺小說框架。遊戲就是資料:一個由標籤和語句組成的故事,故事所引用的定義(角色、影像、變換、轉場、音訊),一份配置和一個主題。同一個遊戲可以從指令碼資料夾、C# 程式、Divooka 過程式圖或 Divooka 資料流圖的預覽中執行,並且在每種方式下的遊玩效果都相同。
它的功能目標是與最廣泛使用的視覺小說引擎 Ren'Py 對等,因此熟悉 Ren'Py 的作者一眼就能認出這種指令碼語言。它的 API 和程式設計風格則是自己的:條件和賦值使用一種小巧、安全的表示式語言;故事需要的除此之外的任何東西,都是用 C# 或 Divooka 實現的命令;需要 Python 的遊戲可以選擇啟用它,以程式碼塊的形式通過 IronPython 執行真正的 Python。故事甚至完全不必是指令碼:C# 和 Divooka 節點可以寫出相同的故事資料,包括條件和對變數的更改。
製作遊戲的方式
| 方式 | 你編寫的內容 | 執行方式 |
|---|---|---|
| 指令碼資料夾 | .novella 指令碼檔案,與遊戲的影像、聲音和字型放在一起 |
NovellaPlayer run <folder> |
| C# | 一個 NovellaGame 或其派生類,故事寫在指令碼中、用 C# 故事構建器編寫,或寫成即時指令碼 |
game.Run() 開啟一個視窗 |
| Divooka | 建立並執行遊戲的 Routine 或 Events 圖,或者把遊戲描述為資料(直到其條件、效果和場景)的 Function 圖 | 執行圖,或從其 Custom Preview 中游玩某個定義 |
故事本身可以用四種方式編寫:寫成指令碼;在 C# 中用故事構建器編寫,無需指令碼;在 C# 中寫成即時指令碼,即一個本身就是故事的過程;以及寫成 Divooka 節點,可以是函式式的(把序列、條件、效果和場景構建為資料),也可以是過程式的(Events 圖中的即時指令碼)。它們最終殊途同歸:無論用什麼編寫遊戲,產生的都是一個故事及其定義,並由同一個執行時來播放。指令碼資料夾只需幾行程式碼就能變成 C# 程式,Divooka 圖可以從文件自己的庫中載入同樣的指令碼,而指令碼、構建出的標籤和場景可以混合在同一個故事中。
define config.title = "The Garden"
character q "Qinglan" color "#c0392b" image qinglan
label start:
scene bg garden with fade
show qinglan smile at right with dissolve
q "You came."
menu:
"I did.":
q "Then sit with me a while."
"I was passing.":
q smile "Of course you were."
return
功能
- 類似劇本的指令碼語言。 縮排構成程式碼塊;對話就是說話者加一句帶引號的臺詞。支援標籤、跳轉、帶參數的呼叫、帶條件的選單、
if/elif/else、while、變數和持久變數。參見指令碼語言參考。 - 無需登記的影像。 影像檔案按其路徑命名(
sprites/qinglan/smile.png即qinglan smile);缺失的影像會繪製為佔點陣圖,因此在任何美術素材完成之前就能遊玩故事;分層影像可以組合服裝和表情,而不必為每種組合準備一個檔案。 - 舞臺。 帶位置、z 順序和圖層的 show、hide 和 scene;ATL 風格的動畫時間線(屬性、緩動函式、暫停、用於幀動畫的圖片行、
repeat、block、parallel、choice、time、on show/replace/hide、contains、function),在讀檔或回滾後會精確重放;能夠自行播放動畫的影像,例如閃爍的蠟燭;近五十種內建轉場,從dissolve和fade到pixellate、irisin、pushleft,以及通過遮罩實現的影像溶解。 - 文字。 Ren'Py 的文字標籤(粗體、顏色、字型大小、字型、用於假名注音和拼音的 ruby、
{w}、{p}、{nw}、{fast}、{cps})、[variable]插值、NVL 頁面、置中文字、側邊影像和打字音效。 - 聲音和影片。 音樂、音效、語音和環境音通道,支援淡入淡出、佇列和迴圈;按臺詞 id 自動配音;全屏影片和影片精靈。
- 遊戲自己的介面。 一種介面語言,包含容器、網格、框架和可滾動視口,
if、for和use,介面變數、按鈕、進度條、文字欄位、計時器和按鍵,每一幀都根據故事的變數重新佈局:物品欄、狀態列、地圖、謎題板。它可以顯示在故事上方,也可以被呼叫來向玩家提問;可以在指令碼中寫成screen,也可以用 C# 或節點編寫;更復雜的需求可以使用 C# 類。 - 鍵盤、滑鼠和手柄。 每個介面,包括遊戲自己的介面,既可以用鍵盤和滑鼠操作,也可以用手柄操作。
- Python,如果遊戲需要的話。
python:和init python:程式碼塊通過 IronPython 執行真正的 Python,並可使用其標準庫;它們設定的內容(包括物件和字典)會隨故事一起存檔、讀檔和回滾,它們定義的函式可以在任何表示式中呼叫。 - 玩家期望的每一個介面。 主選單、遊戲選單、帶縮圖的存檔和讀檔、偏好設定、歷史記錄、畫廊、音樂空間、成就、關於、幫助、確認和通知,全部由一個主題設定樣式——主題是純資料,即使不用任何一張影像也能工作。
- 樣式。 與 Ren'Py 一樣,樣式是帶有父樣式以及
hover_、selected_、insensitive_和visited_變體的具名外觀。每個內建介面都用樣式繪製,主題也由樣式組成,因此故事可以細化遊戲外觀的某一部分,給某個角色一個專屬的對話視窗,把選項按鈕做成帶懸停圖片的圖片,或者用{style=name}給一句臺詞中的某個詞著色。參見樣式。 - 無需指令碼的故事。 流暢的 C# 故事構建器和 Divooka 節點,每一種都能表達指令碼語言所能表達的內容,從臺詞、選單、條件和效果,到動畫、分層影像、翻譯、介面和 Python 程式碼塊;場景,即 Novella One 的配置模型(一個背景、音樂、臺詞以及故事接下來的去向);以及用於實現節點無法組合出的邏輯的 Function 圖。它們產生的故事都與指令碼產生的相同,因此存檔和回滾的方式也相同;唯一的區別是,它們傳給標籤、命令或介面的實參是在構建故事時就固定下來的值,而指令碼傳遞的實參是表示式。
- 存檔、讀檔和回滾。 每句臺詞、每個選單和每次輸入都是一個檢查點;玩家可以向後和向前回滾、跳過已讀文字、自動前進、快速存檔和讀檔,而讀檔會精確還原畫面,包括隨機抽取的結果。
- 翻譯。 逐句翻譯和字串翻譯直接寫在指令碼中,引擎自身的介面已翻譯為簡體中文、繁體中文和日語。
- 面向作者的工具。 根據檔案檢查故事的 lint 工具,帶有標籤跳轉功能的開發者主控台,遊玩時重新載入指令碼,以及為每一步儲存一張帶說明的螢幕截圖的無頭通關測試。



頁面
- 安裝:在 Divooka 和 C# 中從哪裡取得 Novella。
- 入門:分別從指令碼資料夾、C# 和 Divooka 製作第一個遊戲。
- 概念:故事、標籤、場景、角色、影像、舞臺、執行器、檢查點、存檔、用程式碼編寫的故事、即時指令碼,以及鍵盤和手柄控制。
- 指令碼語言:完整的參考,附帶示例。
- 主題設定:每一項配置和主題設定、它們所對應的內建樣式、字型、九宮格影像和介面翻譯。
- 樣式:帶父樣式和狀態的具名外觀、內建樣式,以及在指令碼、C# 和節點中應用於介面、角色和臺詞片段的樣式。
- 在 Divooka 中使用 Novella:工具箱、過程式圖和函式式圖,以節點形式呈現的條件、效果、場景、動畫、介面和樣式,Function 圖中的邏輯、預覽和嵌入的資源。
- 開發:C# API、故事構建器、自訂命令、作為資料和作為類的介面,以及無頭測試。
- 示例:Explore 示例和示例遊戲 The Red Thread。
- 與 Ren'Py 的功能對等:哪些已支援、哪些部分支援、哪些尚未提供。
參考資料
- RFC 170 - Framework - Novella:設計文件。
- DevLog 20250512 Visual Novel Game Framework (Highlights),作者 Charles Zhang(dev.to),介紹最初的設計 Novella One。
- DevLog 20250516 NovellaOne, A Visual Novel Game Framework - Early Introduction,作者 Charles Zhang(dev.to)。