点線上の文字の羅列 RPGツクールVX講座 2.気に食わない機能を改造してしまおう 2-2.イベントの発生条件

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

RPGツクールVX講座 2.気に食わない機能を改造してしまおう 2-2.イベントの発生条件

やる気が出ないのでしばらくはスクリプトの開発を休止しようかなぁとか思ってます。
とは言っても、特に開発しなくちゃいけないようなスクリプトも無いのでいいんですけどね。

そういえばお仕事の話を二つほど前の記事でしましたが、依頼主様の都合上、しばらく完成品をお渡しすることが困難とこちらで判断しています。っつーか個人的にメールでのやり取りの方が割と気楽なんだけど。ええ、手をつけてなかったっていう記事書いた翌日二時間程で出来上がったんですけどね。

まあそんなこんなでこの講座になっちゃいますのでね。


イベントの発生条件って、デフォルトでは「スイッチ、変数、セルフスイッチ、アイテム、アクター」の5つしか条件が使えないじゃないですか。これ、割と少ないとか思っちゃうんですよね。
いやまあ、自動実行のイベントなら一ページ目に並列処理を入れてイベントコマンドの条件分岐を使えばいいし、それ以外だったら普通にイベント内で条件分岐すればいいので問題は無いんですけど、「どうしてもこのイベントの発生条件で何とかしたい!」とかいう時、たまにあるじゃないですか。極稀にね。

で、今回はそういう方向けの講座になります。

①基礎改造
まず普通に考えてソフトウェアの改造はできませんから、スクリプトでどうにかしてしまうことを考えましょう。
Game_Eventの中にこんな文があるでしょう。
#--------------------------------------------------------------------------
# ● イベントページの条件合致判定
#--------------------------------------------------------------------------
def conditions_met?(page)
c = page.condition
if c.switch1_valid # スイッチ 1
return false if $game_switches[c.switch1_id] == false
end
if c.switch2_valid # スイッチ 2
return false if $game_switches[c.switch2_id] == false
end
if c.variable_valid # 変数
return false if $game_variables[c.variable_id] < c.variable_value
end
if c.self_switch_valid # セルフスイッチ
key = [@map_id, @event.id, c.self_switch_ch]
return false if $game_self_switches[key] != true
end
if c.item_valid # アイテム
item = $data_items[c.item_id]
return false if $game_party.item_number(item) == 0
end
if c.actor_valid # アクター
actor = $game_actors[c.actor_id]
return false unless $game_party.members.include?(actor)
end
return true # 条件合致
end

見たまんま、これが今回の犠牲者ですね。まーよく分かんなさそうなのでちょっと解説。
if c.○○_valid # ×× って書いてますよね。見たまんまこれが「発生条件」ですよね。
でまあ、その下にreturn false if ~ とか書いてますよね。falseを返す = 発生しなくなる ってことなんでまあさらっと流してください。

で、ここをどうやって改造するか、ですよね。
そこで少し考えるわけです。「スイッチ 2」って、単体ではほぼ使いませんよね。
スイッチ 1とスイッチ 2の二つ、またはスイッチ 1の一つの発生条件しか、ほぼ使いませんよね。いや、「俺はスイッチ 2だけを律儀に使ってるぜ!」っていう奇特な方は除きますが。
ですので、この辺を改造しましょう。
if c.switch2_valid # スイッチ 2
if c.switch1_valid # スイッチ 1が有効なら
return false if $game_switches[c.switch2_id] == false
else # 有効でないなら
return false # 強制的に「発生しない」
end

end

こんな感じにしてみましょう。まあ見れば何やってるかはわかりますが、スイッチ 1の状態によってスイッチ 2の有効状態を変えています。これをベースとして、適当に改造しましょう。
あ、念のため言っておきますけど、この改造の場合「スイッチと追加した条件を同時に起動することはできない」ってのを理解しておいてくださいね。

②武器・防具を条件に加える
武器・防具を取得したいけど、どうすればいいかなー。そうだアイテムを使おう。
ってことで改造してみた。
if c.switch2_valid # スイッチ 2
if c.switch1_valid # スイッチ 1が有効なら
return false if $game_switches[c.switch2_id] == false # 通常
else # 有効でないなら
if c.item_valid # アイテムが有効なら
case c.switch2_id
when 1 # スイッチ 2のIDが1なら
item = $data_weapons[c.item_id] # 武器を返す
when 2 # スイッチ 2のIDが2なら
item = $data_armors[c.item_id] # 防具を返す
else # それ以外は
item = $data_items[c.item_id] # アイテムを返す
end
return false if $game_party.item_number(item) == 0
else # それ以外は

return false # 強制的に「発生しない」
end
end
end

どうでしょう。でも、これだとアイテムの数より武器・防具の数が多いときは使えませんよね。
そこで、変数の条件が有効ならIDを変数から取得するようにします。
if c.item_valid # アイテムが有効なら
id = c.variable_valid ? $game_variables[c.variable_id] : c.item_id
case c.switch2_id
when 1 # スイッチ 2のIDが1なら
item = $data_weapons[id] # 武器を返す
when 2 # スイッチ 2のIDが2なら
item = $data_armors[id] # 防具を返す
else # それ以外は
item = $data_items[id] # アイテムを返す
end
return false if $game_party.item_number(item) == 0
else # それ以外は
return false # 強制的に「発生しない」
end

こんな感じでどうでしょう。id = c.variable_valid ? $game_variables[c.variable_id] : c.item_idという一文がありますが、これは一種の条件分岐みたいなものです。「a ? b : c」の形で使われ、「aならb、それ以外はcを返す」という意味です。要するに
if a
 b
else
 c
end

と同じってことです。

③変数の条件を増やす
①の状態に戻します。
変数の条件は「以上」しか使えませんが、これを増やして色々使えるようにします。
if c.switch2_valid # スイッチ 2
if c.switch1_valid # スイッチ 1が有効なら
return false if $game_switches[c.switch2_id] == false # 通常
else # 有効でないなら
if c.variable_valid # 変数が有効なら
case c.switch2_id
when 1 # スイッチ 2のIDが1なら「同値」
return false if $game_variables[c.variable_id] != c.variable_value
when 2 # スイッチ 2のIDが2なら「以下」
return false if $game_variables[c.variable_id] > c.variable_value
when 3 # スイッチ 2のIDが3なら「以外」
return false if $game_variables[c.variable_id] == c.variable_value
else # それ以外は「以上」
return false if $game_variables[c.variable_id] < c.variable_value
end
else # それ以外は

return false # 強制的に「発生しない」
end
end
end

まあ超とか未満とかは値を調整して使えばいいので、これだけでもいいんじゃないですかね。
割と見ればすぐ判りそうな気がするんで、解説は別に要らないですよね()

④自分で好き勝手に入れる
条件分岐の「スクリプト」ってかなり便利ですよね。なのでアレみたいにできれば一番楽だと思います……が。
まあそんな上手くいくわけがないので、この様にスクリプト内に直接書いてしまいます。
if c.switch2_valid # スイッチ 2
if c.switch1_valid # スイッチ 1が有効なら
return false if $game_switches[c.switch2_id] == false # 通常
else # 有効でないなら
case c.switch2_id
when 1 # スイッチ 2のIDが1ならイベントと重なっているか
return false if !$game_player.pos?(self.x, self.y)
else # それ以外は

return false # 強制的に「発生しない」
end
end
end

この「直接書く」の利点は「Game_Eventのメソッドを使える」ことですが、逆に「Game_Interpreter」の中身は使えないので注意が必要です。

今回のまとめスクリプトはこちら
色々機能を詰め込んだのでこれを参考に改造してみてください。
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

faida

Author:faida
VX/VXAceスクリプト担当。デレステP。担当の限定は逃す派。創作ブログの名の下に、デレマスSS書こうかな。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
投票
ついったー
検索フォーム
メールフォーム

名前:
メール:
件名:
本文:

RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。