シナリオデータは「.eve」という拡張子が付いていますが、実際にはテキスト形式ですので、「メモ帳」等のテキストエディタで簡単に見ることも編集する事もできます。詳しくはヘルプの データの作成 -> データを作成する前に をお読みください。
シナリオデータはプログラム言語の様になっており、ロボットなどのデータに比べて非常に複雑ですが、まずは「ヘルプファイル」をよく読んだ上で、既存のシナリオデータを見てみたり 、それらを改造してみたりして練習して覚えて行くのが良いでしょう。
有志の方が作ってくださった サンプルシナリオのセットは、特におすすめします。
そのうち、チュートリアルシナリオ(チュートリアル.eve)は、実際のシナリオを動かしながらSRCシナリオの作り方を学ぶのに有用です。
サンプルシナリオ(SRCサンプル.eve)とミニキャンペーン(決戦!宇宙怪獣○話.eve)は、イベントファイルの中にコマンドなどの詳しい解説が埋め込まれています。 テキストエディタでイベントファイルをのぞきながらプレイすると、シナリオ作成の習得に役立つでしょう。
マップはSRCに添付されている「Mapedit.exe」というツールを使って作製します。使い方はグラフィックツールの要領によく似て簡単ですので、まず試してください。
基本的にビットマップの画像作者にメールなどで了承を取ってからにしてください。
アニメ原作のコピーはある程度OKですが、スーパーロボット大戦のコピーシナリオは同シリーズの発売元であるバンプレストに、経営上のダメージを(規模の大小はともかく)与えてしまう恐れがありますので避けてください。
完成したシナリオの発表は、個々の作者でシナリオをダウンロードするホームページを作って頂き、シナリオコーナーに登録すると言うのが基本的な流れになっています。 詳しくは同コーナーにあるシナリオコーナー投稿規約をご参照ください。
SRCでのエラーは、大きく分けて次の2つがあります。
・データがSRCの書式や文法に違反している場合
・SRC本体のバグによるもの
前者の場合、エラーメッセージ画面にイベントファイル上のエラー発生個所が表示されます。これを参考にしてデータを修正しましょう。 なおQ507には自作データのよくあるミスの事例を上げていますのでこれも参考にしてください。
またSRCは非常に複雑なプログラムであり、また頻繁に機能追加が行われるため、予期しないバグが潜んでいる場合があります。 あきらかにSRC本体のバグと思われる現象が発生した場合は、その具体的な状況や現象(最低でもエラーが発生したシナリオ名) をできるだけ詳しくバグ報告掲示板に報告してください。
関連項目:その他よくある質問 / よくあるエラーメッセージとその対策
シナリオを作成する上で最も基本となるのがこの「Createコマンド」です。
そのためシナリオ作成初心者の方が最初にこれでよく悩まれる事も多いので、ここではその解説をします。
<重要>:このコマンドに限らず、シナリオを作成する為には「HELPファイル」をよく参照するのが非常に重要です。 必ずHELPファイルのこの項目も同時に見ておく様にしてください。
例) Create 敵 ダイン1号機 1 ジョー 20 5 5
このコマンドの各項目(引数)の意味は、左から順に……
<Create>=クリエイト。ユニットを作り出す命令です。
<敵>=「敵、味方、NPC、中立」の所属する陣営の指定。
<ダイン1号機>=ロボット(ユニット)の指定。
<1>=機体のランク(改造レベル)の指定。
<ジョー>=ロボットに搭乗するパイロットの指定。
<20>=パイロットのレベルの指定。
<5 5>=登場時のマップX,Y軸の指定。
の意となります。 よってこの「Create 敵 ダイン1号機 1 ジョー 20 5 5」というコマンドは
『敵として、改造度が1のダイン1号機というユニットに、ジョーというレベル20のパイロットを乗せ、座標[X]5、座標[Y]5に出撃させる』
という事を表すことになります。
なおこのCreateコマンドを使う上でのよくあるエラーは以下の4点です。
(1) 引数(項目)の数は間違っていないか?
上記解説の様にこのCreateコマンドには「敵」とか「パイロット名」など、7つ(もしくは8つ)の項目の指定が必要です。 その数はチャンと足りているでしょうか? 何かが抜けてはいませんでしょうか?
(2) 「半角」と「全角」を間違っていないか?
各引数の数字の指定は「半角数字」でないといけません。 これが全角数字になってはいないでしょうか?
また引数同士は[半角スペース]で間を開けなければいけません。これも「全角スペース」で開けていないでしょうか?(もしくはスペースが抜けているか)
(3) ユニットかパイロットを「愛称」で指定してはいないか?
これらは「名称」で指定しなければなりません。
(4) 「(ザコ)」または「(汎用)」がついていないパイロットを複数出場させようとしていないか?
同じマップに複数登場するパイロットは、名前の最後に「(ザコ)」または「(汎用)」と付いていなければなりません。 "〜というパイロットは既に登録されています" というエラーが出るときは、このミスの可能性があります。
以上、よくチェックしてみてください。
関連項目:その他よくある質問 / よくあるエラーメッセージとその対策−ユニット・パイロットなどデータ関係のSRCエラーメッセージ
合体するユニットは、合体後のユニットをCreateコマンドやUnitコマンドなどであらかじめ作っておかなければなりません。 例えば、3体合体のユニットなら
Create 味方 ダイン1号機 0 ジョー 2 14 5 Create 味方 ダイン2号機 0 カムイ 2 15 6 Create 味方 ダイン3号機 0 シキイ 2 16 4 Unit 合体機神ダイオン 0
とすると、分離状態のユニットが3機現れ、任意で合体させる事ができます。
意図しないのにイベントが何回も起こってしまう場合は、以下のミスによることが多いです。
(1) 直前のイベントに「Exit」が抜けている。
イベントは、「Exit」か「Continue」「GameClear」「GameOver」「Quit」などを実行しない限り終わりません。 これらのコマンドがないと、イベントラベルを越えてその次のイベントの中味まで実行されてしまい、その次のイベントは本来の発生条件を満たしたときに再び実行されることになります。
(2) イベントを1回だけ起こすつもりだったのに、ClearEvent コマンドがない。
イベントは、ClearEvent で無効にしない限り、条件を満たすたびに発生します。
(3) エピローグイベントの中に「Continue」コマンドを使っている。
Continue は“システム変数「次ステージ」に指定されたステージをセットしたあと、エピローグイベントに移る”、という動作をします。 したがって、エピローグイベントのなかで使われると、何度もエピローグイベントの始めからやり直すことになります。
なお、イベントラベルのミスは、クイックロードでは訂正が反映されません。 確認の際はステージの最初からやり直す必要があります。
この場合、よくある原因は次のものです。
(1) 同じ種類のイベントを複数、作成している。
同じ種類のイベントを複数作っても、条件を満たしたもののうち最初のイベントしか実行されません。 これを防ぐためにはイベントラベルの最初に「*」を付けて常時イベントラベルにします。 詳しくはヘルプの 「シナリオの作成」->「イベントラベル」のページの「イベントラベルの引数」と「常時イベントラベル」の項を参照してください。
また、イベントを一つに統合するという対策手段もあります。 いろいろな発生条件のイベントを統合する場合は、Ifコマンドを使って条件を付けます。
# 例:次のような二つの攻撃イベントがあったとします。 攻撃 味方 全: (イベント内容1) Exit 攻撃 パイロットA ボス: (イベント内容2) Exit # このままでは二つ目のイベントが起こらないので、 # 二つのイベントを統合します。 攻撃 味方 全: (イベント内容1) If 対象パイロット = パイロットA And 相手パイロット = ボス Or_ 対象パイロット = ボス And 相手パイロット = パイロットA Then (イベント内容2) EndIf Exit # ただしこれは、パイロットA ・ ボスがともにネームドの場合です。 # ザコ ・ 汎用の場合は、パイロット名とパイロットIDが異なるので、 # 対象ユニットID = UnitID(パイロットA) # などに書き換える必要があります。
(2) イベント冒頭の追加条件設定にミスがあり、成立しえない条件になってしまっている。
たとえば、イベント冒頭に
If ターン数 < 3 And ターン数 > 5 Then
と、不等号の向きを逆にしてしまった場合などです。
条件に使う変数のスペルミスやシステム変数の記憶違いなどもありえます。たとえば、第5ターンにイベントを起こそうとして、
If タ‐ン数 = 5 Then
としてしまうなど。音引き「ー」とすべきがハイフン「‐」になっており、この変数は(偶然、他のところで使われてない限り)いつまでたってもゼロのままで条件は成立しません。
(3) イベントラベルの書式や引数設定にミスがあり、イベントが成立しえない。
誤り例: ターン 味方 敵:
ターンイベントの第1引数はターン数を入れるべき場所なので、「味方」は変数名とみなされてしまいます。 使っていない「変数」の値は通常ゼロだから、このイベントは発生しません。
特に多いのは、破壊イベント・攻撃イベント・進入イベントなどの引数のユニット指定がまちがっていることです。 そのため、存在しないユニットが破壊されたり攻撃したりした時のイベントになってしまい、けっして発生しないことになります。
パラメータをデータのファイルと厳密に照合してください。
このミスを減らす有力な方法は、データからパラメータにCopy&Pasteすることです。
引数をメインパイロット名またはユニット名にすべきところを、愛称にしてしまうミスもよくあります。
また、(ザコ)・(汎用)のパイロット名・ユニット名で引数指定すると、個機を特定できません。イベントラベルで個機を指定するにはグループIDを用いてください。
なお、イベントラベルのミスは、クイックロードでは訂正が反映されません。 確認の際はステージの最初からやり直す必要があります。
(4) ClearEvent の設定ミス
たとえば、敵ボスキャラを破壊したとき1回だけ起こるイベントのつもりで、以下のように書いた場合です。
破壊 敵: If 対象パイロット = ボスキャラ Then …(中略) EndIf ClearEvent Exit
これだと、最初に「破壊 敵:」イベントが発生したときに ClearEvent されてしまいます。 その結果、ボスキャラの破壊時には(たいてい)すでにイベントが消去されてしまっています。
この場合、ClearEvent は If と EndIf のあいだに書かねばなりません。
<最初にすること>
このトラブルにあったときには、まず、
Ifコマンドの前後の行に『Talk 〜』か『Confirm 〜』を書いて、Ifコマンドそのものが実行されているか、条件分岐を左右する変数が思ったようになっているかを調べてください。 ElseIfやElseを使っているときはこれらの直後の行にも書いてください。(参考:Q512)
# 例: Confirm "If直前 iは、$(i)" If i <> 0 Then Confirm "If直後 iは、$(i)" (一つ目の分岐の処理) ElseIf Damage(対象パイロット) > 60 Then Talk ElseIf直後;対象は$(対象パイロット);ボスダメージは$(Damage(対象パイロット)) End (二つ目の分岐の処理) #…(後略)
If直前のConfirmの内容が表示されなかったときには、Ifコマンド自体が実行されていません。 他の箇所の記述を検討してください。 よくあるのは、(1)Ifを含むイベントが実行されていない(参考:Q410) (2)その前に別の「If」や「Switch」があるが「EndIf」「EndSw」で閉じるのを忘れている (3)Ifがどのイベントにも属していないなどです。
If直前のConfirmやTalkの内容が期待どおり表示されたときには、Ifコマンド自身は実行されています。 したがって問題があるのはそれ以降の処理です。
以下は、その場合のよくあるミスです。
<よくあるミス>
以下、よくあるミスを列挙します。 大部分は条件式のまちがいです。
誤: If 変数A = (1 Or 2) Then 正: If 変数A = 1 Or 変数A = 2 Thenといったまちがいです。 「Or」は左右の式のどちらかが0以外なら1、ともに0ならば0を出す演算子です。 誤まり例のような用法はありません。
If 変数A Thenとした場合です。 これでもうまくいくかもしれませんが、“「変数A」というパイロットか存在しているかどうか”と解釈される可能性があります。 下記のほうが確実です。
If 変数A <> 0 Then「Not 変数A」とした場合も同様です。
If Set 変数A 1 Thenこれは、
# 誤まり例: If ターン 8 > ThenIfの直後に来るのは式であり、イベントラベルの書式は適用できません。 また、「>」の両側には式がなければいけません。
変数A = 1 Then
ここでは、これまで質問掲示板に出たイベント関連ミスのうち、「イベント」というものへの誤解に関係したものを取り上げます。
(1)ステージはイベントの集まり
ヘルプの「シナリオの作成」->「イベントデータ」の「イベント」の項には、「シナリオはイベントの集まりとして作られれています」と書かれています。
つまり、ステージはイベントの集まりだということです。
厳密に言えば作品データ読み込みの指定「@〜」とインクルードの指定「<〜>」だけは例外ですが、それ以外の.eveファイルの記述はすべて、イベントかサブルーチンです。
(前のイベントの中身) Exit If ターン数 < 5 Then 全滅 敵: …(後略)
上の「If〜Then」はどのイベントにも属していません。 イベントに属していないイベントコマンドはけっして実行されず、無意味です。
ヘルプの「Ifコマンド」のページには「コマンドを条件付き実行」と書かれています。 これは、イベントの中でコマンド列を実行するときに条件付き分岐を行うという意味であり、「イベントを条件付き実行する」という意味ではありません。 「Ifコマンド」はイベントラベルの代わりにはならないのです。 イベント実行に追加条件を付けたいときはQ608を参照してください。
(2)イベントはゲーム進行上で起こった情況に応じて発生する
たとえば「進入イベント」はユニットが指定された地点に入ったときに起こるイベントです。 指定された地点に移動させるイベントではありません。 「勝利条件イベント」はマップコマンドメニュー「作戦目的」がクリックされたときに起こるイベントです。 勝利条件を設定するイベントではありません。
ターン 5 味方: 勝利条件: (イベント内容) exit
これは、「“第5ターン味方フェイズ冒頭” と “メニューコマンド『作戦目的』クリック時” の両方で動作するイベント」です。けっして「第5ターン味方フェイズに勝利条件を設定するイベント」ではありません。
(3)イベントラベル・通常ラベルとラベル指定
イベントラベル・通常ラベルはともに、行頭から始まり末尾に「:」が必要です。
ClearEventコマンドやCallコマンドの引数としてラベルを指定するときは、「:」は必要ありません。
慣れないうちは混同されやすいので、ご注意ください。
(4)イベントラベル、イベントコマンド、式、変数、パイロット・ユニットデータはそれぞれ別のもの
# 誤まり例1 UseAbility パイロットA: (イベント?内容) Exit
# 誤まり例2 If ターン 5 > Then ・・・(後略)
# 誤まり例3 気力Lv2 パイロットA: (イベント?内容) Exit
上の誤まり例1はイベントコマンドをイベントラベルに流用してしまったもの、例2はイベントラベルの書式をIfの条件式に流用してしまったもの、例3はイベントラベルとユニットデータなどに記述する必要技能とを混同したものです。
イベントラベル、イベントコマンド、式、変数、パイロット・ユニットデータなどはすべて、それぞれ独自の役割りと独自の書式を持っています。 「変数」が「式」ともみなせることをのぞけば、たがいに流用できるものではありません。
イベントは、ステージの基本的部品で、イベントラベルとイベントコマンドからなっています。
イベントラベルは、イベントの部品の一つで、ゲーム上のできごとに応じてチェックされイベントを発生させます。
イベントコマンドも、イベントの基本的部品で、イベントで行わせたい動作内容を記述するものです。
式は、イベントラベルやイベントコマンドのパラメータです。
変数は、演算子や関数とともに式の部品で、数値や文字列などを保存・参照するものです。
特殊能力や必要技能などのパイロット・ユニットデータは、イベントとはまったく別のものです。 ラベルやコマンドのパラメータ書式で指定していない限り、流用はできません。
イベントラベル・イベントコマンド・式・変数などの理解はSRCのイベントファイル理解の基礎です。 これらがあいまいだと、コマンドリファレンスなどについてしばしば、「ヘルプを読んでも理解できない」ことになります。 ヘルプの「シナリオの作成」->「イベントデータ」「イベントラベル」など該当項目をよく読んで、しっかり把握してください。
このトピックはヘルプ補足/Info関数とのあいだで統合または整理される可能性があります。
質問掲示板などから、過去よくあったミスを列挙します。
info関数の書式:(ヘルプより)
Info([データ区分,]データ,情報種類,…)
ここでは、さまざまな設定例をあげながら、イベントラベルの初歩的な使い方を説明します。
もう少し複雑な例は、
Q608. 発動に追加条件が付いたイベントを設定するには?、
Q613. 複雑な条件分岐を設定する方法は?
などを参照してください。
<パラメータ「全」を使う>
・ 毎ターン味方フェイズ最初に発生するイベント
ターン 全 味方:
・ 第3ターンの全ての陣営フェイズ始めに発生するイベント
ターン 3 全:
これらのように、イベントラベルの「パラメータがどういう場合にも発生させたい」ときには「全」をもちいます。
・ ユニットAが参加する戦闘ならば、どれでも発生するイベント
攻撃 ユニットA 全:
または
攻撃 全 ユニットA:
・ どの戦闘でも発生するイベント
攻撃 全 全:
・ いずれかのユニットがマップ上の地点 (9, 11)に進入したときのイベント
進入 全 9 11:
・ ユニットAのさまざまなアクションで発生するイベント
使用 ユニットA 全:
このイベントは、ユニットAの武器使用、アビリティ、スペシャルパワー、召喚解除、アイテムのアビリティ効果の使用、ユニットコマンドイベントなどのいずれの場合にも発生します。
<陣営名パラメータを使う>
イベントラベルで unit (メインパイロット名やユニット名)と指定されているパラメータには、「陣営名」を使うことができます。
・ 味方ユニットと中立ユニットとの戦闘で発生するイベント
攻撃 味方 中立:
または
攻撃 中立 味方:
・ 敵ユニットのどれかが損傷率 50%以上になったときのイベント
損傷率 敵 50:
これらの場合の“陣営名”指定は、「この陣営に属しているユニットならば、どのユニットであってもイベントを起こす」という意味です。
“陣営名”は、少し違った意味で使われることもあります。ターンイベントと全滅イベントでは、「この陣営についてのイベント」という意味で“陣営名”が指定されます。
・ 第4ターン敵フェイズ最初に発生するイベント
ターン 4 敵:
・ 中立陣営が全滅したときのイベント
全滅 中立:
<イベントラベルを複数並べる>
イベントラベルを複数並べると、そのすべてに対し発生するイベントを作ることができます。
・ 第5ターンと第6ターンの敵フェイズ最初に発生するイベント
ターン 5 敵: ターン 6 敵:
これには別法があります。
・ ユニットAが損傷率 90%以上になるか破壊されたときに発生するイベント
損傷率 ユニットA 90: 破壊 ユニットA:
<If をイベントラベル直後に使う>
イベントラベルのパラメータでは表現しきれない条件をつけて、イベントを発生させたいときもあります。このようなときには、If を使います。
イベントラベル: If (条件式) Then (イベントの内容) EndIf Exit
「If (条件式) Then」は、「この直後の行から「EndIf」の直前行までは(「Else」や「ElseIf」がある場合には、その直前行までは)条件式 が満たされているときだけ実行する」という意味です。
以下は、かんたんな実例です。より詳しい例はQ608. 発動に追加条件が付いたイベントを設定するには?を参照してください。
・ 味方フェイズ冒頭で敵数が 5 未満のときに実行されるイベント
ターン 全 味方: If 敵数 < 5 Then (イベント内容) Endif Exit
・ 第5ターンと第6ターンの敵フェイズ最初に実行されるイベント(別法)
ターン 全 敵: If ターン数 = 5 Or ターン数 = 6 Then (イベント内容) Endif Exit
これは上にあげたイベントの別法です。
<システム変数「対象パイロット」「対象ユニットID」「相手パイロット」「相手ユニットID」などを使う>
しばしば、イベントを引き起こしたユニットのデータを参照したいときがあります。これらのシステム変数はそういうときに使います。
「対象パイロット」「対象ユニットID」にはイベントを引き起こしたユニットのメインパイロット名やユニットIDが入ります。「相手パイロット」「相手ユニットID」には、その相手となったユニットのデータが入ります。
・ 進入ユニットの損傷率が 20%以上のときのみ動作する進入イベント
進入 全 3 6: If Damage(対象ユニットID) >= 20 Then (イベント内容) Endif Exit
・ 特殊能力Aを持ったユニットのメインパイロットがレベルアップしたときのイベント
レベルアップ 全: If IsAvailable(対象パイロット, 特殊能力A) = 1 Then (後略)
・ レベル10以下のパイロットが「恐怖」特殊状態のユニットを攻撃したときのイベント
攻撃 全 全: If Level(対象パイロット) <= 10 And Condition(相手ユニットID, 恐怖) = 1 Then (後略)
攻撃イベントでは、システム変数「対象〜」に戦闘を仕掛けた側のデータが、「相手〜」には仕掛けられた側のが代入されています。逆ではありません。
・ パイロットAの機体が パイロットBに破壊されたとき動作するイベント
破壊 パイロットA: If 相手パイロット = パイロットB Then (イベント内容) EndIf Exit
・ アイテムAを持ったユニットが味方ユニットに破壊されたときのイベント
破壊 全: If IsEquiped(対象ユニットID, アイテムA) = 1 And Party(相手ユニットID) = 味方 Then (後略)
破壊イベントでは、システム変数「対象〜」に代入されるのは破壊されたユニットのデータです。そのユニットを破壊したユニットのデータは「相手〜」に代入されます。
・ 次の例は、まちがいです。
ターン 全 味方: If Level(対象パイロット) <= 10 Then (後略)
ターンイベントはユニットの動作によるイベントではないので、「対象パイロット」には代入されません。
ターンイベントで、特定のパイロットのレベルをチェックしたいのなら、
ターン 全 味方: If Level(パイロットA) <= 10 Then (後略)
味方すべてのレベルをチェックし、10以下なら何かの処理をしたいのなら、
ターン 全 味方: ForEach 味方 If Level(対象パイロット) <= 10 Then (処理内容) EndIf Next Exit
とします。
ここでは、「変数」について、最も基本的なことだけを解説します。
まず、次に示すのは、最も短い「シナリオ」の一つです。
プロローグ: Confirm "1 たす 2 は $(1 + 2)" GameClear
このシナリオは、「1 たす 2 は 3」と表示する、ただそれだけです。(「$(1 + 2)」は、「式 '1 + 2' の結果を文字列にする」といった意味です)
このシナリオの「1」と「2」は、あらかじめ決められた固定した数です。 だから、他の数の和を表示しようとしたら、改めて別のシナリオを作らなければなりません。
これでは不便なので、プレイヤーが入力するどんな数の和でも表示できるように改造します。
プロローグ: Input i 数字を入れてください Input j もう一度、数字を入れてください Confirm "$(i) たす $(j) は $(i + j)" GameClear
この「i」「j」が変数です。「1」や「2」と違うのは、変数には好きな数を入れておくことができる、ということです。
たとえるなら、変数は「i」「j」などのラベルが貼ってある箱のようなものです。 この箱には好きな数や文字列を入れることができ、「i」や「j」と指定することで箱の中に入っている数や文字列を参照することができます。
このとき、「i」や「j」などのラベルを「変数名」、中に入っている数や文字列を「変数の値」と言います。 また、値を箱に入れることを「代入する」と言います。
また、変数には何度も別の値を代入しなおすことができます。 言い換えれば、変数はその数を何度も変えることもできます。
プロローグ: i = 1 j = 2 Confirm "$(i) たす $(j) は $(i + j)" //「1 たす 2 は 3」と表示 i = 3 Confirm "$(i) たす $(j) は $(i + j)" //「3 たす 2 は 5」と表示 i = i + 1 Confirm "$(i) たす $(j) は $(i + j)" //「4 たす 2 は 6」と表示 GameClear
上の例では、変数 i に違った値を代入しながら同じ内容の Confirm コマンドを繰り返していますが、表示は i の中味に応じて違っています。
なお、最後の 'i = i + 1' は、「この時点での i の値に 1 を加えた結果を i の新しい値にする」という意味です。 このように、SRC での表現は一般の数式と違うこともあります。
この項目は、ヘルプの Ifコマンドのページを参照しながらお読みください。
<If を理解する前に――通常のコマンドの動作>
SRCは基本的に、イベントコマンドを上から一行ずつ、順番に処理していきます。
スタート: Input i 数字を入れてください Input j もう一度、数字を入れてください Confirm "合計は、$(i + j)です" Exit
たとえばこのイベントでは、
(1) 「数字をいれてください」と表示してプレイヤーに入力させ、その値を変数 i に入れる
(2) もう一度入力してもらい、その値を変数 j に入れる
(3) 合計を表示する
(4) スタートイベントを終える
という4つの手続きを順番に処理します。
このように、「上から一行ずつ、順番に」というのがイベント処理の基本ですので、まずこのことをしっかり理解してください。
<If は処理の順番を変え特別な処理をする>
けれども、コマンドを順番に処理するだけでは、不便に思うこともあります。 これだけでは、どんな時にも同じ決まりきった処理しかできないからです。
そのためSRCでは、処理の順番を変えるコマンドが用意されています。 ヘルプの シナリオの作成 -> イベントコマンド の 「(8) 実行操作」に分類されるコマンド群で、これらは制御コマンドとも呼ばれます。
If コマンド もその一つで、これは条件に応じて違った処理をさせるコマンドです。
下記は、上のスタートイベントの割り算版です。
スタート: Input i 数字を入れてください Input j もう一度、数字を入れてください If j <> 0 Then Confirm "答えは、$(i / j)です" EndIf Exit
足し算と違って、割り算には「ゼロで割ってはならない」という制限があります。 これを回避するため、プログラムを二つの「流れ」に分けます。
・ jがゼロでないなら、答えを表示する
・ jがゼロなら、何もしないで 'EndIf' の次の行('Exit')に飛ぶ。
<条件式とは?>
'If' に続く 'j <> 0' は条件式と呼ばれます。 'If 条件式 Then' は、条件式が成り立つ場合のみ、'If' の次の行から 'EndIf' か 'Else' か 'ElseIf' までを実行するという動作をします。
条件式が「成り立つ」というのは、厳密に言えば、式の値がゼロ以外ということです。(ただし、条件式が パイロット名 の場合には、そのパイロットが出撃中のときのみ成り立ちます)
'<>' や '=' ,'<', '<=', '>', '>=', 'And', 'Or', 'Like' は、比較演算子と呼ばれ、右辺と左辺の値を比較してあてはまれば式の値は 1、そうでなければ 0 となります。 たとえば、'j <> 0' は j と 0 が違っていれば 1 となり、同じならば 0 となります。
条件式にはたいていの場合、比較演算子を使った式を使います。
<Else 付きの If>
上の割り算イベントは、ゼロで割ろうとしたときメッセージを出すよう改良することもできます。
スタート: Input i 数字を入れてください Input j もう一度、数字を入れてください If j <> 0 Then Confirm "答えは、$(i / j)です" Else Confirm "ゼロで割ることはできません" EndIf Exit
この場合は、二つに分かれた処理の流れは、次のようになります。
・ jがゼロでないなら、答えを表示した後、'Else' から 'EndIf' までを飛ばす。
・ jがゼロなら、'Else'の次の行まで飛んで、メッセージを出す。
言い換えれば、If〜Else〜EndIf では、
・ If行と Else とのあいだの行・・・・条件式成立のとき専用の処理
・ Else と EndIf とのあいだの行・・・条件式不成立のとき専用の処理
となります。
関連項目:
Q411.If コマンドの条件分岐が思ったように働きません。または、条件分岐内のコマンドがまったく実行されません。原因は?
Q613. 複雑な条件分岐を設定する方法は?