入門
本頁面用三種方式製作同一個小遊戲。選擇適合你的一種即可;遊戲本身,以及你學到的有關指令碼語言的一切,都可以沿用到其他方式中。各個工具從哪裡取得,參見 安裝。
開始時你不需要任何美術素材。故事中提到但找不到的影像會以佔點陣圖繪製(角色為剪影,背景為漸層),而引擎會用主題的顏色自行繪製對話方塊和選單,因此故事從第一行起就可以遊玩。
故事
下面的每個版本都播放這個指令碼。將它儲存為 game.novella(UTF-8):
define config.title = "The Garden"
character q "Qinglan" color "#c0392b" image qinglan
default met_before = false
label start:
scene bg garden with fade
"Plum blossom, and nobody in the garden but one girl with a guqin."
show qinglan smile at right with dissolve
q "You came."
menu:
"I did.":
q "Then sit with me a while."
"I was passing.":
$ met_before = true
q annoyed "Of course you were."
q "Listen, then."
return
從頭讀起:define config.title 為遊戲命名;character 宣告一個說話者,其名字以紅色顯示,影像標記為 qinglan;default 為變數指定初始值。遊戲從 label start 開始。scene 清空舞臺並顯示背景 bg garden;單獨一行帶引號的文字是旁白;show 讓 Qinglan 出現在右側;q "..." 是她在說話;menu 提供兩個選項;q annoyed "..." 在她說話時把她的表情換成 qinglan annoyed,並且此後保持不變;在無處可返回時,return 會結束遊戲並回到主選單。
方式 1:指令碼資料夾
新建一個名為
The Garden的資料夾,把game.novella放進去。如果你有美術素材,就新增進來。影像按其路徑命名,因此下面這些檔案正好就是指令碼所要求的影像:
The Garden/ game.novella bg/garden.jpg -> bg garden sprites/qinglan/smile.png -> qinglan smile sprites/qinglan/annoyed.png -> qinglan annoyed名為
images、sprites或characters的頂層資料夾不計入名稱,路徑的其餘部分成為一個個單詞,名稱一律小寫。執行它:
NovellaPlayer run "The Garden"主選單隨即開啟。點選 Start。
檢查它:
NovellaPlayer lint "The Garden"會列出故事引用了但並不存在的任何東西,例如沒有對應檔案的影像名稱。
編寫時,NovellaPlayer run "The Garden" --developer 會開啟開發者工具:Shift+R 重新載入指令碼並重新開始你所在的標籤,Shift+O 開啟一個主控台,在其中用 jump label_name 可以直接跳轉到某個標籤。
方式 2:C#
建立一個引用 Novella 專案的 .NET 10 主控台程式(參見 安裝),把方式 1 中的資料夾以 Assets 為名放在它旁邊,然後編寫:
using Novella;
NovellaGame game = new("The Garden", 1920, 1080);
game.AddAssetFolder("Assets");
game.LoadScriptsFromAssets();
game.Run();
AddAssetFolder 告訴遊戲它的檔案在哪裡,LoadScriptsFromAssets 按路徑順序載入其中的每個 .novella 檔案,Run 開啟視窗,並在玩家退出時返回。指令碼中的 define config.width 和 define config.height 會覆蓋這裡給出的解析度。
程式碼能做指令碼做不到的事。下面故事用 run 向程式請求一些東西:
$ answer = "moon"
run riddle answer
if _return:
q "Correct."
using Novella.Values;
game.RegisterCommand("riddle", arguments => Value.FromBoolean(arguments[0].AsText() == "moon"));
命令的結果會放入 _return。開發 完整介紹了 C# API,包括把遊戲寫成一個類。
不使用指令碼
故事也可以用 C# 編寫。故事構建器寫出的標籤與上面的指令碼相同,因此該遊戲的存檔、讀檔和回滾與指令碼版完全一樣;此時 Assets 資料夾中只需要美術素材:
using Novella;
using Novella.Building;
NovellaGame game = new("The Garden", 1920, 1080);
game.AddAssetFolder("Assets");
game.WriteStory(story =>
{
story.Character("q", "Qinglan", color: "#c0392b", image: "qinglan")
.Default("met_before", false);
story.Label("start", s => s
.Scene("bg garden", with: "fade")
.Narrate("Plum blossom, and nobody in the garden but one girl with a guqin.")
.Show("qinglan smile", at: "right", with: "dissolve")
.Say("q", "You came.")
.Menu(m => m
.Choice("I did.", c => c.Say("q", "Then sit with me a while."))
.Choice("I was passing.", c => c.Set("met_before", true).Say("q", "Of course you were.", "annoyed")))
.Say("q", "Listen, then.")
.Return());
});
game.Run();
條件可以是 C# lambda,例如 .If(v => v.Flag("met_before"), ...),也可以是構建出來的、能讀回為指令碼的值。完整的構建器參見 開發。
方式 3:Divooka
作為過程(Routine 圖)
- 建立一個帶有 Routine 圖的文件。
- 開啟文件的資源庫(在 Divooka Compute 中為 Asset library 工具或 Ctrl+Shift+A),使用 Import files… 匯入
game.novella和所有美術素材,並保持指令碼所依賴的資料夾名稱。 - 從 Novella 工具箱中,在執行路徑上依次串聯以下節點:
- Make Novella Game,標題為
The Garden,寬度為1920,高度為1080。 - Add Library Assets,連入遊戲。它的庫輸入由文件提供,因此不需要連線。
- Load Scripts From Assets,資料夾留空,以載入庫中的所有指令碼。
- Run。
- Make Novella Game,標題為
- 執行該圖。遊戲會在自己的視窗中開啟。

你也可以不匯入指令碼檔案,而是把指令碼輸入到 Load Script 節點中;或者完全不用指令碼,用 Define Character 和 Set Config 等節點來定義內容。
作為資料(Function 圖)
故事也可以完全不用指令碼,而寫成節點:
- 建立一個 Function 圖。
- 串聯 Start Sequence → Scene(
bg garden,使用fade)→ Show(qinglan smile,位於right,使用dissolve)→ Say(角色q,文字You came.)。 - 用名稱
start和該序列建立 Make Label。 - Start Story → Add Label(該標籤)→ Add Character,由 Make Character(
q、Qinglan、#c0392b、影像qinglan)提供輸入。 - 用標題和故事建立 Make Game Definition。
- 選中 Make Game Definition 節點,在 Properties 面板中開啟它的 Custom Preview。遊戲會在視窗中執行,存檔儲存在記憶體中,開發者主控台處於開啟狀態。
鏈上的任何節點都可以預覽:序列以單標籤故事的形式播放,沒有 start 標籤的故事從其第一個標籤開始。條件和對變數的更改也是節點(If 搭配 Variable At Least,Apply Effect 搭配 Add To Variable);遊戲還可以用 Make Scene 寫成一個個場景,每個場景包含背景、音樂、臺詞以及故事接下來的去向。不使用自訂預覽時,這些值會以它們所對應的指令碼形式預覽,因此你可以讀到一串節點寫出了什麼。
在 Divooka 中使用 Novella 講解了每個節點、用 Events 圖編寫遊戲的方式,以及如何從 Flows 圖呼叫描述遊戲的 Function 圖。