サブルーチンはラベルによって区別されますので、ラベルを定義します。サブルーチンから呼び出し元に戻るところに
return タグ、サブルーチンを呼び出すには
call タグを用います。
下の例を見てください。
[wait time=200]
*start|スタート
[cm]
サブルーチンを呼び出します。[l][r]
[call target=*subroutine]
サブルーチンを呼び出しました。
[s]
*subroutine
これはサブルーチンです。[l][r]
クリックをすると呼び出し元に戻ります。[l][r]
[return]
さて、この例を実行させると、「サブルーチンを呼び出します。」のメッセージのあとに「これはサブルーチンです。」と表示され、「クリックをすると呼び出し元に戻ります。」でクリックすると、「サブルーチンを呼び出しました。」と表示されるはずです。
つまり、call タグで指定したラベルにジャンプをするのですが、このときに呼び出した位置が自動的に記録され、return タグでは、この記録された呼び出し元に自動的に戻ります ( この自動的に記録されるものを「
コールスタック」と呼んでいます )。
この例では、
*subroutine
から
[return]
までが「サブルーチン」です。
サブルーチンの中からほかのサブルーチンを呼び出すこともできます。呼び出しの深さ ( return せずにいくつまで call できるか ) に制限はありません。
ちなみに「選択肢を使ってみよう」の所ではラベルの次には [cm] を書くと書きましたが、セーブの箇所となるような ( | 付きの ) ラベルの次でなければ [cm] を書かなくても OK です。
コールスタックには、シナリオファイル名、シナリオ中の直前のラベルとそれから call タグのある行までの行数、call タグのある行の内容、その行内での位置の情報しか記録されません。シナリオのデバッグ中などで、戻り先のシナリオファイル中の構成が変わるととんでもない位置に戻ってしまう場合があるので注意してください。
基本的には、サブルーチンのラベルやサブルーチン中には、セーブ箇所となるラベル ( | 付きのラベル ) を使わない/作らないが吉です。