高度なスクリプト

WMS

Suika2には WMS (Watermelon Script) と呼ばれる高度なスクリプトシステムが搭載されています。

フォルダとファイル名

WMSスクリプトは wms フォルダに格納されます。 ファイルの拡張子はまだ決まっていませんので、ゲーム開発者は好きな拡張子を利用することができます。

サンプルスクリプト

こちらがサンプルスクリプトです。この内容をファイル htllo.txt として保存してください。

func main() {
print("Hello, world!");
}

Suika2ScriptからWMSを呼び出す

Suika2ScriptからWMSを呼び出すには、 @wms コマンドを使用します。

@wms hello.txt

文法と使い方

この節ではWMSの文法について記述します。

関数の定義と呼び出し

プログラムは main() 関数から開始します。

func main() {
    // This is a comment.
    print("Hello, world!");
}

関数は他の関数を呼び出すことができます。

func main() {
    foo(0, 1 2);
}

func foo(a, b, c) {
    return a + b + c;
}

文字列を使って間接的に関数を指定して呼び出すことも可能です。

func main() {
    myfunc = "foo";
    myfunc(0, 1 2);
}

func foo(a, b, c) {
    return a + b + c;
}

func myfunc(a, b, c) {
    // この関数は呼び出されません。foo()が呼び出されます。
}

型と変数

プログラマは整数型、浮動小数点数型、文字列型、配列型の変数や値を操作できます。

func main() {
    // Integer
    a = 1;
    if(isint(a)) {
        print("a is int");
    }

    // Floating point
    b = 1.0;
    if(isfloat(b)) {
        print("b is float");
    }

    // String
    c = "string";
    if(isstr(c)) {
        print("c is string");
    }

    // Array (integer key)
    d[0] = 0;
    if(isarray(d)) {
        print("d is array");
    }

    // Array (string key)
    e["abc"] = 0;
    if(isarray(e)) {
        print("e is array");
    }

    // Array of array
    f["key"] = e;
}

ループ

 指定した回数だけ繰り返すには、次のようにします。

func main() {
    for(i in 0..9) {
        print(i);
    }
}

配列の各要素について繰り返す場合は、次のようにします。

func main() {
    a[0] = 0;
    a[1] = 1;
    a[2] = 2;

    for(v in a) {
        print(v);
    }
}

配列の各キーと値のペアについて繰り返す場合は、次のようにします。

func main() {
    a["key1"] = 0;
    a["key2"] = 1;
    a["key3"] = 2;

    for(k, v in a) {
        print(k + "=" + v);
    }
}

通常の while ループを作成する場合は、次のようにします。

func main() {
    a = 10;
    while (a > 0) {
        print(a);
        a = a - 1;
    }
}

breakcontinueforwhile ループの中で使用することができます。

func main() {
    for(i in 0..9) {
        if(i == 2) {
            continue;
        }
        if(i == 7) {
            break;
        }
        print(i);
    }
}

分岐

プログラムは if - else if - else 構文で分岐することが可能です。

func main() {
    a = foo();
    if(a > 10) {
        print("a > 10");
    } else if(a > 5) {
        print("a > 5");
    } else {
        print("else");
    }
}

func foo() {
    return 6;
}

配列

配列の要素はキーを持ち、キーは整数、浮動小数点数、文字列のいずれかです。 1つの配列の中で、整数、浮動小数点数、文字列のキーを混ぜて使うことが可能です。

配列を作成するには、[キー] 構文で値を代入します。

func main() {
    a[0] = 0;
    print(a);
}

配列の要素を削除するには、remove() を使用してください。

func main() {
    a[0] = 0;
    remove(a, 0);
    print(a);
}

配列のサイズを取得するには、size() を使用してください。

func main() {
    a[0] = 0;
    print(size(a));
}

変換

整数から文字列へ:

s = "" + 123;

小数から文字列へ:

s = "" + 1.23;

整数から小数へ:

f = 0.0 + 1.23;

文字列から整数へ:

i = 0 + "123";

文字列から小数へ:

f = 0.0 + "123";

Suika2 API - Suika2エンジンの呼び出し

Suika2エンジンは、エンジンを操作するための予め定義された関数を提供します。 これらの関数は名前の先頭に s2_ を持ちます。

エンジンの変数を取得する

ここで言う変数とは、シナリオの分岐に利用されるフラグのことです。
s2_get_variable() は変数番号を受け取り、変数の値を返します。

value = s2_get_variable(100);

エンジンの変数を設定する

ここで言う変数とは、シナリオの分岐に利用されるフラグのことです。
s2_set_variable() は変数番号と値を受け取ります。 この関数は変数の値を変更します。

s2_set_variable(100, 1);

コンフィグを上書きする

次の関数はコンフィグを上書きします。

  • s2_set_config(): 文字列のキーと、文字列の値を受け取ります。

場合によって、コンフィグの変更は即座には反映されません。 このとき、WMSコードは s2_reflect_*_config() を呼び出す必要があります。

// これは即座に反映されます
s2_set_config("msgbox.x", "0");
s2_set_config("msgbox.speed", "20.0");

// これは即座には反映されません
s2_set_config("msgbox.bg.file", "msgbox-bg.png");

メッセージボックスと名前ボックスを更新する

s2_reflect_msgbox_and_namebox_config() はメッセージボックスと名前ボックスに関するコンフィグの変更を反映します。

s2_reflect_msgbox_and_namebox_config();
←ビジュアルノベルモード