NarraLeaf

フロー制御

順次実行、並行実行、ループ、ラベル、ジャンプ、入力待ちを扱う `Control` クラスのフロー制御ユーティリティ

Control はフロー制御のためのユーティリティメソッドを持つクラスです。

Control.do([
    character1.say("hello"),

    // サウンドの再生と画像のシェイクを同時に行う
    Control.allAsync([
        sound.play(),
        shake(image1),
    ]),
]);

静的メソッド

do

アクションを順番に実行し、各アクションの完了を待ちます

  • actions: ActionStatements - ActionStatements
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

doAsync

アクションを順番に実行しますが、このアクションの完了は待ちません

  • actions: ActionStatements - ActionStatements
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

any

すべてのアクションを同時に実行し、いずれか一つの完了を待ちます

  • actions: ActionStatements - ActionStatements
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

all

すべてのアクションを同時に実行し、すべての完了を待ちます

  • actions: ActionStatements - ActionStatements
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

allAsync

すべてのアクションを同時に実行しますが、すべての完了は待ちません

  • actions: ActionStatements - ActionStatements
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

repeat

アクションを複数回実行します

  • times: number - 回数
  • actions: ActionStatements - ActionStatements
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

whileLoop

条件が真である間、アクションを実行します

const loopState = new Persistent("loop-state", {
    tries: 0,
});

story.registerPersistent(loopState);

scene.action([
    loopState.set("tries", 0),

    Control.whileLoop(loopState.evaluate("tries", (tries) => tries < 3), [
        character.say`Attempt ${loopState.get("tries")}`,
        loopState.set("tries", (tries) => tries + 1),
    ]),
]);
  • condition: Lambda<boolean> | LambdaHandler<boolean> - チェックする条件
  • actions: ActionStatements - ActionStatements
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

breakLoop

現在のループ(repeat/while)を中断します。 ループ本体の中でのみ使用できます。

scene.action([
    Control.whileLoop(loopState.evaluate("tries", (tries) => tries < 10), [
        Condition.If(loopState.equals("tries", 3), [
            character.say("Stop here."),
            Control.breakLoop(),
        ]),
        loopState.set("tries", (tries) => tries + 1),
    ]),
]);
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

sleep

指定した時間だけ待機します

  • duration: number | Awaitable<any> | Promise<any> - 待機する時間
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

waitForClick

ユーザーがステージ上のどこかをクリックするまで実行を一時停止します(ダイアログ、ボタン、メニューなどの GUI 要素は除きます)。Sentence の中で時間指定なしのポーズを挿入するのと似ています。

ADV モードで「クリックして続ける」という間を作ったり、NVL ブロック内でプレイヤーの準備ができるまで一時停止したりするのに便利です。

scene.action([
    character.say("Read this carefully..."),
    Control.waitForClick(),
    character.say("Now we continue."),
]);
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

label

現在のシーン内に、jump がジャンプ先にできる名前付きの地点を作成します。ラベルは実行時には見えず、単に次のアクションへと通過するだけです。

ラベル名は宣言されたシーンの中だけで有効なスコープを持つため、同じ名前を別のシーンで再利用できます。同じシーン内で同じ名前を2回宣言すると、ビルドが失敗します。

scene.action([
    Control.label("intro"),
    character.say("Let's begin."),
]);
  • name: string - ラベル名。そのシーン内で一意である必要があります
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

jump

同じシーン内の別の場所にある label にジャンプし、そこから再生を再開します。

Scene.jumpTo とは異なり、これは現在のシーン内にとどまります — シーンのアンロードや再初期化は行われず、再生位置だけが移動します。ジャンプ先は同じシーン内で宣言されたラベルでなければならず、そうでない場合はストーリーのビルドに失敗します。

Control.jump はメインのストーリーフローをリダイレクトするため、(メニューの選択肢のような)分岐の最後のアクションとして配置してください。シーンをループさせたい場合は、repeat / while の本体からジャンプで抜け出すのではなく、メニューや条件によってループを駆動してください。

scene.action([
    Control.label("start"),
    Menu.prompt("Again?")
        .choose("Yes", [Control.jump("start")])
        .choose("No", []),
]);
  • name: string - ジャンプ先のラベル名。同じシーン内で宣言されている必要があります
  • 戻り値: Proxied<Control, Chained<LogicAction.Actions>> - チェーンされた Control インスタンス

このページの目次