RPGツクールVXAceの網

RPGツクールVXAceの製作過程で気が付いたことをメモする。

柔軟なアイテムカテゴリ

ツクールVXAceのデフォルトメニュー画面のアイテムウィンドウで、標準のカテゴリは以下の4つである。

  1. アイテム
  2. 武器
  3. 防具
  4. 大事なもの

 ここに、新たにオリジナルのカテゴリを追加したい場合もあるだろう。例えば、「アイテム」を、「薬」「食べ物」「本」の3種類にカテゴリわけして表示したい、とする。

 このとき、VXAceのデータベースエディタのアイテム項目には、これら薬、食べ物、本を区別する項目が無いので、自分でこれらのアイテムを識別するための何らかのパラメータを追加せねばならない。設定値としては「アイテムタイプ」がそれにあたるが、通常と大事なものの2種類しか選択できず、独自に追加できない。

 最も単純な方法としては、アイテムIDを区切ってしまうというものがある。例えば、ID1~100を薬、101~200を食べ物、201以降を本としてしまうもの。これを使えば、特に難しいことを考えなくても追加できそうである。しかし、もし開発の途中で薬が100種類を超えてしまったときにRGSSを修正せねばならないのは必至で、逆に食べ物を100個分用意したものの実際は20個しか使わず、残り80個分はデータベースの肥大化のみ影響する、という創作者にとってもプレイヤーにとってもあまり嬉しくない事態が起こりうる。

 RPGツクールXPの網にも以前記載したが、今回のような独自パラメータには「メモ」を使うのが賢い。エディタ右下のメモ欄のことで、この内容は

 Item.note

で参照できる。また、アイテムだけでなく RPG::BaseItem から派生しているもの(アクター、職業、スキル、アイテム、武器、防具、敵キャラ、状態)全てで使用することができる。

 今回の例を実現しようとすると、まずアイテム蘭のメモに 薬 と記入する。一つのアイテムに複数のパラメータを使用したければ、改行で区切ったメモにしておくこともできる。このとき、RGSS側の item.note は \r\n をデリミタとする文字列を返してくるので、これをspritで区切って使う。Window_ItemListクラスのinclude?(item)メソッドの内容を、薬かどうか?の判定として以下のように修正する。

  item.is_a?(RPG::Item) && item.note.split("\r\n")[0] == "薬"

 この方法の利点は、開発途中で個数が増減してもRGSSの修正を必要とせず、データベースのアイテムのメモ編集だけで完結できるというところ。データベースのサイズにも無駄が無い。ほかにも、スキルのクリティカル発生率だとかオリジナルパラメータを追加したいときに使える。

 ただし、上のアイテムの例で1点注意しないといけないのは、include?(item) メソッドの引数にはnilが入ってくることだ。装備選択で、装備しているアイテムを外す(素手にする)ときに「空欄」を選択しないといけないためで、make_item_listメソッドの @data.push(nil) if include?(nil)で記述されている(コメントが無いため何のための処理なのかわかり辛い)。nilに対して.noteは参照するとエラーになるので、ここは別に分岐しておく必要がある。もしくは、一度武器をつけたら素手にしなくてもよいわ、という人は上のdata.push(nil)をコメントアウトしてしまう、という方法もある。