*シナリオ作成応用編 [#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]
 **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]
 **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