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