RGSSをどう料理するか?(RPGツクールXP/VX共通)

汎用性の高いRGSS。しかし下手にいじると収集がつかなくなってしまうこともあります。

ここでは、RGSSを新規に組上げる(もしくは改造する)際に、 どのような構成でRPGツクールのシステムと融合させて行けば良いかを考察しました。

RGSSの役割と位置づけ

RPGツクールでのRPG製作において、基本的にRGSSはデフォルトの開発システムでは不可能な(もしくは効率が悪い) オリジナル要素を追加する時に使用するものと思っています(例:戦闘システムの自作、画面切り替え方法の変更など)。

このことから、デフォルトのエディタでできることはデフォルトで行い、 効率が悪かったりどうしても無理な部分をRGSSで作るというのがベターだと考えます。 さらに、デフォルトで組上げてあるRGSSをうまく活かして、追加機能を盛り込んでいく(追加定義)が推奨されています。 自作システムだからといって、まずデフォルトのシステムを全部消して……とやるよりは、 自分で組込みたい部分を追加で上書きしていく形態のほうが構造上もスマートになります。

図:実装を検討する順位

RGSS FLOW

ポイント1:ゲーム変数とRGSS変数

仮に、メッセージ文章の表示速度をプレイヤー側で変更できるシステムを作りたいとします。 イベントコマンドの文章内で制御文字¥をたくさん入れて分岐させるわけにもいかないので、 通常はRGSSを使用することになります。

文字表示速度の変更部分ができたとして、どのスピードにするか?という変数を設けておかねばなりません。 ここで、たとえば$system_message_spdなどといったグローバル変数を新たに定義したとします。 一応これでも動作しますが、メッセージスピードはプレイヤーが好みで設定するものなので、 セーブファイルごとに別々に管理する必要があります。このとき、 $system_message_spdはセーブデータに保存されない値のため、 わざわざセーブ時にファイルに書き込む項目を追加する必要があります。 さらに、$system_message_spdがどういう値になっているかをゲーム中に見るためには、 イベントコマンドからスクリプトを打つ必要もあります。

ここでは、ゲーム変数$game_variables[変数番号]の一つをメッセージスピード用に使うのが賢い選択です。 使うゲーム変数にはあらかじめ「RGSS用メッセージスピード」などの名前をつけておき、 ゲーム内で使いまわしされないようにしておきます。RGSS側では$game_variables[変数番号]を呼び出して、 文章表示速度を管理します。ゲーム変数はセーブファイルに保存されるので、わざわざセーブ側の処理を追加する必要もありません。 テストプレイ時はF9で値を確認可能で、イベントで文章表示速度を変えたければイベントコマンド「変数の操作」で可能です。

また、ゲーム変数にはRGSS側から文字列だけでなく配列も代入可能なので、例えばゲーム内で使用するフォント名や、 技の熟練度(スキルIDをkeyとするハッシュ)などといったものにも使用できます(ただしF9の閲覧時にエラーが出る可能性があります)。 実際にグローバル変数$**を使うことは稀で、スクリプトの構造上同じ名前のグローバル変数を間違って作ってしまい トラブルのもとになったりするので、今回のようなセーブファイルごとに保存しておきたい値は、 ゲーム変数$game_variables[変数番号]を使用していくのが無難かと思います。

ポイント2:RGSSとコモンイベント

イベントコマンドには「スクリプト」というものがあり、イベントからもスクリプトを呼び出すことができます。 しかし、イベント側からここに何十行というスクリプトを書くのはあまりよろしくありません。 コピーするにもイベントを探しに行く必要が生じ、スクリプトエディタの検索でもひっかからなくなります。

結局、頻繁には使わないけれども特定の場所で呼び出される機能(例:ある場所でHPを画面に表示する) にスクリプトは使うことになります。これはほぼ''コモンイベント''と同義であるので、デバッグの面からも、 コモンイベントに「スクリプト」コマンドを配置し、イベントからはコモンイベントを呼び出す形が良いかと思われます。

また、イベントコマンド「スクリプト」の処理を行う部分は、RGSSのclass Game_Interpreterになります。 Game_Interpreter内で定義されたメソッドは、スクリプトとしてcommand_354(タイトルへ戻る) などと一発記述で実行できます。イベント(コモンイベント)から呼び出すスクリプトを作成する際は、 まずclass Game_Interpreterにメソッドを追加し、それをイベントコマンド「スクリプト」から呼び出すのが良いかと思います。

ポイント3:メソッドの活用

特に、RPGツクールVXではメソッドが細かく切り分けられています。RGSSに手を加える際は、 クラスを全部書き換えるよりも、改造したい部分のメソッドを追加定義したほうが間違いも少なく、 構造もわかりやすくなります。

例えばウィンドウのカーソル点滅が早すぎるときは、class Window_Base < Windowを全て書き換える必要はなく、 def updateのみ以下のように書き換えるとできます。

 class Window_Base < Window
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #     カーソル早すぎるので2回に1回更新とする
  #     INPUTには影響しない
  #--------------------------------------------------------------------------
  def update
    super if (Graphics.frame_count % 2 == 0)
    if @opening
      self.openness += 48
      @opening = false if self.openness == 255
    elsif @closing
      self.openness -= 48
      @closing = false if self.openness == 0
    end
  end
 end#of class

↑これをスクリプト素材として追加することで、class Window_Basedef updateだけが上書きされる。