検索
AND検索
OR検索
トップ
|
リロード
|
新規
|
一覧
|
単語検索
|
最終更新
|
PukiWikiヘルプ
シナリオ作成応用編 をテンプレートにして作成
メニュー
(edit)
トップページ
SRC Wikiについて
書き込む際の注意
簡単な書き方
練習砂場
↑
よくある質問集
SRCをプレイするには
導入直後のエラー
ダウンロード関連
シナリオ作成基礎編
その他よくある質問
よくあるエラーメッセージ
↑
シナリオ作成応用編
↑
ヘルプファイル補足
↑
参考リンク(外部)
Windows FAQ
とほほのWWW入門
↑
PukiWiki関連
PukiWikiヘルプ
整形ルール
はじめてのPukiWiki
PukiWikiについて
Total:0/Today:0
開始行:
*シナリオ作成応用編 [#s470aea3]
#contents
----
**Q601. 敵を倒したら強化パーツを手に入れさせるにはど...
SRWなどでは、ボスを倒した時に強化パーツが手に入りま...
これをSRCで再現するためには破壊ラベルを使いましょう。
破壊 (破壊されたユニットのパイロット名):
(強化パーツを手に入れるイベント)
Exit
強化パーツを手に入れるイベントに関して以下に例を挙げま...
Item (強化パーツ名)
Talk システム
(強化パーツ名)を手に入れた
End
まとめ
・敵を倒したかどうか判別するには…破壊ラベル
・強化パーツを手に入れるには…Itemコマンド
**Q602. ステージ終了時の残りSPによる経験値ボーナス...
SRCではステージを終了すると、
ステージ終了時点のSPx2が経験値ボーナスとして
自動で加算されるようになっています。
ただ、毎回経験値が加算されてしまうと、
レベル調整するのが難しくなってしまうので、
これをやめたいという場合もあるかと思います。
<経験値加算が行われる条件>
・Continueコマンドを使った時点で
・"出撃"or"格納"状態になっている味方ユニット
つまり、Continueコマンドを使う直前に
Escapeコマンドで味方全体を"待機"状態にしてしまえば
経験値が加算されませんし、表示自体も行われなくなります。
Escape 味方
Continue シナリオ02.eve
直後がContinueコマンドになっていますので、
味方の全滅イベントが発生する心配はありません。
Destroyコマンドを使うと修理費がかかってしまうので
気をつけましょう。
''関連項目:''
[[Q612. 戦闘時の獲得経験値をすべてゼロにする方法は?...
**Q603. 指定座標のビットマップ番号はどうやって調べれ...
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のユニ...
「ForEach」コマンドを使います。
# 全ての敵の気力を 10 下げる。
ForEach 敵
IncreaseMorale -10
Next
# 全ての味方ユニットに搭乗する全パイロットの SP を回復さ...
ForEach 味方
For i = 1 to CountPilot()
RecoverSP PilotID(対象ユニットID,i) 100
Next
Next
# 同じ名前のパイロットが複数いないならば、
# PilotID()関数のかわりに Pilot()関数でもかまいません。
ただし、ForEachループの中に ForEachを入れることはできな...
次は、特定グループに対しまとめて何かをする例です。
# グループID「防衛隊」の全出撃ユニットの思考ルーチン動...
ForEach 防衛隊
ChangeMode 待機
Next
処理内容がやや複雑な例です。&aname(Q604ActionRec);
# すべての行動済み味方ユニットを行動可能状態に戻すサブル...
全味方行動可能:
ForEach 味方
If Action() = 0 Then //この「Action() = 0」は、"残り行...
// 0 か"をチェックする条件式です
Action() = 1 //この「Action() = 1」は、"残り行...
//という意味で、「Action()」は関...
EndIf
Next
Redraw // ユニットアイコンの網掛けをはずす
Return
# このサブルーチンは、2回行動には対応していません
#br
#hr
コマンドによっては、陣営名やグループIDをパラメータに...
# 出撃中の全ての味方を脱出させる。
Escape 味方
ただし、この方法はコマンドごとの仕様に依存します。 特に...
**Q605. ユニットが装備する全アイテムを調べ、処理する...
「CountItem」関数で装備アイテム数を調べ、「For〜Next」...
以下の例では、メインパイロット名が「パイロットA」のユ...
Set Aアイテム
For i = 1 To CountItem(パイロットA)
Aアイテム[i] = Item(パイロットA, i)
Next
ループの実行中にアイテムの番号が変化するかもしれないと...
For i = CountItem(パイロットA) To 1 Step -1
If Info(アイテム, Item(パイロットA, i), 装備個所) = "...
RemoveItem パイロットA i
EndIf
Next
For〜Next、ForEach〜Next、Do〜Loop は繰り返し構造と呼ば...
したがって、上と同じ目的で以下のようにするのは誤りです。
For i = 1 To CountItem(パイロットA) // まちがい
If Info(アイテム, Item(パイロットA, 1), 装備個所) = "...
RemoveItem パイロットA 1
EndIf
Next
これだと、ループを繰り返すなかで RemoveItem されたとき...
あえて正順でやりたい場合は、たとえば次のようにします。
Set i
Do While i <= CountItem(パイロットA)
If Info(アイテム, Item(パイロットA, i), 装備個所) = "...
RemoveItem パイロットA i
Else
Incr i // 順番がずれないときだけ、i ...
EndIf
Loop
**Q606. ユニットがマップの特定領域に入ったときに何か...
ユニットが特定領域に存在するとき処理したい場合は、[[Q...
「特定領域」がたった一つの座標の場合は、単純に「進入イ...
# 味方ユニットが X = 5、Y = 7 に入ったときにイベントを起...
進入 味方 5 7:
(イベント内容)
Exit
#br
座標が複数あるときは、「進入イベントラベル」を並べます。
# これらのイベントは合わせて1回しか起こらない。
進入 味方 5 7:
進入 味方 4 7:
進入 味方 5 8:
(イベント内容)
ClearEvent "進入 味方 5 7"
ClearEvent "進入 味方 4 7"
ClearEvent "進入 味方 5 8"
Exit
ClearEventコマンドのパラメータを省略すると、イベント内...
座標がもっと多い場合などには、「進入イベント」内部で座...
以下は「特定領域」の X座標が 5 以下、Y座標が 4 以上 8 ...
進入 味方 全 全:
If X() <= 5 And Y() >= 4 And Y() < 8 Then
(イベント内容)
EndIf
Exit
「特定領域」が特定の地形の場合には、以下のようになりま...
進入 味方 地形名称:
(イベント内容)
Exit
これを応用して、terrain.txt にイベント用の地形を記述し...
#br
**Q607. ユニットがマップの特定領域に存在するときに何...
(この項は、[[Q606.ユニットがマップの特定領域に入...
これには、X 関数と Y 関数を使ってユニットの表示位置を出...
以下は、味方ターン冒頭に X座標が 5 以下、Y座標が 4 以上...
ターン 全 味方:
ForEach 味方 出撃
If X() <= 5 And Y() >= 4 And Y() < 8 Then
RecoverHP 対象パイロット HP回復率
EndIf
Next
Exit
**Q608. 発動に追加条件が付いたイベントを設定するには...
ここでは、
「敵を破壊したとき、敵数が5体以下のときだけイベントを実...
「敵ユニットが特定パイロットに破壊されたときだけ、何かを...
など、イベントラベルで表される条件以外の追加条件をイベン...
一般には ''「If」コマンド を使います''。
# 敵ユニットが5体以下になったときに何かを起こす
破壊 敵:
If 敵数 <= 5 Then
(動作内容)
EndIf
Exit
# パイロットAが出撃中かどうかを追加条件にする場合は、
(イベントラベル):
If パイロットA Then
(動作内容)
EndIf
Exit
# となります。「パイロットA」はパイロットの名称または愛...
# (ザコ)または(汎用)でパイロットを特定できない場合、
# 予想外の動作になることがあります。
# 第3ターン以降毎ターンの味方フェイズに何かを起こします。
ターン 全 味方:
If ターン数 >= 3 Then
(動作内容)
EndIf
Exit
# ユニットAが武器「豆腐の角」で倒されたときのイベントで...
破壊 ユニットA:
If 相手ユニット使用武器 = 豆腐の角 Then
(動作内容)
EndIf
Exit
# 味方ユニットが属性「音」の武器を使った後、何かを起こし...
使用後 味方 対象ユニット使用武器:
If Info(ユニット, 対象ユニット, 武器, 対象ユニット使用...
(動作内容)
EndIf
Exit
# イベントラベルの最後のパラメータが「全」だとアビリティ...
# にも反応してしまうので、システム変数「対象ユニット使用...
#br
If コマンドを使うとき注意すべきは、「If の効果は EndIf ...
初心者向け注意:イベント冒頭の「If」はしばしば誤解され...
とりわけ、ClearEvent の置き場所はしばしばまちがえられま...
# 以下は、パイロットAが敵を破壊した場合に1回だけ起こる...
破壊 敵:
If 相手パイロット = パイロットA Then
(動作内容)
ClearEvent
EndIf
Exit
# そのつもりで以下のようにするのはまちがいです。これだと、
# ステージ最初に敵が破壊されたとき、破壊したのが誰であろう
# と ClearEvent されてしまいます
破壊 敵:
If 相手パイロット = パイロットA Then
(動作内容)
EndIf
ClearEvent
Exit
#br
追加条件を変化させたり判定させたりするタイミングが別の...
''関連項目:''
[[Q608.1. イベント内で条件に応じ違ったことをさせる...
[[Q609.あるできごとが起こってから数ターン後にイベン...
[[Q610.敵と中立の両方が全滅したときにイベントを起こ...
[[Q613.複雑な条件分岐を設定する方法は?>#Q613]]
**Q608.1. イベント内で条件に応じ違ったことをさせる...
「敵全滅のとき、ボス登場済みかどうかで動作を変えたい」
「ターンによって勝利条件表示を変えたい」
など、条件によってイベント内容を変えるやり方です。
最もよく使うのは ''「If」コマンド を使う方法''です。
# 敵全滅時、まだボスが登場していなかったらボスを登場させ、
# すでに登場していたら別 のできごとを起こしたいときには、
# 次のようになります。
全滅 敵:
If ボス登場 = 0 Then
(ボス登場動作内容)
Set ボス登場
Else
(それ以外の時の動作内容)
EndIf
Exit
# ターンによって勝利条件表示を変える例です。
勝利条件:
If ターン数 < 5 Then
Talk
(4ターンまでの勝利条件表示)
End
Else
Talk
(5ターン以降の勝利条件表示)
End
EndIf
Exit
# 敵を倒したとき、撃墜数に応じたイベントを実行します
# スタートイベントなどで前もって変数「撃墜数」を作ってお...
スタート:
Set 撃墜数 0
Exit
破壊 敵:
Incr 撃墜数
If 撃墜数 >= 20 Then
(撃墜数20以上のときの動作)
ElseIf 撃墜数 >= 10 Then
(撃墜数10以上20未満のときの動作)
Else
(それ以外のときの動作)
EndIf
Exit
# サポートアタックがパイロットAにより行われたとき、
# それ以外のパイロットによるとき、サポートアタックが行わ...
# ときそれぞれに、違った動作をさせます
使用後 全 対象ユニット使用武器:
If Pilot(サポートアタックユニットID) = "" Then
(サポートアタック不成立時の動作)
ElseIf Pilot(サポートアタックユニットID) = パイロッ...
(パイロットAが行ったときの動作)
Else
(パイロットA以外がサポートアタックしたときの動作)
EndIf
Exit
// # Vir.2.2.27 の時点で、システム変数「サポートアタック...
// # は攻撃イベント・使用イベントでは有効ではありません。...
// # 使用後イベントでは有効です。
#br
パラメータの値によっていろいろなできごとを起こしたいと...
# 次の例は、敵全滅のたびに違ったできごとを起こします。
スタート:
Set 全滅回数 0
Exit
全滅 敵:
Incr 全滅回数
Switch 全滅回数
Case 1
(全滅1回目で発生する動作)
Case 2
(全滅2回目で発生する動作)
…(中略)
EndSw
Exit
# 以下は、ユニットAが破壊されたとき、撃墜したパイロット
# ごとに違ったできごとを起こします。
破壊 ユニットA:
Switch 相手パイロット
Case パイロットA
(パイロットAが撃墜したときの動作)
Case パイロットB
(パイロットBが撃墜したときの動作)
…(中略)
Case Else
(それら以外のパイロットが撃墜したときの動作)
EndSw
Exit
''関連項目:''
[[Q608.発動に追加条件が付いたイベントを設定するには...
[[Q613.複雑な条件分岐を設定する方法は?>#Q613]]
**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.発動に追加条件が付いたイベントを設定するには...
**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.発動に追加条件が付いたイベントを設定するには...
**Q611. 攻撃イベントや攻撃後イベントで味方の仕掛けた...
よく使われる方法は二つあります。
<方法1>
以下のように、イベントを二つ作成する方法です。
攻撃 ユニットA ユニットB:
(AからBへの攻撃イベント内容)
Exit
攻撃 ユニットB ユニットA:
(BからAへの攻撃イベント内容)
Exit
<方法2>
システム変数「対象ユニットID」などを Party関数に入れ...
攻撃 味方 敵:
If Party(対象ユニットID) = 味方 Then
(味方から敵への攻撃イベント内容)
Else
(敵から味方への攻撃イベント内容)
EndIf
Exit
**Q612. 戦闘時の獲得経験値をすべてゼロにする方法は?...
両方とも、おもに二つの方法があります。
(1) すべての敵ユニットの「修理費」または「経験値」をゼ...
(2) すべての味方メインパイロットにパイロット用特殊能力...
''関連項目:''
[[Q602. ステージ終了時の残りSPによる経験値ボーナス...
**Q613. 複雑な条件分岐を設定する方法は?[#Q613]
''(1)And や Or 、Not を使う''
複数の条件をともに満たしたときに動作させたいのなら And...
# メインパイロットがパイロットPのユニットがアイテムAと...
# 装備しているなら、何かを起こす
If IsEquiped(パイロットP,アイテムA) = 1 And IsEquiped(...
(処理内容)
EndIf
# アイテムAかアイテムBのどちらかを装備しているなら何か...
If IsEquiped(パイロットP,アイテムA) = 1 Or IsEquiped(...
(処理内容)
EndIf
# 相手ユニットがユニットAでもユニットBでもないとき何か...
If Not (相手ユニット = ユニットA Or 相手ユニット = ユニ...
(処理内容)
EndIf
# パイロットAが出場していないとき何かを起こす
If Not パイロットA Then
(処理内容)
EndIf
以下はもっと複雑な例です。
# パイロットAが座標 (2, 3) か座標 (5, 7)にいるなら何か...
If X(パイロットA) = 2 And Y(パイロットA) = 3 Or X(パイ...
(動作内容)
EndIf
こうした場合注意したいのは、演算子の優先順位です。 演算...
優先順位は、その他の演算子、Not、And、Or の順ですので、...
# パイロット「パA」の X座標が 3 か 4 で、Y座標が 1 か...
If (X(パA) = 2 Or X(パA) = 3) And (Y(パA) = 1 Or Y(パ...
(動作内容)
EndIf
# この条件式の括弧を省略すると、Or より And が優先される...
# X(パA) = 2 Or (X(パA) = 3 And Y(パA) = 1) Or Y(パA...
# という意味になってしまいます。
演算子と優先順位の詳細は、ヘルプの&Color(green){「シナ...
''(2)If の入れ子''
「条件1が成立したとき動作1を行い、さらに条件2も成立...
# メインパイロットがパイロットPであるユニットがアイテム...
# 処理Aを起こし、さらにアイテムBも装備しているなら処理...
If IsEquiped(パイロットP,アイテムA) = 1 Then
(処理内容A)
If IsEquiped(パイロットP,アイテムB) = 1 Then
(処理内容B)
EndIf
EndIf
(1)の方法とくらべ、個々の条件式は単純になるけれど行...
&aname(Q613-3);
''(3)フラグを使う''
特定のできごとがすでに起こったかどうかを条件にする場合...
以前のステージのできごとを条件にするには、フラグをグロ...
''(4)判別用変数を使う''
これはフラグの応用で、条件判別のための変数を準備し、こ...
# 味方ユニットの座標(2,3)への進入・ユニットAの破壊・
# 味方ユニットBの母艦格納の3条件のうち二つを満たした後、
# 最初の味方フェイズに何かを起こします
スタート:
Set 判別変数 0
Exit
進入 味方 2 3:
破壊 ユニットA:
収納 ユニットB:
Incr 判別変数
ClearEvent
Exit
ターン 全 味方:
If 判別変数 >= 2 Then
(できごと)
EndIf
Exit
# 以下では、敵ユニットを倒すたびにそのランクに応じた勝利...
# 与え、勝利ポイントが 20 以上でエピローグイベントに移り...
スタート:
Set 勝利P 0
Exit
破壊 敵:
Incr 勝利P Rank(対象ユニットID)
If 勝利P >= 20 Then
Continue 次のイベントファイル名
EndIf
Exit
#br
''(5)Switch を使う''
変数の値によってさまざまに分岐させるには、「Switch」コ...
# ターン数を判別し、第1〜3ターン、第4〜5ターン、それ...
# で別の処理を行います
Switch ターン数
Case 1 2 3
(1〜3ターンの処理)
Case 4 5
(4〜5ターンの処理)
Case Else
(その他のときの処理)
EndSw
#br
''(6)多くの条件の組み合わせで分岐させる''
これはさらに複雑な場合で、多くの条件がたがいにからみあ...
# 三つの条件、条件A・条件B・条件Cがあり、全て不成立・...
# ABが成立…などなどありえる組み合わせすべてで分岐させる
# まず、判別用変数をセットします。
判別変数 = IIf(条件式A, 1, 0) + IIf(条件式B, 2, 0) + I...
# これにより、たとえば条件BCのみが成立するとき「判別変...
# 0 + 2 + 4 = 6 になります。
# あとはこの変数を使って Switch か IF で分岐させればよい...
Switch 判別変数
Case 0
(全て不成立のときの処理)
Case 1
(Aのみ成立のときの処理)
Case 2
(Bのみ成立のときの処理)
Case 3
(AB成立のときの処理)
…(中略)
EndSw
# この例では判別変数を省略して、
Switch (IIf(条件式A, 1, 0) + IIf(条件式B, 2, 0) + IIf(...
…(後略)
# とすることもできます。が、判別変数をきっちり出しておい...
# デバッグ作業や機能拡張・改変がしやすいです。
# 判別変数の値を文字列にする手もあります。
判別変数 = IIf(条件式A, "o", "x") & IIf(条件式B, "o", ...
# この場合、たとえば条件BCだけが成立するとき「判別変数...
# "xoo" になります。
# この方法では、Like 演算子と If を組み合わせることによ...
# 柔軟な判別が可能です。
# たとえば以下は、条件ACが成立、Bはどちらでもよいとき...
If 判別変数 Like "o?o" Then
…
#br
''(7)複数の分岐で処理内容が重複している場合''
サブルーチンを活用します。
# 一つ目の分岐では処理Aと処理B、二つ目では処理Bと処理...
# 三つ目では処理Cと処理Aを、この順番で行います。
If (条件式1) Then
Call 処理A
Call 処理B
ElseIf (条件式2) Then
Call 処理B
Call 処理C
Else
Call 処理C
Call 処理A
EndIf
もちろん同じコマンド群を繰り返して書いてもかまいません...
しばしば、Call サブルーチンの代わりに Goto を使いたくな...
**Q614. パイロットのパラメータをイベントで変更する方...
ここでは、パイロットのパラメータ(格闘・射撃・命中・回...
パラメータそのものを変化させる手段のほか、修正値を与え...
下記のうち特殊能力に関連したものは、さらに多様な調整方...
- &color(green){☆};パイロットデータを複数用意し、ReplaceP...
- Printコマンドでデータを書き換え、Forget・Loadコマンドで...
- sp.txt にてパラメータを変化させるスペシャルパワーを設定...
- sp.txt にてパラメータを変化させるスペシャルパワーを設定...
- ステータス 盲目【命中率・回避率、一斉】、撹乱【命中率】...
- &color(green){☆};パイロット用特殊能力「○○UP」「○○DO...
- パイロット用特殊能力 「超感覚」「知覚強化」「念力」「...
- パイロット用特殊能力「サポート」「○○サポート」を持った...
- パイロット用特殊能力「○○成長」のレベルを調整する。【格...
- &color(green){☆};ユニット用特殊能力 「○○強化」【格闘・...
- LevelUpコマンドでレベルを増減させる。 【全て一斉】
#br
**Q615. ユニットのパラメータをイベントで変更する方法...
ここでは、ユニットのパラメータ(HP・EN・装甲・運動...
下記のうち特殊能力に関連したものは、さらに多様な調整方...
- &color(green){☆};ユニットデータを複数用意し、UpGradeコ...
または、変形系特殊能力でたがいに関連付けられたユニットデ...
- Printコマンドでデータを書き換え、Forget・Loadコマンドで...
- RankUpコマンドでランクを増減させる 【HP・EN・装甲...
- &color(green){☆};パラメータへの修正値を持つかパラメータ...
- sp.txt にてパラメータを変化させるスペシャルパワーを設定...
- sp.txt にてパラメータを変化させるスペシャルパワーを設定...
- &color(green){☆};ステータス 防御力UP・防御力DOWN...
- パイロット用特殊能力 「耐久」【装甲】、「オーラ」(必...
- パイロット用特殊能力 「霊力」「霊力成長」を持たせ、Rec...
- &color(green){☆};ユニット用特殊能力 「○○強化」【HP・...
- ユニット用特殊能力 「アーマー」【装甲】、「追加移動力...
#br
**Q616. パイロット用特殊能力をイベントで付加・強化な...
- パイロットデータを複数用意し、ReplacePilotコマンドで切...
- Printコマンドでデータを書き換え、Forget・Loadコマンドで...
- ユニット用特殊能力「パイロット能力付加」「パイロット能...
- 「パイロット能力付加」「パイロット能力強化」を持つアイ...
- SetSkillコマンドで追加または封印、ClearSkillコマンドで...
- ユニット用特殊能力「パイロット能力付加」「パイロット能...
- ユニット用特殊能力「パイロット能力付加」「パイロット能...
- SetStatusコマンドで特殊状態「'''特殊能力名'''使用不能」...
- アビリティ効果「付加」「強化」を持つアビリティで特殊能...
- 特殊能力を持ったサポートパイロット・サブパイロットを搭...
関連項目:[[ヘルプ補足/パイロットデータ/パイロット用特殊能...
**Q617. ユニット用特殊能力をイベントで付加・強化など...
- ユニットデータを複数用意し、UpGradeコマンドで切り替える。
または、変形系特殊能力でたがいに関連付けられたユニットデ...
- 「ユニットに付加する特殊能力」を持つパイロットデータを...
- Printコマンドでデータを書き換え、Forget・Loadコマンドで...
- Disableコマンドで封印しておき、Enableコマンドで封印解除...
- 特殊能力を持つアイテムを、Equipコマンド、RemoveItemコマ...
- 特殊能力に必要技能か必要条件を付け、条件となる特殊能力...
- 特殊能力を持つアイテムに必要技能を付け、条件となる特殊...
- アビリティ効果「付加」を持つアビリティをUseAbilityコマ...
関連項目:[[ヘルプ補足/ユニットデータ/ユニット用特殊能力>...
**Q618. 命中・回避・クリティカル、反撃オプション、特...
一般的なやり方は、SetMessageコマンドを使う方法です。
# 切り払い時に気力を1増やす
*攻撃 全 全:
SetMessage 相手ユニットID 切り払い $(Call(Sub2))
Exit
Sub1:
IncreaseMorale 相手パイロット 1
Return
ユニットの組み合わせを限定するときには、*攻撃イベントの...
メッセージデータに直接書き込む手段もあります。 こちらは...
どのようなシチュエーションで可能かなど、詳細はヘルプの...
似たようなことは、戦闘アニメデータ・特殊効果データでも...
・ 戦闘アニメは、プレイヤーの選択によりオフされることも...
・ 特殊効果は、戦闘アニメがオンのとき、戦闘アニメと重複...
&br;
なお、使われた反撃オプションの検知は、システム変数「相...
**Q619. さまざまな乱数の生成方法は? [#wd5cd9eb]
''(1) 1以外から始まる乱数''
これは修正値をつければいいだけです。
# 4から9までの乱数
i = Random(6) + 3
# -3から6までの乱数
i = Random(10) - 4
#br
''(2) 「連続的な(稠密な)」値域の乱数''
コンピュータというものの性質上、厳密に連続的な乱数は不...
# 0以上 1未満の実数を返す乱数です。
# シナリオの最初などで、定数を初期化しておきます。実行時...
# この部分は省いて、そのかわり LargeInt を関数本体で逐一...
Global LargeInt
LargeInt = 2 ^ 20
# 関数本体
RealRnd:
Return ((Random(LargeInt) - 1) / LargeInt)
#br
''(3) 山型の確率分布の乱数''
両端よりも中央の確率が大きい乱数です。 単純な乱数よりも...
やり方はいろいろありますが、かんたんなのは複数の乱数の...
i = Random(6) + Random(6)
上の例は、6面サイコロを二つ振ったのと同じです。
i = Random(6) - Random(6)
差の場合も分布の形は和の場合とまったく同じですが、平均...
i = Random(6) + Random(6) + Random(6)
このように3つ以上の乱数を使ってもかまいません。 このほ...
乱数2つのときは二等辺三角形の形の確率分布になりますが...
''(4) 下端または上端が大きい確率分布の乱数''
これもいろいろやり方がありますが、比較的かんたんなやり...
下記の例はいずれも 1から 10までの整数値を返します。
<方法1>
i = Random(Random(10))
この方法は偏りが激しいのが特徴です。 上の例だと、1だけ...
三つ以上乱数を重ねて
i = Random(Random(Random(10)))
とすると偏りはもっと激しくなります。
<方法2>
i = Min(Random(10), Random(10))
方法1とくらべて偏りは小さくなります。 上の例だと、1は1...
三つ以上の乱数の最小値(または最大値)をとってもかまい...
<方法3>
i = Int(RealRnd ^ 2 * 10) + 1
上記''(2)''の RealRnd関数を使う方法です。 累乗のパラ...
''(5) 「カード」のシャッフル(ランダムな順列)''
カードのシャッフルや、あらかじめ決められた複数の役割り...
大量のユニット、アイテムなどなどから重複無しに数個選ぶ...
# 52枚のカードをシャッフルします。
# ここでは連想配列「順番[カードナンバー]」で
# カードの順番を表現します。
# 順番を適当に初期化しておきます。
# 2回目以降のシャッフルでは、初期化は不要です。
Set 枚数 52
Set 順番
For i = 1 To 枚数
順番[i] = i
Next
# シャッフル
For i = 枚数 To 2 Step -1
Swap 順番[i] 順番[Random(枚数)]
Next
まず最初のループで、52枚目のカードをランダムに選ばれた...
次のループで、51枚目のカードと入れ替える相手を、「確定...
以下、数を減らしながらこれを繰り返します。
**Q620.マス目座標とピクセル座標との変換 [#wf46456a]
SRC では、おもに二種類の座標系が使われています。
一つは、ユニットのマップ上の位置特定などに使われ、マッ...
もう一つは、グラフィックなどで使われ、マップウインドウ...
この二つの座標系は、数える単位も、基準位置も違います。
これらの座標を変換するには、WX(), WY()関数を利用します。
# マップ座標 mx, my → ピクセル座標 px, py の変換
# マス目(mx, my) の左上隅の表示上のピクセル位置を求める
px = (mx - 1) * 32 + WX(1)
py = (my - 1) * 32 + WY(1)
# ピクセル座標 px, py → マップ座標 mx, my の変換
# ピクセル位置(px, py)が属しているマス目を求める
mx = Int((px - WX(1)) / 32) + 1
my = Int((py - WY(1)) / 32) + 1
# (この式は (px, py) がマップ外なら、
# マップ座標を上下左右に拡張した値を返します)
# (px, py) が必ずマップ内ならば、下の式でもかまいません。
# しかし、マップ外でマップ上方・左方のとき、答えが 1 ず...
mx = (px - WX(1)) \ 32 + 1
my = (py - WY(1)) \ 32 + 1
「Int(変数 / 32)」 と 「変数 ¥ 32」の違いについては、[...
# クリック地点のマップ座標を (ClickX, ClickY) に入れるサ...
# マップ内をクリックした時 1 を返し、マップ外クリック・...
# キーボード押下の場合は 0 を返す。
# (ずっと機能拡張されたコマンドが 2008/04/08、リクエス...
# にてリクエスト中です)
ClickPoint:
Wait Click
If KeyState(1) Then
ClickX = Int((MouseX - WX(1)) / 32) + 1
ClickY = Int((MouseY - WY(1)) / 32) + 1
If ClickX > 0 And ClickX <= Info(マップ, 幅) And _
ClickY > 0 And ClickY <= Info(マップ, 高さ) Then
Return 1
# Else
# (拡張用:必要ならここにマップ外クリック時の動作)
EndIf
#ElseIf KeyState(2) Then
#(拡張用:必要ならここに右クリック時の動作
# Talk コマンドなどを行う場合、その前に Wait Click が必...
#Else
#(拡張用:必要ならここにキーボード押下時の動作)
EndIf
Return 0
-----
*コメント [#ia8e7067]
#comment_nospam
終了行:
*シナリオ作成応用編 [#s470aea3]
#contents
----
**Q601. 敵を倒したら強化パーツを手に入れさせるにはど...
SRWなどでは、ボスを倒した時に強化パーツが手に入りま...
これをSRCで再現するためには破壊ラベルを使いましょう。
破壊 (破壊されたユニットのパイロット名):
(強化パーツを手に入れるイベント)
Exit
強化パーツを手に入れるイベントに関して以下に例を挙げま...
Item (強化パーツ名)
Talk システム
(強化パーツ名)を手に入れた
End
まとめ
・敵を倒したかどうか判別するには…破壊ラベル
・強化パーツを手に入れるには…Itemコマンド
**Q602. ステージ終了時の残りSPによる経験値ボーナス...
SRCではステージを終了すると、
ステージ終了時点のSPx2が経験値ボーナスとして
自動で加算されるようになっています。
ただ、毎回経験値が加算されてしまうと、
レベル調整するのが難しくなってしまうので、
これをやめたいという場合もあるかと思います。
<経験値加算が行われる条件>
・Continueコマンドを使った時点で
・"出撃"or"格納"状態になっている味方ユニット
つまり、Continueコマンドを使う直前に
Escapeコマンドで味方全体を"待機"状態にしてしまえば
経験値が加算されませんし、表示自体も行われなくなります。
Escape 味方
Continue シナリオ02.eve
直後がContinueコマンドになっていますので、
味方の全滅イベントが発生する心配はありません。
Destroyコマンドを使うと修理費がかかってしまうので
気をつけましょう。
''関連項目:''
[[Q612. 戦闘時の獲得経験値をすべてゼロにする方法は?...
**Q603. 指定座標のビットマップ番号はどうやって調べれ...
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のユニ...
「ForEach」コマンドを使います。
# 全ての敵の気力を 10 下げる。
ForEach 敵
IncreaseMorale -10
Next
# 全ての味方ユニットに搭乗する全パイロットの SP を回復さ...
ForEach 味方
For i = 1 to CountPilot()
RecoverSP PilotID(対象ユニットID,i) 100
Next
Next
# 同じ名前のパイロットが複数いないならば、
# PilotID()関数のかわりに Pilot()関数でもかまいません。
ただし、ForEachループの中に ForEachを入れることはできな...
次は、特定グループに対しまとめて何かをする例です。
# グループID「防衛隊」の全出撃ユニットの思考ルーチン動...
ForEach 防衛隊
ChangeMode 待機
Next
処理内容がやや複雑な例です。&aname(Q604ActionRec);
# すべての行動済み味方ユニットを行動可能状態に戻すサブル...
全味方行動可能:
ForEach 味方
If Action() = 0 Then //この「Action() = 0」は、"残り行...
// 0 か"をチェックする条件式です
Action() = 1 //この「Action() = 1」は、"残り行...
//という意味で、「Action()」は関...
EndIf
Next
Redraw // ユニットアイコンの網掛けをはずす
Return
# このサブルーチンは、2回行動には対応していません
#br
#hr
コマンドによっては、陣営名やグループIDをパラメータに...
# 出撃中の全ての味方を脱出させる。
Escape 味方
ただし、この方法はコマンドごとの仕様に依存します。 特に...
**Q605. ユニットが装備する全アイテムを調べ、処理する...
「CountItem」関数で装備アイテム数を調べ、「For〜Next」...
以下の例では、メインパイロット名が「パイロットA」のユ...
Set Aアイテム
For i = 1 To CountItem(パイロットA)
Aアイテム[i] = Item(パイロットA, i)
Next
ループの実行中にアイテムの番号が変化するかもしれないと...
For i = CountItem(パイロットA) To 1 Step -1
If Info(アイテム, Item(パイロットA, i), 装備個所) = "...
RemoveItem パイロットA i
EndIf
Next
For〜Next、ForEach〜Next、Do〜Loop は繰り返し構造と呼ば...
したがって、上と同じ目的で以下のようにするのは誤りです。
For i = 1 To CountItem(パイロットA) // まちがい
If Info(アイテム, Item(パイロットA, 1), 装備個所) = "...
RemoveItem パイロットA 1
EndIf
Next
これだと、ループを繰り返すなかで RemoveItem されたとき...
あえて正順でやりたい場合は、たとえば次のようにします。
Set i
Do While i <= CountItem(パイロットA)
If Info(アイテム, Item(パイロットA, i), 装備個所) = "...
RemoveItem パイロットA i
Else
Incr i // 順番がずれないときだけ、i ...
EndIf
Loop
**Q606. ユニットがマップの特定領域に入ったときに何か...
ユニットが特定領域に存在するとき処理したい場合は、[[Q...
「特定領域」がたった一つの座標の場合は、単純に「進入イ...
# 味方ユニットが X = 5、Y = 7 に入ったときにイベントを起...
進入 味方 5 7:
(イベント内容)
Exit
#br
座標が複数あるときは、「進入イベントラベル」を並べます。
# これらのイベントは合わせて1回しか起こらない。
進入 味方 5 7:
進入 味方 4 7:
進入 味方 5 8:
(イベント内容)
ClearEvent "進入 味方 5 7"
ClearEvent "進入 味方 4 7"
ClearEvent "進入 味方 5 8"
Exit
ClearEventコマンドのパラメータを省略すると、イベント内...
座標がもっと多い場合などには、「進入イベント」内部で座...
以下は「特定領域」の X座標が 5 以下、Y座標が 4 以上 8 ...
進入 味方 全 全:
If X() <= 5 And Y() >= 4 And Y() < 8 Then
(イベント内容)
EndIf
Exit
「特定領域」が特定の地形の場合には、以下のようになりま...
進入 味方 地形名称:
(イベント内容)
Exit
これを応用して、terrain.txt にイベント用の地形を記述し...
#br
**Q607. ユニットがマップの特定領域に存在するときに何...
(この項は、[[Q606.ユニットがマップの特定領域に入...
これには、X 関数と Y 関数を使ってユニットの表示位置を出...
以下は、味方ターン冒頭に X座標が 5 以下、Y座標が 4 以上...
ターン 全 味方:
ForEach 味方 出撃
If X() <= 5 And Y() >= 4 And Y() < 8 Then
RecoverHP 対象パイロット HP回復率
EndIf
Next
Exit
**Q608. 発動に追加条件が付いたイベントを設定するには...
ここでは、
「敵を破壊したとき、敵数が5体以下のときだけイベントを実...
「敵ユニットが特定パイロットに破壊されたときだけ、何かを...
など、イベントラベルで表される条件以外の追加条件をイベン...
一般には ''「If」コマンド を使います''。
# 敵ユニットが5体以下になったときに何かを起こす
破壊 敵:
If 敵数 <= 5 Then
(動作内容)
EndIf
Exit
# パイロットAが出撃中かどうかを追加条件にする場合は、
(イベントラベル):
If パイロットA Then
(動作内容)
EndIf
Exit
# となります。「パイロットA」はパイロットの名称または愛...
# (ザコ)または(汎用)でパイロットを特定できない場合、
# 予想外の動作になることがあります。
# 第3ターン以降毎ターンの味方フェイズに何かを起こします。
ターン 全 味方:
If ターン数 >= 3 Then
(動作内容)
EndIf
Exit
# ユニットAが武器「豆腐の角」で倒されたときのイベントで...
破壊 ユニットA:
If 相手ユニット使用武器 = 豆腐の角 Then
(動作内容)
EndIf
Exit
# 味方ユニットが属性「音」の武器を使った後、何かを起こし...
使用後 味方 対象ユニット使用武器:
If Info(ユニット, 対象ユニット, 武器, 対象ユニット使用...
(動作内容)
EndIf
Exit
# イベントラベルの最後のパラメータが「全」だとアビリティ...
# にも反応してしまうので、システム変数「対象ユニット使用...
#br
If コマンドを使うとき注意すべきは、「If の効果は EndIf ...
初心者向け注意:イベント冒頭の「If」はしばしば誤解され...
とりわけ、ClearEvent の置き場所はしばしばまちがえられま...
# 以下は、パイロットAが敵を破壊した場合に1回だけ起こる...
破壊 敵:
If 相手パイロット = パイロットA Then
(動作内容)
ClearEvent
EndIf
Exit
# そのつもりで以下のようにするのはまちがいです。これだと、
# ステージ最初に敵が破壊されたとき、破壊したのが誰であろう
# と ClearEvent されてしまいます
破壊 敵:
If 相手パイロット = パイロットA Then
(動作内容)
EndIf
ClearEvent
Exit
#br
追加条件を変化させたり判定させたりするタイミングが別の...
''関連項目:''
[[Q608.1. イベント内で条件に応じ違ったことをさせる...
[[Q609.あるできごとが起こってから数ターン後にイベン...
[[Q610.敵と中立の両方が全滅したときにイベントを起こ...
[[Q613.複雑な条件分岐を設定する方法は?>#Q613]]
**Q608.1. イベント内で条件に応じ違ったことをさせる...
「敵全滅のとき、ボス登場済みかどうかで動作を変えたい」
「ターンによって勝利条件表示を変えたい」
など、条件によってイベント内容を変えるやり方です。
最もよく使うのは ''「If」コマンド を使う方法''です。
# 敵全滅時、まだボスが登場していなかったらボスを登場させ、
# すでに登場していたら別 のできごとを起こしたいときには、
# 次のようになります。
全滅 敵:
If ボス登場 = 0 Then
(ボス登場動作内容)
Set ボス登場
Else
(それ以外の時の動作内容)
EndIf
Exit
# ターンによって勝利条件表示を変える例です。
勝利条件:
If ターン数 < 5 Then
Talk
(4ターンまでの勝利条件表示)
End
Else
Talk
(5ターン以降の勝利条件表示)
End
EndIf
Exit
# 敵を倒したとき、撃墜数に応じたイベントを実行します
# スタートイベントなどで前もって変数「撃墜数」を作ってお...
スタート:
Set 撃墜数 0
Exit
破壊 敵:
Incr 撃墜数
If 撃墜数 >= 20 Then
(撃墜数20以上のときの動作)
ElseIf 撃墜数 >= 10 Then
(撃墜数10以上20未満のときの動作)
Else
(それ以外のときの動作)
EndIf
Exit
# サポートアタックがパイロットAにより行われたとき、
# それ以外のパイロットによるとき、サポートアタックが行わ...
# ときそれぞれに、違った動作をさせます
使用後 全 対象ユニット使用武器:
If Pilot(サポートアタックユニットID) = "" Then
(サポートアタック不成立時の動作)
ElseIf Pilot(サポートアタックユニットID) = パイロッ...
(パイロットAが行ったときの動作)
Else
(パイロットA以外がサポートアタックしたときの動作)
EndIf
Exit
// # Vir.2.2.27 の時点で、システム変数「サポートアタック...
// # は攻撃イベント・使用イベントでは有効ではありません。...
// # 使用後イベントでは有効です。
#br
パラメータの値によっていろいろなできごとを起こしたいと...
# 次の例は、敵全滅のたびに違ったできごとを起こします。
スタート:
Set 全滅回数 0
Exit
全滅 敵:
Incr 全滅回数
Switch 全滅回数
Case 1
(全滅1回目で発生する動作)
Case 2
(全滅2回目で発生する動作)
…(中略)
EndSw
Exit
# 以下は、ユニットAが破壊されたとき、撃墜したパイロット
# ごとに違ったできごとを起こします。
破壊 ユニットA:
Switch 相手パイロット
Case パイロットA
(パイロットAが撃墜したときの動作)
Case パイロットB
(パイロットBが撃墜したときの動作)
…(中略)
Case Else
(それら以外のパイロットが撃墜したときの動作)
EndSw
Exit
''関連項目:''
[[Q608.発動に追加条件が付いたイベントを設定するには...
[[Q613.複雑な条件分岐を設定する方法は?>#Q613]]
**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.発動に追加条件が付いたイベントを設定するには...
**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.発動に追加条件が付いたイベントを設定するには...
**Q611. 攻撃イベントや攻撃後イベントで味方の仕掛けた...
よく使われる方法は二つあります。
<方法1>
以下のように、イベントを二つ作成する方法です。
攻撃 ユニットA ユニットB:
(AからBへの攻撃イベント内容)
Exit
攻撃 ユニットB ユニットA:
(BからAへの攻撃イベント内容)
Exit
<方法2>
システム変数「対象ユニットID」などを Party関数に入れ...
攻撃 味方 敵:
If Party(対象ユニットID) = 味方 Then
(味方から敵への攻撃イベント内容)
Else
(敵から味方への攻撃イベント内容)
EndIf
Exit
**Q612. 戦闘時の獲得経験値をすべてゼロにする方法は?...
両方とも、おもに二つの方法があります。
(1) すべての敵ユニットの「修理費」または「経験値」をゼ...
(2) すべての味方メインパイロットにパイロット用特殊能力...
''関連項目:''
[[Q602. ステージ終了時の残りSPによる経験値ボーナス...
**Q613. 複雑な条件分岐を設定する方法は?[#Q613]
''(1)And や Or 、Not を使う''
複数の条件をともに満たしたときに動作させたいのなら And...
# メインパイロットがパイロットPのユニットがアイテムAと...
# 装備しているなら、何かを起こす
If IsEquiped(パイロットP,アイテムA) = 1 And IsEquiped(...
(処理内容)
EndIf
# アイテムAかアイテムBのどちらかを装備しているなら何か...
If IsEquiped(パイロットP,アイテムA) = 1 Or IsEquiped(...
(処理内容)
EndIf
# 相手ユニットがユニットAでもユニットBでもないとき何か...
If Not (相手ユニット = ユニットA Or 相手ユニット = ユニ...
(処理内容)
EndIf
# パイロットAが出場していないとき何かを起こす
If Not パイロットA Then
(処理内容)
EndIf
以下はもっと複雑な例です。
# パイロットAが座標 (2, 3) か座標 (5, 7)にいるなら何か...
If X(パイロットA) = 2 And Y(パイロットA) = 3 Or X(パイ...
(動作内容)
EndIf
こうした場合注意したいのは、演算子の優先順位です。 演算...
優先順位は、その他の演算子、Not、And、Or の順ですので、...
# パイロット「パA」の X座標が 3 か 4 で、Y座標が 1 か...
If (X(パA) = 2 Or X(パA) = 3) And (Y(パA) = 1 Or Y(パ...
(動作内容)
EndIf
# この条件式の括弧を省略すると、Or より And が優先される...
# X(パA) = 2 Or (X(パA) = 3 And Y(パA) = 1) Or Y(パA...
# という意味になってしまいます。
演算子と優先順位の詳細は、ヘルプの&Color(green){「シナ...
''(2)If の入れ子''
「条件1が成立したとき動作1を行い、さらに条件2も成立...
# メインパイロットがパイロットPであるユニットがアイテム...
# 処理Aを起こし、さらにアイテムBも装備しているなら処理...
If IsEquiped(パイロットP,アイテムA) = 1 Then
(処理内容A)
If IsEquiped(パイロットP,アイテムB) = 1 Then
(処理内容B)
EndIf
EndIf
(1)の方法とくらべ、個々の条件式は単純になるけれど行...
&aname(Q613-3);
''(3)フラグを使う''
特定のできごとがすでに起こったかどうかを条件にする場合...
以前のステージのできごとを条件にするには、フラグをグロ...
''(4)判別用変数を使う''
これはフラグの応用で、条件判別のための変数を準備し、こ...
# 味方ユニットの座標(2,3)への進入・ユニットAの破壊・
# 味方ユニットBの母艦格納の3条件のうち二つを満たした後、
# 最初の味方フェイズに何かを起こします
スタート:
Set 判別変数 0
Exit
進入 味方 2 3:
破壊 ユニットA:
収納 ユニットB:
Incr 判別変数
ClearEvent
Exit
ターン 全 味方:
If 判別変数 >= 2 Then
(できごと)
EndIf
Exit
# 以下では、敵ユニットを倒すたびにそのランクに応じた勝利...
# 与え、勝利ポイントが 20 以上でエピローグイベントに移り...
スタート:
Set 勝利P 0
Exit
破壊 敵:
Incr 勝利P Rank(対象ユニットID)
If 勝利P >= 20 Then
Continue 次のイベントファイル名
EndIf
Exit
#br
''(5)Switch を使う''
変数の値によってさまざまに分岐させるには、「Switch」コ...
# ターン数を判別し、第1〜3ターン、第4〜5ターン、それ...
# で別の処理を行います
Switch ターン数
Case 1 2 3
(1〜3ターンの処理)
Case 4 5
(4〜5ターンの処理)
Case Else
(その他のときの処理)
EndSw
#br
''(6)多くの条件の組み合わせで分岐させる''
これはさらに複雑な場合で、多くの条件がたがいにからみあ...
# 三つの条件、条件A・条件B・条件Cがあり、全て不成立・...
# ABが成立…などなどありえる組み合わせすべてで分岐させる
# まず、判別用変数をセットします。
判別変数 = IIf(条件式A, 1, 0) + IIf(条件式B, 2, 0) + I...
# これにより、たとえば条件BCのみが成立するとき「判別変...
# 0 + 2 + 4 = 6 になります。
# あとはこの変数を使って Switch か IF で分岐させればよい...
Switch 判別変数
Case 0
(全て不成立のときの処理)
Case 1
(Aのみ成立のときの処理)
Case 2
(Bのみ成立のときの処理)
Case 3
(AB成立のときの処理)
…(中略)
EndSw
# この例では判別変数を省略して、
Switch (IIf(条件式A, 1, 0) + IIf(条件式B, 2, 0) + IIf(...
…(後略)
# とすることもできます。が、判別変数をきっちり出しておい...
# デバッグ作業や機能拡張・改変がしやすいです。
# 判別変数の値を文字列にする手もあります。
判別変数 = IIf(条件式A, "o", "x") & IIf(条件式B, "o", ...
# この場合、たとえば条件BCだけが成立するとき「判別変数...
# "xoo" になります。
# この方法では、Like 演算子と If を組み合わせることによ...
# 柔軟な判別が可能です。
# たとえば以下は、条件ACが成立、Bはどちらでもよいとき...
If 判別変数 Like "o?o" Then
…
#br
''(7)複数の分岐で処理内容が重複している場合''
サブルーチンを活用します。
# 一つ目の分岐では処理Aと処理B、二つ目では処理Bと処理...
# 三つ目では処理Cと処理Aを、この順番で行います。
If (条件式1) Then
Call 処理A
Call 処理B
ElseIf (条件式2) Then
Call 処理B
Call 処理C
Else
Call 処理C
Call 処理A
EndIf
もちろん同じコマンド群を繰り返して書いてもかまいません...
しばしば、Call サブルーチンの代わりに Goto を使いたくな...
**Q614. パイロットのパラメータをイベントで変更する方...
ここでは、パイロットのパラメータ(格闘・射撃・命中・回...
パラメータそのものを変化させる手段のほか、修正値を与え...
下記のうち特殊能力に関連したものは、さらに多様な調整方...
- &color(green){☆};パイロットデータを複数用意し、ReplaceP...
- Printコマンドでデータを書き換え、Forget・Loadコマンドで...
- sp.txt にてパラメータを変化させるスペシャルパワーを設定...
- sp.txt にてパラメータを変化させるスペシャルパワーを設定...
- ステータス 盲目【命中率・回避率、一斉】、撹乱【命中率】...
- &color(green){☆};パイロット用特殊能力「○○UP」「○○DO...
- パイロット用特殊能力 「超感覚」「知覚強化」「念力」「...
- パイロット用特殊能力「サポート」「○○サポート」を持った...
- パイロット用特殊能力「○○成長」のレベルを調整する。【格...
- &color(green){☆};ユニット用特殊能力 「○○強化」【格闘・...
- LevelUpコマンドでレベルを増減させる。 【全て一斉】
#br
**Q615. ユニットのパラメータをイベントで変更する方法...
ここでは、ユニットのパラメータ(HP・EN・装甲・運動...
下記のうち特殊能力に関連したものは、さらに多様な調整方...
- &color(green){☆};ユニットデータを複数用意し、UpGradeコ...
または、変形系特殊能力でたがいに関連付けられたユニットデ...
- Printコマンドでデータを書き換え、Forget・Loadコマンドで...
- RankUpコマンドでランクを増減させる 【HP・EN・装甲...
- &color(green){☆};パラメータへの修正値を持つかパラメータ...
- sp.txt にてパラメータを変化させるスペシャルパワーを設定...
- sp.txt にてパラメータを変化させるスペシャルパワーを設定...
- &color(green){☆};ステータス 防御力UP・防御力DOWN...
- パイロット用特殊能力 「耐久」【装甲】、「オーラ」(必...
- パイロット用特殊能力 「霊力」「霊力成長」を持たせ、Rec...
- &color(green){☆};ユニット用特殊能力 「○○強化」【HP・...
- ユニット用特殊能力 「アーマー」【装甲】、「追加移動力...
#br
**Q616. パイロット用特殊能力をイベントで付加・強化な...
- パイロットデータを複数用意し、ReplacePilotコマンドで切...
- Printコマンドでデータを書き換え、Forget・Loadコマンドで...
- ユニット用特殊能力「パイロット能力付加」「パイロット能...
- 「パイロット能力付加」「パイロット能力強化」を持つアイ...
- SetSkillコマンドで追加または封印、ClearSkillコマンドで...
- ユニット用特殊能力「パイロット能力付加」「パイロット能...
- ユニット用特殊能力「パイロット能力付加」「パイロット能...
- SetStatusコマンドで特殊状態「'''特殊能力名'''使用不能」...
- アビリティ効果「付加」「強化」を持つアビリティで特殊能...
- 特殊能力を持ったサポートパイロット・サブパイロットを搭...
関連項目:[[ヘルプ補足/パイロットデータ/パイロット用特殊能...
**Q617. ユニット用特殊能力をイベントで付加・強化など...
- ユニットデータを複数用意し、UpGradeコマンドで切り替える。
または、変形系特殊能力でたがいに関連付けられたユニットデ...
- 「ユニットに付加する特殊能力」を持つパイロットデータを...
- Printコマンドでデータを書き換え、Forget・Loadコマンドで...
- Disableコマンドで封印しておき、Enableコマンドで封印解除...
- 特殊能力を持つアイテムを、Equipコマンド、RemoveItemコマ...
- 特殊能力に必要技能か必要条件を付け、条件となる特殊能力...
- 特殊能力を持つアイテムに必要技能を付け、条件となる特殊...
- アビリティ効果「付加」を持つアビリティをUseAbilityコマ...
関連項目:[[ヘルプ補足/ユニットデータ/ユニット用特殊能力>...
**Q618. 命中・回避・クリティカル、反撃オプション、特...
一般的なやり方は、SetMessageコマンドを使う方法です。
# 切り払い時に気力を1増やす
*攻撃 全 全:
SetMessage 相手ユニットID 切り払い $(Call(Sub2))
Exit
Sub1:
IncreaseMorale 相手パイロット 1
Return
ユニットの組み合わせを限定するときには、*攻撃イベントの...
メッセージデータに直接書き込む手段もあります。 こちらは...
どのようなシチュエーションで可能かなど、詳細はヘルプの...
似たようなことは、戦闘アニメデータ・特殊効果データでも...
・ 戦闘アニメは、プレイヤーの選択によりオフされることも...
・ 特殊効果は、戦闘アニメがオンのとき、戦闘アニメと重複...
&br;
なお、使われた反撃オプションの検知は、システム変数「相...
**Q619. さまざまな乱数の生成方法は? [#wd5cd9eb]
''(1) 1以外から始まる乱数''
これは修正値をつければいいだけです。
# 4から9までの乱数
i = Random(6) + 3
# -3から6までの乱数
i = Random(10) - 4
#br
''(2) 「連続的な(稠密な)」値域の乱数''
コンピュータというものの性質上、厳密に連続的な乱数は不...
# 0以上 1未満の実数を返す乱数です。
# シナリオの最初などで、定数を初期化しておきます。実行時...
# この部分は省いて、そのかわり LargeInt を関数本体で逐一...
Global LargeInt
LargeInt = 2 ^ 20
# 関数本体
RealRnd:
Return ((Random(LargeInt) - 1) / LargeInt)
#br
''(3) 山型の確率分布の乱数''
両端よりも中央の確率が大きい乱数です。 単純な乱数よりも...
やり方はいろいろありますが、かんたんなのは複数の乱数の...
i = Random(6) + Random(6)
上の例は、6面サイコロを二つ振ったのと同じです。
i = Random(6) - Random(6)
差の場合も分布の形は和の場合とまったく同じですが、平均...
i = Random(6) + Random(6) + Random(6)
このように3つ以上の乱数を使ってもかまいません。 このほ...
乱数2つのときは二等辺三角形の形の確率分布になりますが...
''(4) 下端または上端が大きい確率分布の乱数''
これもいろいろやり方がありますが、比較的かんたんなやり...
下記の例はいずれも 1から 10までの整数値を返します。
<方法1>
i = Random(Random(10))
この方法は偏りが激しいのが特徴です。 上の例だと、1だけ...
三つ以上乱数を重ねて
i = Random(Random(Random(10)))
とすると偏りはもっと激しくなります。
<方法2>
i = Min(Random(10), Random(10))
方法1とくらべて偏りは小さくなります。 上の例だと、1は1...
三つ以上の乱数の最小値(または最大値)をとってもかまい...
<方法3>
i = Int(RealRnd ^ 2 * 10) + 1
上記''(2)''の RealRnd関数を使う方法です。 累乗のパラ...
''(5) 「カード」のシャッフル(ランダムな順列)''
カードのシャッフルや、あらかじめ決められた複数の役割り...
大量のユニット、アイテムなどなどから重複無しに数個選ぶ...
# 52枚のカードをシャッフルします。
# ここでは連想配列「順番[カードナンバー]」で
# カードの順番を表現します。
# 順番を適当に初期化しておきます。
# 2回目以降のシャッフルでは、初期化は不要です。
Set 枚数 52
Set 順番
For i = 1 To 枚数
順番[i] = i
Next
# シャッフル
For i = 枚数 To 2 Step -1
Swap 順番[i] 順番[Random(枚数)]
Next
まず最初のループで、52枚目のカードをランダムに選ばれた...
次のループで、51枚目のカードと入れ替える相手を、「確定...
以下、数を減らしながらこれを繰り返します。
**Q620.マス目座標とピクセル座標との変換 [#wf46456a]
SRC では、おもに二種類の座標系が使われています。
一つは、ユニットのマップ上の位置特定などに使われ、マッ...
もう一つは、グラフィックなどで使われ、マップウインドウ...
この二つの座標系は、数える単位も、基準位置も違います。
これらの座標を変換するには、WX(), WY()関数を利用します。
# マップ座標 mx, my → ピクセル座標 px, py の変換
# マス目(mx, my) の左上隅の表示上のピクセル位置を求める
px = (mx - 1) * 32 + WX(1)
py = (my - 1) * 32 + WY(1)
# ピクセル座標 px, py → マップ座標 mx, my の変換
# ピクセル位置(px, py)が属しているマス目を求める
mx = Int((px - WX(1)) / 32) + 1
my = Int((py - WY(1)) / 32) + 1
# (この式は (px, py) がマップ外なら、
# マップ座標を上下左右に拡張した値を返します)
# (px, py) が必ずマップ内ならば、下の式でもかまいません。
# しかし、マップ外でマップ上方・左方のとき、答えが 1 ず...
mx = (px - WX(1)) \ 32 + 1
my = (py - WY(1)) \ 32 + 1
「Int(変数 / 32)」 と 「変数 ¥ 32」の違いについては、[...
# クリック地点のマップ座標を (ClickX, ClickY) に入れるサ...
# マップ内をクリックした時 1 を返し、マップ外クリック・...
# キーボード押下の場合は 0 を返す。
# (ずっと機能拡張されたコマンドが 2008/04/08、リクエス...
# にてリクエスト中です)
ClickPoint:
Wait Click
If KeyState(1) Then
ClickX = Int((MouseX - WX(1)) / 32) + 1
ClickY = Int((MouseY - WY(1)) / 32) + 1
If ClickX > 0 And ClickX <= Info(マップ, 幅) And _
ClickY > 0 And ClickY <= Info(マップ, 高さ) Then
Return 1
# Else
# (拡張用:必要ならここにマップ外クリック時の動作)
EndIf
#ElseIf KeyState(2) Then
#(拡張用:必要ならここに右クリック時の動作
# Talk コマンドなどを行う場合、その前に Wait Click が必...
#Else
#(拡張用:必要ならここにキーボード押下時の動作)
EndIf
Return 0
-----
*コメント [#ia8e7067]
#comment_nospam
ページ名:
最新の15件
2022-10-04
ヘルプ補足/特異資質に関する特殊能力P
2022-09-19
ヘルプ補足/スペシャルパワーに関する特殊能力P
2022-02-20
ヘルプ補足/瀕死時に発動する特殊能力P
2017-05-14
RecentDeleted
2016-06-29
SRCをプレイするには
2012-10-01
導入直後のエラー
その他よくある質問
2012-06-12
ヘルプ補足/移動系特殊能力U
2012-03-16
ヘルプ補足/Info関数
2012-03-08
ヘルプ補足/会話コマンド
2011-12-12
ヘルプ補足/選択肢入力コマンド
2011-12-07
ヘルプ補足/パイロットデータ
2011-10-25
ヘルプ補足/イベント制御コマンド
2011-10-17
ヘルプ補足/ユニットデータ
2011-09-08
ヘルプ補足/リスト処理関数