*シナリオ作成応用編 [#s470aea3] #contents ---- **Q601. 敵を倒したら強化パーツを手に入れさせるにはどうすれば良いのですか? [#ief81a6a] SRWなどでは、ボスを倒した時に強化パーツが手に入ります。 これをSRCで再現するためには破壊ラベルを使いましょう。 破壊 (破壊されたユニットのパイロット名): (強化パーツを手に入れるイベント) Exit 強化パーツを手に入れるイベントに関して以下に例を挙げます。 Item (強化パーツ名) Talk システム (強化パーツ名)を手に入れた End まとめ~ ・敵を倒したかどうか判別するには…破壊ラベル~ ・強化パーツを手に入れるには…Itemコマンド **Q602. ステージ終了時の残りSPによる経験値ボーナスをやめることはできますか? [#tcbe8496] SRCではステージを終了すると、~ ステージ終了時点のSPx2が経験値ボーナスとして~ 自動で加算されるようになっています。 ただ、毎回経験値が加算されてしまうと、~ レベル調整するのが難しくなってしまうので、~ これをやめたいという場合もあるかと思います。 <経験値加算が行われる条件> ・Continueコマンドを使った時点で ・"出撃"or"格納"状態になっている味方ユニット つまり、Continueコマンドを使う直前に~ Escapeコマンドで味方全体を"待機"状態にしてしまえば~ 経験値が加算されませんし、表示自体も行われなくなります。 Escape 味方 Continue シナリオ02.eve 直後がContinueコマンドになっていますので、~ 味方の全滅イベントが発生する心配はありません。 Destroyコマンドを使うと修理費がかかってしまうので~ 気をつけましょう。 **Q603. 指定座標のビットマップ番号はどうやって調べれば良いですか? [#cfae66f4] ChangeTerrainコマンドではビットマップ番号を指定する必要がありますが、~ Info関数ではビットマップ名しか調べられません。~ (ビットマップ名 = "remains1.bmp"、"base-1.bmp" など) ビットマップ名は必ず"文字列"+"数値"+"."+"拡張子"の順に並んでいますので、~ SRCのイベントコマンドと関数を利用すれば、番号だけの抽出が可能です。 # ビットマップ名取得 # (Info関数を使用してください) mBMP = Info(マップ, X座標, Y座標, ビットマップ名) # 拡張子切捨て # ("文字列" + "ビットマップ番号" にする) mBMP = Mid(mBMP, 1, (Instr(mBMP,".") - 1)) # ビットマップ番号抽出 # (数値 or "-" 以降の部分を抽出する) For i = 1 To Len(mBMP) If Mid(mBMP,i,1) = "-" OR IsNumeric(Mid(mBMP,i,1)) Then mBMP_No = Mid(mBMP,i) Break Endif Next 結果~ ・"mBMP_No"がビットマップ番号になります。("1"とか"-1") **Q604. 全ての味方、敵、または特定グループIDのユニットに対し何かをするには?[#Q604] ~ 「ForEach」コマンドを使います。 # 全ての敵の気力を 10 下げる。 ForEach 敵 IncreaseMorale -10 Next # 全ての味方ユニットに搭乗する全パイロットの SP を回復させる。 ForEach 味方 For i = 1 to CountPilot() RecoverSP Pilot(対象ユニットID,i) 100 Next Next ~ ただし、ForEachループの中に ForEachを入れることはできないので、ご注意ください。 ~ コマンドによっては、陣営名やグループIDをパラメータにすることによってまとめて処理できます。 # 出撃中の全ての味方を脱出させる。 Escape 味方 ~ ただし、この方法はコマンドごとの仕様に依存します。特に慣れないうちはヘルプでしっかり確認してから使うことをおすすめします。 **Q605. ユニットが装備するアイテムを調べ、処理するには?[#Q605] ~ 「CoutItem」関数で装備アイテム数を調べ、「For〜Next」ループや「Do〜Loop」ループを使います。 ~ 以下の例では、メインパイロット名が「パイロットA」のユニットのアイテムの名称を連想配列「Aアイテム」に入力します。 Set Aアイテム For i = 1 To CountItem(パイロットA) Aアイテム[i] = Item(パイロットA, i) Next ~ ループの中でアイテムの番号が変化するかもしれないときは注意が必要です。以下は、パイロットAの持つアイテムのうち装備個所が「武器」であるアイテムを削除します。 For i = CountItem(パイロットA) To 1 Step -1 If Info(アイテム, Item(パイロットA, i), 装備個所) = "武器" Then RemoveItem パイロットA i EndIf Next ~ For〜Next、ForEach〜Next、Do〜Loop は繰り返し構造と呼ばれ、パラメータを変えながら繰り返し順番に実行していきます。しばしば誤解されますが、決して「当てはまる要素に対して一度に実行する」というものではありません。~ したがって、上と同じ目的で以下のようにするのは誤りです。 For i = 1 To CountItem(パイロットA) // まちがい If Info(アイテム, Item(パイロットA, 1), 装備個所) = "武器" Then RemoveItem パイロットA 1 EndIf Next ~ これだと、ループを繰り返すなかで RemoveItem されたときアイテムの番号がずれてしまい、チェックされないアイテムが出てきます。 ~ あえて正順でやりたい場合は、たとえば次のようにします。 Set i Do While i <= CountItem(パイロットA) If Info(アイテム, Item(パイロットA, i), 装備個所) = "武器" Then RemoveItem パイロットA i Else Incr i // 順番がずれないときだけ、i を増やす EndIf Loop **Q606. ユニットがマップの特定領域に入ったときに何かを起こすには?[#Q606] ~ ユニットが特定領域に存在するとき処理したい場合は、[[Q.607>#Q607]]を参照してください。 ~ 「特定領域」がたった一つの座標の場合は、単純に「進入イベント」を使います。~ # 味方ユニットが X = 5、Y = 7 に入ったときにイベントを起こす 進入 味方 5 7: (イベント内容) Exit ~ 座標が複数あるときは、「進入イベント」を並べます。 進入 味方 5 7: 進入 味方 4 7: 進入 味方 5 8: (イベント内容) Exit ~ 座標がもっと多い場合などには、「進入イベント」内部で座標を判別させます。~ 以下は「特定領域」の X座標が 5 以下、Y座標が 4 以上 8 未満の場合にイベントを起こします。 進入 味方 全 全: If X() <= 5 And Y() >= 4 And Y() < 8 Then (イベント内容) EndIf Exit ~ 「特定領域」が特定の地形の場合には、以下のようになります。 進入 味方 地形名称: (イベント内容) Exit ~ これを応用して、terrain.txt にイベント用の地形を記述してマップ上に配置するという手段もあります。 **Q607. ユニットがマップの特定領域に存在するときに何かを起こすには?[#Q607] ~ (この項は、[[Q606.ユニットがマップの特定領域に入ったときに何かを起こしたいときには?>#Q606]]と共通事項が多いので、そちらも参照してください)。 ~ これには、X 関数と Y 関数を使ってユニットの表示位置を出し、それを判別します。~ 以下は、味方ターン冒頭に X座標が 5 以下、Y座標が 4 以上 8 未満のユニットの HP を回復させます。 ターン 全 味方: ForEach 味方 出撃 If X() <= 5 And Y() >= 4 And Y() < 8 Then RecoverHP 対象パイロット HP回復率 EndIf Next Exit **Q608. 発動に追加条件が付いたイベントを設定するには?[#Q608] ~ ここでは、~ 「敵を破壊したとき、敵数が5体以下のときだけイベントを起こしたい」~ 「敵全滅のとき、ボス登場済みかどうかで動作を変えたい」~ など、イベントラベルで表される条件以外の追加条件をイベントに付加する方法を説明します。 ~ 最もよく使うのは ''「If」コマンド を使う方法''です。 # 敵ユニットが5体以下になったときに何かを起こすには、 破壊 敵: If 敵数 <= 5 Then (動作内容) EndIf Exit # と記述します。 # パイロットAが出撃中かどうかを追加条件にする場合は、 (イベントラベル): If パイロットA Then (動作内容) EndIf Exit # となります。「パイロットA」はパイロットの名称または愛称です。 # (ザコ)または(汎用)でパイロットを特定できない場合、 # 予想外の動作になることがあります。 # 第3ターン以降毎ターンの味方イベントに何かを起こします。 ターン 全 味方: If ターン数 >= 3 Then (動作内容) EndIf Exit # 敵全滅時、まだボスが登場していなかったらボスを登場させ、 # すでに登場していたら別 のできごとを起こしたいときには、 # 次のようになります。 全滅 敵: If ボス登場 = 0 Then (ボス登場動作内容) Set ボス登場 Else (それ以外の時の動作内容) EndIf Exit # ターンによって勝利条件表示を変える例です。 勝利条件: If ターン数 < 5 Then Talk (4ターンまでの勝利条件表示) End Else Talk (5ターン以降の勝利条件表示) End EndIf Exit ~ If コマンドを使うとき注意すべきは、「If の効果は EndIf を使うまでは有効だ」ということです。EndIf の書き忘れは非常によくあるミスなので、ご注意ください。このミスを減らすためにも「If」「ElseIf」「Else」「EndIf」のあいだの行は字下げすることを強くおすすめします。 ~ パラメータの値によっていろいろなできごとを起こしたいときには、''「Switch」''が便利です。 # 次の例は、敵全滅のたびに違ったできごとを起こします。 全滅 敵: Incr 全滅回数 Switch 全滅回数 Case 1 (全滅1回目で発生する動作) Case 2 (全滅2回目で発生する動作) …(中略) EndSw Exit # 以下は、ユニットAが破壊されたとき、撃墜したパイロット # ごとに違ったできごとを起こします。 破壊 ユニットA: Switch 相手パイロット Case パイロットA (パイロットAが撃墜したときの動作) Case パイロットB (パイロットBが撃墜したときの動作) …(中略) Case Else (それら以外のパイロットが撃墜したときの動作) EndSw Exit ''関連項目:''~ [[Q609.あるできごとが起こってから数ターン後にイベントを起動させるには?>#Q609]]~ [[Q610.敵と中立の両方が全滅したときにイベントを起こすには?>#Q610]] //[[Q613.複雑な条件分岐を設定する方法は?>#Q613]] **Q609. あるできごとが起こってから数ターン後にイベントを起動させるには?[#Q609] ~ これには、ターン判別用の変数を用意しておいて判定します。 ~ 以下は、ユニットAが破壊された5ターン後にイベントを起こす二つの方法です。 <方法1> # まず、ステージの最初に、 # ユニットA破壊まで条件が満たされないよう # 変数「イベント起動時」をセットします。 # 変数未定義でも条件が満たされない場合、この部分は省略可能です # (実はこの例もそうです)。 スタート: Set イベント起動時間 -1 Exit # ユニットA破壊時、イベント起動予定ターンをセットします。 破壊 ユニットA: イベント起動時間 = ターン数 + 5 Exit # そして、ターンイベントで判別します。 ターン イベント起動時間 味方: (イベント内容) Exit <方法2> # ステージの最初に ClearEvent を使い # ターンイベントが起こらないようにします。 スタート: ClearEvent "ターン イベント起動時間 味方" Exit # ユニットA破壊時、変数をセットし、 # RestoreEvent でターンイベントを復活させます。 破壊 ユニットA: イベント起動時間 = ターン数 + 5 RestoreEvent "ターン イベント起動時間 味方" Exit ターン イベント起動時間 味方: (イベント内容) Exit ''関連項目:''~ [[Q608.発動に追加条件が付いたイベントを設定するには?>#Q608]] **Q610. 敵と中立の両方が全滅したときにイベントを起こすには?[#Q610] ~ 「敵と中立の両方が全滅したときにイベントを起こす」ということは、「敵全滅時、もし中立が全滅していればイベントを起こし、中立全滅時、もし敵が全滅していれば同じイベントを起こす」と同じことです。したがって、「全滅 敵」と「全滅 中立」の二つのイベントを作り、もう一方がすでに全滅していることを追加条件にすればよいわけです。 全滅 敵: If 中立全滅 = 1 Then Call 双方全滅イベント EndIf Set 敵全滅 Exit 全滅 中立: If 敵全滅 = 1 Then Call 双方全滅イベント EndIf Set 中立全滅 Exit # 「Set 〜」は「If〜EndIf」内の「Else」節に入れても可です。 双方全滅イベント: (イベント内容) Return ~ フラグ「敵全滅」「中立全滅」を Set して判別するかわりに、システム変数「敵数」「中立数」がゼロかどうかで判別する方法もあります。 ~ 同じことをもっと短く書くこともできます。 全滅 敵: 全滅 中立: If 敵数 + 中立数 = 0 Then (イベント内容) EndIf Exit ''関連項目:''~ [[Q608.発動に追加条件が付いたイベントを設定するには?>#Q608]] **Q611. 攻撃イベントや攻撃後イベントで味方の仕掛けた戦闘と敵が仕掛けた戦闘を判別するには?[#Q611] ~ よく使われる方法は二つあります。 ~ <方法1>~ 以下のように、イベントを二つ作成する方法です。 攻撃 ユニットA ユニットB: (AからBへの攻撃イベント内容) Exit 攻撃 ユニットB ユニットA: (BからAへの攻撃イベント内容) Exit ~ <方法2>~ システム変数「対象ユニットID」などを Party関数に入れ、陣営を判別します。攻撃イベントでは、「対象パイロット」「対象ユニットID」に攻撃を仕掛けた側のデータが、「相手パイロット」「相手ユニットID」に攻撃を仕掛けられた側のデータが入ります。 攻撃 味方 敵: If Party(対象ユニットID) = 味方 Then (味方から敵への攻撃イベント内容) Else (敵から味方への攻撃イベント内容) EndIf Exit