実行処理をラベル位置に誘導
それでは、ラベルについて解説する時に本来説明すべきとあった命令を紹介します。
その前に、重要な要素でもあるわけですから、ラベルの説明をもう一度だけおさらいしておきましょう。
今回でラベルの解説は終わりにしますが、しつこいように何度も書くのは、
それほど「重要なものでもあるから」ですので、きちんと理解してください。


ラベルは、スクリプト上の目印として存在し、単体ではこれ以上に意味はありません。
しかし、用意された命令を組み合わせると「イベント発生時の処理再開はこのラベル位置から」といった
処理位置自体を制御するための目印にもなります。
ラベル名には、半角「*(アスタリスク)」を先頭に付けて、59バイト以下の英字から始まる英数、
または全角文字列(記号・数値・英字・漢字・カナ等)で構成します。
処理位置の制御にも使用する為、先頭59バイトが同一となるラベル重複は許されていません。
先頭から59バイトまでというのは、ラベルとして判断されるのが先頭から59バイトまでと言うことで、
60バイト目以降が変わっていても同一ラベルとみなされてしまいます。
半角英字の場合、大・小文字は判断されず、大・小文字が違うだけで他は全て同じである場合は、
重複となってしまうので注意してください。
また、ラベル名としては1つであっても変数名との重複も許されていません。
プログラマが分かっていても、指定ワードがラベルなのか変数なのかをHSPは理解できませんからね。
半角記号は含められないと述べましたが、記号の中で使用できる文字が存在します。
それは「_(アンダーバー)」で「*This_is_Sample_Label」のように使用することができます。
@(アット)」もラベルに使用することができますが、コレだけは少し特殊で他のラベルと異なり、
同一スクリプト内に複数配置(重複)が可能となっており、HSPではローカルラベルと呼ばれています。
他のラベルが重複できないのは、処理の実行先がどのラベルを指しているかが分からないから、でした。
ローカルラベル「*@」はどのようにして目的のラベルを見分けるかと言うと、
コレも他のラベルとは異なり、1つ前もしくは1つ後のローカルラベルにしか移動できないのです。
処理位置の1つ前のローカルラベルは「*@before」、1つ後は「*@forward」と指定するのです。


それでは、ラベルを使った命令を紹介致します。

goto ジャンプ先ラベル
ジャンプ先ラベル処理の移動先ラベルをアスタリスク付で指定する。
goto命令を使用することで、次に行う処理を指定ラベル先の処理からに変更できます。 exgoto命令と命令名称は似ていますが、goto命令の方が古くから存在している命令であり、 exgoto命令が「EXtended(拡張した)なGOTO」という位置付けとなります。 名称の由来はイイとして、goto命令はexgotoのように条件に当てはまったときだけ処理を移すのではなく、 無条件に処理を指定ラベル位置に変更する命令となります。 それがどうしたのかと言いますと、 処理位置を戻すだけだと、ループ命令同様に無限ループに陥ってしまう点を意識しておく必要があります。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
	mes "Start !"
	goto *_2

*_1
	mes "1"
	goto *_4

*_2
	mes "2"
	goto *_1

*_3
	mes "3"
	goto *_5

*_4
	mes "4"
	goto *_3

*_5
	mes "Goal !"
上記、サンプルスクリプトの処理の流れは、2行目の次は8行目、10行目まで来ると4行目へ、 6行目から16行目、18行目から12行目、14行目から20行目へと移動しています。 実際に動かしてメッセージ表示の順番を見てみることで分かることと思います。 ローカルラベルのサンプルも載せておきましょう。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
*one
	mes "1"
	goto *two

*@
	mes "2"
	goto *three

*two
	mes "3"
	goto *@b

*@
	mes "4" // ココは通りません

*three
	mes "5"
	goto *@f

*@
	mes "6"
goto命令でローカルラベルへジャンプしていますが、「*@before」も「*@forward」も書かれていません。 ソレらしいものは「*@b」と「*@f」が該当しますね。 実は、「before」「forward」と最後まで書かなくても認識されるようになっています。 先頭1文字でなくても構いませんが、途中の1文字はダメです。 構わないと言うのは例えば、「bef」や「fo」等の「先頭から任意の文字まで」でも良いという事です。 6章でシステム変数looplevについてご紹介致しましたが、そこで書いていた内容を覚えていますか? ループを正常に抜けずに繰り返すとエラーとなってしまいますので、 このgoto命令は、ループ内で使用することは絶対に避けてください。 と言っても、ココで言うループとはrepeat命令によるループのことです。 その他マクロによるループであれば、擬似ループである為にエラーにはなりませんが、 プログラムの作りとして良いといえるものではありませんので、控えてください。 ループ中に使いたくなった場合は、break命令で一旦ループを抜けた後で使用するように心掛けましょう。 goto命令、exgoto命令以外にも処理実行先を変更する命令がありますが、 サブルーチンの章で紹介するとして、この章ではコレくらいで終了にします。