どうも。ナサです。
前回の
RPGツクールMVで自作のメニュー項目を追加する part0
で書いた通り、本題に入ります。
まず、今回のメニュー項目追加で触るフォルダを確認します。
以下の画像のように当たりをつけました。
①dataフォルダには、エディターのデータベースにあるような「用語」の設定なんかも入っている。触りそう。
②jsフォルダには、ゲームシステム(基本的な演算機能、バトルシステムなど)が入っている。メニュー画面に自作の機能を追加する場合も、この中のファイルを編集して処理を加える。
いきなりですが、jsフォルダの中のソースを見ていきます。
メニュー画面は、当然「画面」なので、
「rpg_windows.js」にあると思った。
「rpg_windows.js」を開き、「menu」を検索検索。
あるやん。しかも見る感じメニュー画面の項目をセットしてるっぽいぞ。
で、赤枠の部分の1589行目の部分。
this.addOriginalCommands()っていうところ。
これはユーザー定義で自由に入れたらええやん!
っていうので作り手が残しといてくれたメソッド(※)だ。
※メソッド…プログラムの中の処理を色んな場所で使えるように機能単位で分けた処理のこと。ゲーム自体も、一つのメソッドから始まっていたりする。
一応、「addOriginalCommands」で検索検索。
上部に書かれている「Window_MenuCommand.prototype.addFormationCommand…」っていうところを参考にしてみる。(てきとーに)
今回は「ジョブ変更機能」というものを作ってみたかったので、適当に「jobselect」としてみた。
プログラミングが得意じゃない人も見てるかもしれないから書いておくと、既存のソースに変更を加えた部分は、後から検索したりしてすぐにわかるように「コメントを残す」ということをします。
RPGツクールMVのバージョンが上がると差分をマージするということも必要になります。後々活躍することになると思って、コメント(// st [add:2017.10.22] Job select menu)のように何か残しておくことをおすすめします。
次。コピペで適当に名前を変えただけだ。
意味わからん。
1620行目に追加したコード
「this.needsCommand」とか何なん。
というわけで、↑を検索検索。
ほう。
var flags = $dataSystem.menuCommands;
if(flags){
switch(name{
...
}
}
どうやら、条件分岐(if や switchを使ってる)していて、
アイテムやスキルといったメニュー項目に対して、何かの判定をしているっぽい。
よくわからん。知るか。
まぁいいや、コピペで連番で何かしているのでマネして追加。
(flagsは配列のようだ。で、0~5の6つの値が入っているものらしい。今回は7つ目の値を追加することになる)
・・・後でわかったけど、↑の画像の設定は選択可否設定を行ってるらしい。メニュー画面を開いたとき、セーブ禁止だったら洗濯できないとかあるじゃん?それだよ。
次。
さっき書いたコードあるじゃん?これ。
コピペしたけど、まだ書いていないメソッドがあるんだよね。
なので、isJobselectEnabledメソッドを適切な場所っぽいところに書いて定義しておきたい。
isFormationEnabledメソッドのマネしとけ!(ご贔屓にさせていただきます)
というわけで、検索検索。
見つかったので、適当にコピーして、
isJobselectEnabledメソッドというのを追加した。
return に書いてあるのは、選択できるかできないかの制御なので、下に書いてあったisOptionsEnabledメソッドのようにtrue(選択可)を返すようにした。
ちなみに、isFormationEnabledメソッドのreturnに書いてある内容は、多分
「パーティメンバーが2名以上、なおかつゲーム側の定義で並び替えを有効にする」
という条件で、並び替えというメニュー項目の選択可否を制御しているっぽい。
確かに、パーティが一人だけだったら並び替えなんてできないもんね。ぼっち泣ける。
今回は細かい制御は必要ないので、無条件に選択可とします。
次。
検索しても他に必要そうなところはなさげ。
他のソースを見てみよう。
で、行き着いたのが「rpg_manager.js」
addFormationCommandsに書いてあるコードには
this.addCommand(TextManager.formation)というのがあるよね。
この、「TextManager.formation」というのは、
多分「TextManager」の中に定義している「formation」という項目を使った値を使おうとしている。
「TextManager」か・・・たぶん、「rpg_manager.js」っていう感じ。
てなわけで、「rpg_manager.js」を開いた。
どうやら、DataManagerというクラスにはゲーム全体のあらゆるオブジェクトが入っているっぽい。
お、$dataSystemっていうのはさっき見たぞ。
ついでに検索しておこう。
意味ははっきりわからんけど、
$dataSystemでは、System.jsonっていうJSONファイルと関連があるらしい。覚えとこ。
で、話を戻し、これからやりたい事。
さっきの「rpg_windows.js」で定義した処理あるやん、これ。
この、赤枠の部分を作らんとあかん。
さっき書いてたやつ。
てなわけで、
TextManagerを検索検索。
お、ご贔屓にさせてもらっているformationさんもいはりますやん。(笑)
どうやら
TextManager.getter('command', N),
ってなっているところは、0から順に連番になっている。
マネして適当に追加しましょう。(長さとか知るかっ!!)
こんな感じ。
そういえば、ここまででメニュー項目名とか何も触ってないな。
・・・
さっきのSystem.jsonの中にあったりして。
で、開いてみた。
え?一行だけ?!
(WEB系はそんなに知識は無いですが、多分…
テキストエディタのフォーマットをしてやれば…)
※ここではやり方を省きますが、
今回のように一行になっている場合は、データ量の圧縮が目的となっているという認識です。要は、プログラムが読めれば良いという考え方です。
こんな感じになりました。
JSONファイルはこういった雰囲気の構造ですよっと。
JSONファイルでは、項目名に対しての値を構造的にデータを入れます。
例えば、赤枠のところだと
armorTypes(防具の種類)
””(何もなし)
”一般防具”
”魔法防具”
…
”大型盾”
のような構造で書かれている。これを1階層だとして、
2階層、3階層…と階層を深くして様々なパターンの
データを定義できる。
JSONについてGoogle先生に聞いてみよう。
↑とりあえずJSONって入力するのを省いてあげるので検索してくれ(雑)
混乱したら…さーせん。。。
WEB系はよく使うファイルなのですぐ覚えられると思う。
で、これから「System.json」に追加しないといけないはずの項目を洗うと。
①menuCommandsっていうところの定義(どーせjsonの中だろうし)
②commandってやつ
どうせJSONの中にあるんだろ?
と、頭の中で直感さんがそう言っている。
あったので追加しておいた。
trueが並んでいて訳がわからない気もするが、
これを使っていたところを振り返ると
$dataSystem.menuCommandsをflagという変数に入れて使っていた。
で、returnでflags[N]で使っていた。配列のデータだ。
修正前は6(flags[0]~[5]で使っていて)、追加して7つ目のtrue。(これでflags[6]が使えるようになるはず)
ちなみに、もちろんだけど
今回自分で作ったコードで使用されるのは一番後ろ、7つ目のtrue。
次。commandの内容。
あったので、追加しておいた。
気になる人は項目数を数えよう。
「rpg_manager.js」で追加したコードを見ると、何番目の項目を読むかを設定してるっぽかった。
実際に他の項目と見比べると全てリンクしているはず。
(JSONでnullとなっているところは、空き番ということでしょう。たぶんね)
よし。他はたぶん大丈夫っしょ。
(何が大丈夫かは私にもわからない。鼻毛抜くときスポっといくときとブチィッ!っていくときとあるよね。後者のほうがほとんどで涙がでるけど、癖になるマゾヒズム。)
じゃあ、ゲーム起動してみる。
よし。メニューにオリジナルのメニュー項目が出てきましたよ、と。
現状では何も動作しないメニュー項目があるだけなので、
これからは、実際に何か出るようにしたいなと思います。
~ふと、書き方について考える~
RPGツクールはプログラミングのスキルが無くても、RPGゲームが簡単に作れるツールとなっていますが、一応知識がない人にも向けて書く。
という気の利く人になりたいけど、如何せん面倒くさいので、今回のように、私の思考、手順を垂れ流しにして書いていく。
(あまり考えずにホイホイ書いていきます。知識の浅さが悪目立ちするかもしれませんが…まぁ、いいや!w)
簡潔にやり方だけ書けばいいやん!っていう人も大勢いらっしゃることと思いますが、中には手順もわからない(私のような)頭の悪い人もいらっしゃるでしょう。(…同士よ!)
失敗談であり、いずれの成功談につながることを祈って。
ここまで読んでくださった方ならお優しい方と思います。
もし何かあれば、コメントを頂ければ幸いです。
同様に、RPGツクールMVで悩みがあればコメントをください。
何かしらの力になれたらなと思います。(私も入門者なので決して詳しくないですが)
じゃあ、またね。