goo blog サービス終了のお知らせ 

GOREとにゃんこの桃源郷

主観的にCDのレビューやら、日記やら、色々と。
ゴアとかメタルとかロックとか

2010/11/05 いい子 の日

2010-11-05 | RPGツクールMZ,VXace,VX,2000,95,1~5
 また久方振りにRPGツクールVXに着手し始めた。細かい部分を変更したり、少なからずマップを描いてみたり、牛歩ではあるが進んでいるつもりだ。今回、マップ毎にダッシュの可否を設定できるものの、イベントコマンドにダッシュ禁止・許可のコマンドが存在しないことに気付いた。エンカウントの禁止・許可は有るのに、これは不公平というものだぜガイズ!

 ということでスクリプト改変。
▼ ゲームオブジェクト下、Game_Character内、def update_move内(移動時の更新)
distance = 5 * @move_speed # 移動速度から移動距離に変換
distance *= 3 if dash? && !$game_switches[140] # ダッシュ状態ならさらに倍
 移動速度は以前から変えているので今回は無関係。2行目の処理を、「ダッシュキーが押されていて、且つスイッチ140番がOFFの時」に限り「速度3倍でダッシュ移動」という具合に改変した。たった1行にも満たない改変だが、スイッチ一つでダッシュの禁止・許可を切り替えられるは、意外と利便性に富んでいるのではないだろうか。


 マップに通常エンカウントする人間タイプの敵(野盗など)と、街中に配置したイベントでも戦闘させることにした。しかし、複数体出現するランダムエンカウントと違い、敵1人に対してパーティ4人などでは圧勝過ぎて退屈だ。けれども、イベントで1人に話し掛けて複数で襲ってくるのは変だという理由から、対戦人数の変更はしたくない。かといって能力違いの同じ敵データを作ったら、内部的には別の敵としてカウントされてしまう。ということで、その戦闘中に限り敵のデータを直接弄ってしまうことにした。

 バトルイベントもしくは戦闘イベントに入る前だが、後者は試していない。
敵グループ>バトルイベント>条件:ターン数 0>スパン:バトル
イベントコマンドのスクリプトに以下を記述した。
enemy = $data_enemies[89]
$game_variables[81] = enemy.maxhp
$game_variables[82] = enemy.maxmp
$game_variables[83] = enemy.atk
$game_variables[84] = enemy.def
$game_variables[85] = enemy.spi
$game_variables[86] = enemy.agi
$game_variables[87] = enemy.hit
$game_variables[88] = enemy.eva

enemy = $data_enemies[89]
enemy.maxhp *= $game_party.members.size
enemy.maxmp *= 1
enemy.atk = enemy.atk * 12 / 10
enemy.def = enemy.def * 12 / 10
enemy.spi = enemy.spi * 15 / 10
enemy.agi = enemy.agi * 15 / 10
enemy.hit = enemy.hit * 10 / 10
enemy.eva = enemy.eva * 10 / 10
 一つ目のスクリプトは、敵の各能力値を、予め作っておいた変数に格納するためのもの。変数81番から88番まで、それぞれ最大HPから回避率までを格納した。最初の行の $data_enemies[89] というのは、データベースの敵キャラID89番の敵のことだ。二つ目のスクリプトは実際にその89番の敵キャラのステータスを変更している。例えば、enemy.maxhp *= $game_party.members.size で最大HPをこちらのパーティ人数分だけ増やした。パーティが主人公1人だけなら1倍で変化無し、3人なら3倍になる。四行目の enemy.atk = enemy.atk * 12 / 10 は、敵の攻撃力を1.2倍にしている。先に12倍してから10で割るという回りくどい計算式にしたのは、ただ小数点を用いたくなかったためだ。小数点に抵抗が無ければ、enemy.atk *= 1.2 のほうがスマートだろう。最大HPなどの変更をしたため、この後のバトルイベントには、敵キャラの全回復というコマンドを入れている。
 ちなみにこれだけでは、戦闘中のバトラーではなく敵そのもののデータを弄ってしまっているわけだから、当然イベント終了後の通常エンカウントでも、強化されたバージョンの敵が出現してしまう。しかも、出現する度に強化され続けてしまう。そこで、バトル終了後に再びスクリプトを使って敵のデータを元に戻すのだ。先に敵データを各変数に格納したのは、このためだったのだ。

enemy = $data_enemies[89]
enemy.maxhp = $game_variables[81]
enemy.maxmp = $game_variables[82]
enemy.atk = $game_variables[83]
enemy.def = $game_variables[84]
enemy.spi = $game_variables[85]
enemy.agi = $game_variables[86]
enemy.hit = $game_variables[87]
enemy.eva = $game_variables[88]
 前述の一つ目のスクリプトと真逆のことをしている。敵キャラID89番の敵の各ステータスに、変数81番から88番までの値をそれぞれ代入している。これで、戦闘後はデータベースも元通りだ。この方法だと、同時に複数の敵のステータスを変更したい場合、かなり手間が掛かるだろう。しかし、RPGツクール2000に慣れている人間(様々なデータをいちいち変数に代入させて計算・比較していたユーザー)にとっては、とても分かり易いと思う。


 あと、以前VXをやっていた頃に、売却専用の店なども作っていた。ただ単に、ある番号のスイッチが入っている時に限り、購入コマンドの選択ができないというだけのものだ。
● コマンドウィンドウの作成>endの手前に、
if $game_switches[1] == true
@command_window.draw_item(0, false)
end
● コマンド選択の更新>if Input.trigger?(Input::B)内、
if $game_switches[1] == true
$game_switches[1] = false
end
同じく、when 0 # 購入する 直下、
if $game_switches[1] == true
Sound.play_buzzer
else

 たったこれだけ、ifの条件分岐を少し追加するだけで出来る。それとwhen 2 # やめる 直下もwhen 0の部分と同じ処理を記述。ついでにアイテム売買の拡張としては、買えるけど売ることが出来ないアイテム(値段は設定されていても売却不可)を、Window_ShopSell内の、
#--------------------------------------------------------------------------
# ● アイテムをリストに含めるかどうか
# item : アイテム
#--------------------------------------------------------------------------
def include?(item)
return item != nil && item.price > 0
end
この辺を弄ればいい。&& ID何番のアイテム、とか書くだけ。


 とまぁ、以上のことからも分かるように、基本的にWEB上で公開されてている素材を利用しているばかりで、自身で弄れるのは本当に僅かばかりだ。よって、スクリプトに関する質問をされても、まぁ答えられる筈が無い。


 ここまで書いて思い出したのだが、RPGツクール2000に在ってRPGツクールVXに無い機能、「戦闘時の無意味行動」におけるメッセージウェイトに憤っている人は俺だけだろうか。ツクール2000では、スキル作成でスキルの内容をメッセージのみにした場合、敵がその行動を行うために行動条件としてスイッチを指定してやる。例えば「無意味行動」とでも名付けたスイッチを行動条件に入れれば、ちゃんと意味が無くてもその行動を選択し、設定したメッセージだけが流れる。ところがVXのデフォルト設定では、この辺の挙動が2000とは真逆になっている。
 行動条件に特別な指定をせずとも、行動リストに入ってさえいれば、効果の有無に関わらず優先度に従って行動する。ここは改善なのだが、効果の無いスキルのメッセージには、何故かウェイトが適用されないのだ。たとえばドラクエの天空シリーズで御馴染みの「●●はイオナズンを唱えた」で多くのプレイヤーが身構え、その直後に流れる「しかしMPが足りなかった」で安堵する、という表現がVXのデフォルト設定では不可能なのである。これは、ドラクエこそ至上のRPGだと公言して憚らない俺にとって、由々しき改悪である。

 ということで、スクリプト改変。
▼ シーン下、Scene_Battle内、(俺が処理を何も放り込んで無ければ)●戦闘行動の実行:スキルの914行目に挿入。
if skill.id >= 250 and skill.id skill.id


理由は分からないがこれより下が何度更新しても切れてしまい反映されないのでもういいや。疲れた。生きる苦しみ。


最新の画像もっと見る

コメントを投稿