Sonolus中间语言(SIL) - ReiKohaku/Sonolus-wiki-zh_cn GitHub Wiki

Sonolus中间语言

直接使用节点编写脚本非常低效,因为节点提供的抽象方法非常低能。

建议使用更高级的语言编写脚本(或创造自己的语言),然后编译、传输到节点。

Sonolus中间语言(SIL)就是为此而创建的。

它与现代语言相去甚远,因为它的特性很有限。不过,对于编写游戏而言,这个级别的脚本足够了。

编译器

SIL代码存储为纯文本,可以在任何文本编辑器中编辑。 若想要把SIL代码编译为level.json,请使用编译器

在输入level(JSON)时,不需要提供脚本节点键值。 相反,它们将会从SIL代码生成并注入。

语言特性

探索语言特性的最好方法就是使用编译器,将输入的SIL代码与输出的节点进行比较。

数值将会被编译为值节点。

1
0.5
-3

函数

函数采用**Func(...)**的形式,编译为函数调用节点。

参数在**(...)**内传递,并用空格分隔。

Add(1 2 3)
Multiply(4 5)
Log(6)

别名

可以通过**Alias:...**分配别名并在节点中配置指向。

LevelData:1
*Time:0
Time:Get(LevelData *Time)

PI:3.14159
Sin(Multiply(Time PI))

脚本回调

带有**#n.callback@order**表单的别名将会分配为入口节点中的调用的第n个脚本。Order是可选的,且默认值为0。

true:1
#0.shouldSpawn:true

空白

行以及参数间的空格将被忽略。

#0.updateParallel:Draw(
    TextureNote
    0 0
    0 1
    1 1
    1 0
    NoteZ
    NoteAlpha
)

注释

以**//**作为起始的行将被忽略。

// Return true X position of note, taking into account mirror
TrueX:Multiply(
    // Returns -1 if mirrored, otherwise 1
    If(
        OptionMirror
        -1
        1
    )

    // ... and multiply with original X position
    NoteX
)

示例代码

一个简单的引擎 带有注释。这是学习编写音乐游戏引擎脚本的良好起点。

BanG Dream引擎 LLSif引擎 22/7引擎 太鼓达人引擎 VOEZ引擎 Deemo引擎