简体中文
English 简体中文 繁體中文
Methodox 首页

示例

Explore 示例

Divooka Explore 示例包中的 Visual Novel 文件夹按顺序讲解 Novella,从三个节点一直到完整的游戏。每个文档都可以直接运行:三个完整游戏 Moon Festival Riddles、A Match for the Matchmaker 和 The Red Thread 都把各自的美术、声音和脚本放在文档的库中。从 Variables and Effects 到 A Lantern Stall 的 11 个文档,每次讲解一个概念,介绍不用任何脚本编写故事的节点;与 Story as Nodes 一样,每个文档都通过一个小型 Play Routine 来播放。

本页面上的每个示例都随 Divooka Explore 一同提供,包括 The Red Thread;这里没有任何东西需要另外获取。

示例 形式 讲解内容
Hello Novella Routine 图 最小的游戏:Make Novella Game、Load Script(故事放在一个 Text 节点上)、Run。故事还没有美术素材,因此 Novella 会绘制占位图。
Characters and Images Routine 图 用节点而不是脚本定义来配置的游戏:Define Image 定义的色块(与内置的 black 和 white 并用)、带颜色和图像标记的 Define Character、Set Theme 和 Set Default。
Story as Nodes Flows 图 以数据形式构建的场景:Start Sequence、Scene、Narrate、Show、Say,以及一个选项为 Make Choice 节点的 Menu,然后是 Make Label、Start Story、Add Label 和 Make Game Definition。
Variables and Effects Flows 图 无脚本节点,第 1 课(共 11 课)。一个夜市场景:Add Default 为变量设置初始值,Apply Effect 在它在序列中所处的位置更改变量,配合 Combine Effects、Add To Variable、Set Variable 和 Add To List;每次更改都会通过 [variable] 显示在下一句台词中。
Conditions Flows 图 第 2 课(共 11 课)。走向月门的一段路:每句台词一个 If,分别基于 Variable At Least、Has Visited、Compare Variable 和 Variable Is Set,另有两个基于 All Of 和 Any Of 并搭配 Not。第一个标签以 Return 结束,因为用节点构建的标签不会像脚本中的标签那样落入下一个标签。
Choices That Remember Flows 图 第 3 课(共 11 课)。故事会用 Jump 回到的船夫菜单,其中 Make Choice 接受一个 Condition,使某个问题在被问到之前一直可选,而渡河选项只在问过之后才出现。
Scenes Flows 图 第 4 课(共 11 课)。四个场景,每个都是带背景、转场和音乐的 Make Scene,结尾分别为 Choose Scene(在 Scene Choice 上带条件和效果)、Branch To Scene、Go To Scene 和 End Game,并用 Add Scene 汇集起来。
Achievements and Gallery Flows 图 第 5 课(共 11 课)。一次孔明灯许愿:Add Achievement(其中一个是隐藏成就)、每个选项中的 Achieve,以及 Add Gallery Entry,用于一张被看到后即在画廊中解锁的图片。
Animation and Transforms Flows 图 第 6 课(共 11 课)。河上升起的灯笼:两段由 Start Animation、Set Property、Animate Property、Also Change 和 Repeat 构建的动画,一段由 Define Transform 命名并带参数,用 Show With Options 以 truecenter, float 显示,之后改为 float(60);另一段直接连到某个 Show With Options 的 Animation 引脚。灯笼本身是用 Add Animated Image 制作的动画图像:Show Picture 步骤之间穿插 Wait,让它在亮和暗两张图片之间闪烁,无论在哪里显示、如何移动都是如此。
Screens Flows 图 第 7 课(共 11 课)。一块谜题板,用 Start Screen、Add Screen Text、两个 Add Screen Button 和一个动作为 Answer 的 Add Screen Timer 布局,旁边是一个带 Add Screen Bar 的状态界面;Add Screen 把两者放入故事,Show Screen 把状态界面叠加在场景上,Call Screen 两次调出谜题板,If 检查 _return 中的答案。
A Bag of Gifts Flows 图 第 8 课(共 11 课)。一个用容器布局并跟随故事变化的界面:Start Screen,然后是 Add Box(一个装着 vbox 的 frame),其内容从 Start Contents 开始:一个标题;遍历 bag 列表的 Add For Each,每件礼物一个按钮(其动作是由 Set Variable To Action chosen = item 和 Close Screen 组成的 Then Action);以及在袋子为空时显示一行文字的 Add If。故事调用该界面,用 Change Variable By Variable(bag -= chosen)取出礼物,然后再次调用,此时少了一个按钮。
Logic in Function Graphs Function 图和 Flows 图 第 9 课(共 11 课)。条件和效果节点无法组合出的判断和值,仍然不用脚本:两个成员 Function 图接受一个 Story Variables,并用它的 const 成员之一 Number 读取它,正是这一点让数据流 Function 图可以调用它;Is Generous 回答真或假,Blessing 返回一个数字,Condition From Function 和 Number From Function 在其函数引脚上指定它们。
Styles Flows 图 第 10 课(共 11 课)。在节日之夜重新设置样式的 Novella 自有界面,每个样式一行:Start Style,每个属性一个 Set Style Property,其值按脚本中的写法给出("gui/window.png" 带引号,(64, 64, 64, 64) 带括号),以及 Add Style。对话框和名字标签使用绘制好的九宫格图片,选项在空闲时用一张图片、在指针悬停时用另一张(State hover);嫦娥(Chang'e)通过 Character Part Style 和 Set Character Style Property,在她专属的对话框 moon_window 中说话,其父样式是 say_window;{style=lantern} 为一句台词中的两个词设置样式。完整的样式系统参见 样式。
A Lantern Stall Flows 图 第 11 课(共 11 课)。用节点为游戏自己的界面设置样式:Set Screen Style Prefix stall,使界面的按钮、按钮标签和文本分别用 stall_button、stall_button_text 和 stall_text 绘制;stall_button 在空闲、指针悬停(hover)和不可用(insensitive,用于钱袋买不起的灯笼)时各有一张图片;Style Last Element 为容器指定 stall_sign,为标题指定 stall_title;Set Last Element Style Property 只在一个按钮上设置 text_size。该界面被调用两次,每个灯笼的按钮用 Set Variable To Action 付款。
Game as a Function Function 图和 Flows 图 函数式工作流:成员 Function 图 Build Game 返回一个 Game Definition,Flows 图调用它并播放。
Live Script Events 图 一个 Novella Application,其 Script 事件就是故事,Menu 的回答连到 Branch;并说明为什么实时脚本不能存档。
Commands Events 图 脚本中的 run roll 和 run greet "Wei" 由 Command 事件通过 Set Result 回应,Get Variable 和 Set Variable 访问故事的变量。
Moon Festival Riddles Events 图 一个小型完整游戏:中秋节的灯谜,三道谜题、两个结局、一张画廊图片和三个成就,其美术由编写它的配方绘制。
A Match for the Matchmaker Function 图和 Flows 图 完全用节点、不用脚本编写的完整游戏:The Red Thread 的外传,使用其美术和音乐,六个场景各是一个返回 Scene 的成员 Function 图。详见下文。
The Red Thread Events 图 下文介绍的示例游戏的完整版本:库中嵌入了 87 个文件,Setup 加载它们,Command 回应故事的 fortune。

可以运行其中任何一个,也可以从 Properties 面板中的 Custom Preview 播放某个定义:运行之后选中 Make Game Definition(或任何 Sequence、Label 或 Story 节点),然后按 Custom Preview。这些示例用到的每个节点参见 在 Divooka 中使用 Novella。

Moon Festival Riddles:第一道灯谜

Moon Festival Riddles:赢得兔子灯

Moon Festival Riddles:从桥上看到的两个月亮

较小的文档使用 Novella 的占位图和色块,这正是游戏在美术素材完成之前的样子:

Hello Novella:占位图上的一个选项

Characters and Images:用节点定义的两个角色和一个背景

两节样式课绘制了自己的对话框、名字标签、选项和按钮,游戏就用它们来绘制:

Styles:节日对话框、专属的名字标签和一段设置了样式的文本

Styles:嫦娥在她专属的月亮对话框中

A Lantern Stall:摊位的招牌和按钮,其中一个不可用,一个比其余的小

节点图

这些图片由 dvkview 绘制,它是 Parcel NExT 中以无头方式渲染文档节点图的实用工具,因此比编辑器中的样子朴素;节点、字面值和连线都是文档本身的。

Hello Novella,整个游戏都在一个 Routine 中:

Hello Novella 的 Routine 图

Story as Nodes,一个场景写成一串 Story Writing 节点,每个选项单独一行,故事在下方组装:

Story as Nodes 的 Flows 图

Game as a Function:构建定义的成员 Function 图,以及调用并播放它的 Flows 图:

Build Game 函数图

Game as a Function 的 Flows 图

Live Script,在 Events 图中以过程形式讲述的故事:

Live Script 的 Events 图

Commands,Command 事件按命令名称分支:

Commands 的 Events 图

A Match for the Matchmaker

A Match for the Matchmaker 是 The Red Thread 的外传,使用其美术和音乐讲述,完全用 Divooka 节点编写,没有脚本。元宵节前夕,清岚(Qinglan)的丫鬟小桃(Xiaotao)认定,为别人撮合了上百桩姻缘的王媒婆(Auntie Wang)也该有一桩属于自己的,于是设法让她和苏老爷(Master Su)在月出时同上一座桥。游戏有三个菜单、两个结局、一个隐藏成就和两张画廊图片。

A Match for the Matchmaker:苏老爷和王媒婆在桥上

要了解如何把一个完整游戏布局为节点,就该读这个示例:

部分 构建方式
场景 六个成员 Function 图,每个场景一个,各返回一个 Scene:其台词是一页 Story Writing 节点,在边缘由 Concatenate 连接;其菜单和 If 由 Conditions 节点提供输入;其选项通过 Effects 节点更改变量;其结尾是一个带 Go To Scene、Choose Scene、Branch To Scene 或 End Game 的 Make Scene。
故事 入口 Flows 图把角色阵容、Add Default、Add Gallery Entry、Add Achievement 和 Add Scene 汇集成一个故事和一个 Game Definition,并通过与各课相同的 Play Routine 播放。
外观 成员 Function 图 Look 通过 With Config 和 With Theme 为定义赋予 The Red Thread 的设置和主题,使游戏采用示例游戏的对话框、字体和界面音效。
资源 库中只嵌入了故事用到的图片、音乐和声音,以及涵盖它们的署名和许可证。

同一个故事也有逐句对应的 C# 程序版本,即 Parcel NExT 源代码树中的 TestPrograms/Novella.Matchmaker,使用 故事构建器 编写;两者播放出的文字记录完全相同。

The Red Thread

The Red Thread(红线)是 Novella 的示例游戏:一部简短而完整的视觉小说,从头到尾全面运用了引擎的功能。它的 C# 程序是 Parcel NExT 源代码树中的 TestPrograms/Novella.RedThread,是 C# API 的标准示例;同一个游戏也作为 Visual Novel/The Red Thread 随 Explore 示例包提供,这是一个 Divooka 文档,每张图片、每个声音、字体、影片和脚本都嵌入在它的库中,其 Events 图所做的正是 C# 程序所做的:它的 Setup 事件添加库并加载脚本,它的 Command 事件回应故事中唯一的命令。

The Red Thread 的主菜单

The Red Thread 的 Events 图

故事

临安(Lin'an),一座带有宋代风味的江南水乡小城,时值春日。陆文景(Lu Wenjing,即玩家,名字可在开头更改)是一位年轻书生,寄居城中准备科举。城里最忙碌的媒婆王媒婆认定他该娶茶商之女苏清岚(Su Qinglan);而清岚会弹古琴,根本不打算让任何人给她说媒。从梅花开放到元宵节的几个星期里,书生可以通过传统的求爱习俗赢得她的青睐:唱和诗句、挑选礼物、猜灯谜,最后请媒婆正式提亲——或者不提。

月老——月下为命中注定成婚之人系上红线的老人——的传说贯穿整个故事:故事以红线开篇,也以红线收尾。

角色 身份
Su Qinglan (苏清岚) 女主角:机智、精通音律、独立。
Auntie Wang (王媒婆) 媒婆:嗓门大、滑稽,内心善良。
Xiaotao (小桃) 清岚的丫鬟兼传话人,调皮。
Master Su (苏老爷) 她的父亲,一位严厉的茶商。
Lu Wenjing (陆文景) 玩家,只以侧边图像出现。
Yue Lao (月老) 月下老人,出现在序章和尾声中。

各章依次为月下序章、茶馆、梅林、集市、荷花亭、元宵节和提亲,共有三个结局:订婚并成婚;一段友情,清岚离开去京城学习音乐并写信来;以及姻缘另结他处,书生回到他的书本中。

茶馆,以及王媒婆的第一个问题

在梅林中对出清岚的对联

集市,以及小桃

一张 CG:搁琴待月

节日里的灯谜

一张 CG:河上的灯

在苏老爷的厅堂里提亲

婚礼,以及书生的侧边图像

观看

以下视频直接录自引擎本身,通过真实控件游玩(无头运行,因此没有声音)。片头影片、为书生命名、序章和茶馆:

梅林及其对联:

简体中文版的元宵节:

提亲和婚礼:

展示的功能

功能 位置
分布在多个脚本中、合并为一个整体的故事:设置、定义,然后每章一个文件 scripts/options.novella、script_01_definitions.novella ... script_09_endings.novella
用脚本编写的配置和完整主题:英文和中文字体、九宫格对话框、名字标签和选项、界面音效 options.novella
片头影片,然后用 input 为玩家命名 序章
带参数的可复用标签 call chapter_title("Chapter One", "The Teahouse"),以及居中的标题卡 每一章
由文件命名的图像、角色说话时变换的表情、玩家的侧边图像 贯穿全篇
带参数的动画变换(sway、drift、hop、slow_zoom)和具名转场 定义部分和每个场景
在 while 中用 menu set 编写的问答,使每盏灯笼只读一次 元宵节
用 C# 实现的 run fortune 命令,从故事的随机数生成器中抽取,因此回滚无法重新抽签 元宵节
决定结局的变量(affection、sincerity、riddles_solved、gift) 各结局
一封以 NVL 页面呈现的信 友情结局
持久数据、画廊、音乐空间和成就,其中包括一个隐藏成就和一个看完所有结局的成就 定义部分和各结局
以显式台词 id 为键的完整简体中文翻译,并有用于名字、选项、标题和签文的字符串表 zh_hans.novella

整个游戏的简体中文版,界面也是中文:

简体中文版的茶馆

简体中文版的对联:是真正的对联,而不是译文

简体中文版的主菜单

运行

游戏的美术、音乐、声音、字体和视频存放在仓库之外(仓库中不保存二进制媒体文件),也不会单独发布:要获得完整游戏,方法是使用 Explore 文档,它的库中包含每一个文件;而 C# 程序则从一个文件夹中读取它们。这套资源中的每一项都是临时替代品,发布前需替换为原创作品,其署名和许可证随资源一同提供(CREDITS.md 和 licenses/)。程序按以下顺序查找资源文件夹:第一个命令行参数、NOVELLA_RED_THREAD_ASSETS 环境变量所指定的文件夹、程序旁的 Assets 文件夹(已发布的副本就是这样提供的:以自包含方式发布,并把资源放在它旁边),最后是用户主文件夹下的 Data/Novella/The Red Thread。

TheRedThread [assets folder]
TheRedThread --lint [assets folder]
TheRedThread --shoot out-folder [--choices 0,1,2] [--language zh-Hans] [--steps 900] [--every 20] [assets folder]

--lint 将故事与其文件进行核对;--shoot 以无头方式通过真实控件游玩,每隔几步保存一张带描述的截图,并保存一份文字记录,按给定的选项进行选择(之后选第一个),可选择使用另一种语言,如果有任何内容缺失或失败,则以退出码 3 退出。