RPGツクールMZ・プラグイン講座

1:はじめに

最近のRPGツクールシリーズでは、プラグインという追加プログラムを  入れることによって制作できるゲームの幅を広げることができます。   これによって古典的な2DRPGだけでなく、ノベルやアクションゲームを  作ることも可能になりました。そこまで大掛かりな改造をしなくても   ゲームシステムを細かく設定し、かゆい所をフォローするという使い方も あります。ゲームよりもプラグイン制作で有名なユーザーが結構いるので 彼らに憧れて、プラグインを作りたくなることもあるでしょう。     しかし、プラグインを作るためにはJavaScriptのプログラミング知識が   必要になるので、そこであきらめてしまう人も多いと聞きます。そこでこの記事で、実際にプラグイン制作を行う様子を見てもらおうと思いました。 ただしこの記事を読む場合、RPGツクールMZの公式ホームページにある 「プラグイン講座」に書かれている知識を前提としますので       ご了承ください。リンク:RPGツクールMZ・プラグイン講座

2:目標物の設定

目標を決めておくことは、制作を行う上でも重要です。         ゲームであれば「異世界で無双とかいいから、とっとと帰りたい」だとか「国際色豊かな女の子と恋がしたい」などのコンセプトです。この記事では「データベースのアクター・職業・武器・防具・・ステートのメモ欄に  オリジナルの能力値を定義し、その合計を算出する」というプラグインを 作ることにします。データベースのメモ欄を使ったプラグインはかなり  多いので、このプラグインを作ることができれば様々な応用ができるようになるでしょう。                           これから作るプラグインでは、画像1のようにツクールMZにおける    データベースのメモ欄に<oriParam:100>と書き込めば、そのキャラクターがoriParamという能力値を100得ます。これに加え、メモ欄に<oriParam:50>と書かれた武器を装備していると、oriParamが150になります。

スクリーンショット 2021-01-27 06.58.01

 画像1:アクターにオリジナルパラメータを定義

さらに、画像2のようにスキルのダメージ計算式において「a.oriParam」と 書き込めばそのスキルが対象にダメージを与える場合、使用者が持つoriParamの値だけダメージを与えることができます。

スクリーンショット 2021-01-27 09.49.45

画像2:スキルのダメージ計算式にオリジナルパラメータを使用

3:プラグイン制作の準備

コーディングを行って、プラグインを作る前に色々と準備をしましょう。 まずは、プラグイン制作用のゲームプロジェクトの作成です。      プラグインは、ゲームの根幹をプログラムによって改造するため予期せぬ 事態が起こることがあります。それによるトラブルを和らげるために   プラグインを制作・テストするためのプロジェクトを作り、そこで実際の 作業を行うようにしましょう。                    次に、私が作ったプラグインのテンプレートをダウンロードしてください。こちらにあります。                         ダウンロードしたファイルを、プラグイン制作用のゲームプロジェクトに ある js→plugins のフォルダに入れてください。そして、このファイルを  コピーしてファイル名を「originalParameter.js」にして下さい。     さらに、このプラグインをゲームに反映するため有効化を行いましょう。 ツクールMZの上部にあるパズルのピースを模したアイコンをクリックし 「プラグイン管理」の画面を呼び出します。そして、何もない部分を   クリックすると「プラグインの設定」という画面が出てくるのでそこから「originalParameter」を選びましょう。すると、プラグインがゲームで  有効化された状態になります。                    これで準備が整いました。いよいよ、プラグインのコーディングを    行いましょう。

4:コーディング

これから私が指示するコードを「originalParameter.js」のファイルに   書き込みますが、それは'use strict'と書かれている部分より下に      追加してください。まずはアクターに、オリジナルパラメータを持たせて みましょう。以下のコードを書きこんで下さい。

Game_Actor.prototype.getOriginalParameter = function(){
    return 100;
}

これで、アクターがgetOriginalParamという数値100を返す関数を得ました。すなわち、100のオリジナルパラメータを得た状態と言えます。     前述したように、この関数をスキルのダメージ計算式で使うと敵に    100ダメージを与えることができます。 

しかし、実際のダメージ計算式では「a.atk - b.def」のように、能力値に  括弧がつかない状態で使用しています。これができるように以下のコードを書きこみましょう。

Object.defineProperties(Game_Actor.prototype, {
    // oriParam
	oriParam: {
		get: function() {
			return this.getOriginalParamater();
		},
		configurable: true
	},
});

これで、ダメージ計算式において「a.oriParam」という表記のみで    オリジナルパラメータを使うことができるようになりました。この表記の 意味は、今は無視してもいいです。                  次に、アクターのメモ欄からオリジナルパラメータを取得できるように  しましょう。以下のコードを書きこんでください。

//アクターのメモ欄から、オリジナルパラメータを算出する
Game_Actor.prototype.getOriginalParamByActor = function(){
	const oriParamByActor = Number(this.actor().meta.oriParam);
	return isNaN(oriParamByActor) ? 0 : oriParamByActor;
};

このコードの意味を、解説しましょう。               constは定数、すなわち代入するともう値を変えられない変数を宣言します。JavaScript講座では、letという値を変更可能な宣言が使われていますが  代入ミスによるバグを防ぐために、なるべくこちらを使うことが     推奨されています。

Number()は、括弧で囲った文字列を数字に変換する処理を行います。   アクターのメモ欄に<oriParam:100>などの形で定義した文字列はthis.actor().meta.oriParamと書き込めば取得できますが、文字列の状態に  なっているのでこのままでは計算ができません。そこでNumber()を使って 数字に変換するのですが、入力ミスにより文字列を入力してしまうケースがあるかもしれません。そうなると、変数oriParamByActorにはNaNという  数値ではないことを表す特殊な値が代入されます。           

最後に、次の行のreturn文で結果が出力されます。ここで使われているのは条件演算子と呼ばれる構文で、左端に条件を書いてそれが満たされていれば1番目の値を、いなければ2番目の値を返すというものです。 oriParamByActorを囲っているisNaNというのは、囲まれているのが    数値ではない、すなわちNaNであればtrueを出力する処理です。     つまりoriParamByActorが数値ではなければ0を、数値であれば<oriParam:100>のように定義した値、この場合は100が出力されます。  次に、アクターが就いている職業からオリジナルパラメータを      取得しましょう。次のコードを書きこんでください。

//就いている職業のメモ欄から、オリジナルパラメータを算出する
Game_Actor.prototype.getOriginalParamByClass = function(){
	const oriParamByClass = Number(this.currentClass().meta.oriParam);
	return isNaN(oriParamByClass) ? 0 : oriParamByClass;
};

行っていることは、先程書き込んだアクターのケースと同じですがthis.currentClass()という関数により、現在就いている職業の情報を取得することができます。                          さらに、アクターが装備している武器や防具からオリジナルパラメータを 取得しましょう。以下のコードを書きこんでください。

//装備のメモ欄から、オリジナルパラメータを算出する
Game_Actor.prototype.getOriginalParamByEquip = function(){
	return this.equips().reduce( (oriParamSum,equip) => {
		if(equip === null){
			//装備がnull、すなわち無装備ならば加算しない
			return oriParamSum;
		}
		const oriParamByEquip = Number(equip.meta.oriParam);
		if(isNaN(oriParamByEquip) ){
			return oriParamSum;
		}else{
			return oriParamSum + oriParamByEquip;
		}
	},0);
};

ここでは、Arrayクラスの関数であるreduceを使おうと思います。かなり  難しいですが、使いこなせれば便利です。その機能を簡単に言うならば  「配列の要素をまとめた値を出力する」ことです。           

まずは、this.equips()という関数を使うことによってアクターの装備品を  配列として取得できます。これに対してreduce関数を使いましょう。   最初の引数であるoriParamSumは、これまでにまとめられた値です。最後のほうにある0で、初期値を設定しています。次の変数であるequipは、現在 参照している装備品です。                      

まずは装備品がnull、すなわち装備していなければそのままこれまでの  合計値を出力します。                        そして装備があるならばequip.meta.oriParamでオリジナルパラメータを  取得し数値に変換します。もしも数値でないならば、やはりそのまま   これまでの合計値を出力し、数値であればそれをこれまでの合計値に   加算します。これを繰り返すことにより、装備品に定義されたオリジナル パラメータを合計できます。                     

次にかかっているステートから、オリジナルパラメータを取得しましょう。次のコードを書きこんでください。

//かかっているステートから、オリジナルパラメータを算出する
Game_Actor.prototype.getOriginalParamByState = function(){
	//ステートにかかっていなければ、オリジナルパラメータは0とする
	if(this.states().length === 0){
		return 0;
	}
	return this.states().reduce( (oriParamSum,state) => {
		const stateOriParam = Number(state.meta.oriParam);
		return isNaN(stateOriParam) ? oriParamSum : oriParamSum + stateOriParam;
	},0);
};

まずは、ステートにかかっていな場合はそのまま0を返すことにします。this.state()という関数を使うと、かかっているステートが配列の形で   出力されます。もしアクターがステートにかかっていない場合は     要素が0なので、そのまま0を返します。                

次に、アクターがステートにかかっていればステートの配列にreduce関数を適用し、オリジナルパラメータの合計を返します。           

そして最後に、習得しているスキルからオリジナルパラメータを     取得しましょう。最近では、習得しているだけで効果を発揮する    「パッシブスキル」のシステムがあるゲームも多いので、そういった作品を作るのに役立つでしょう。以下のコードを書きこんでください。

//習得スキルのメモ欄から、オリジナルパラメータを算出する
Game_Actor.prototype.getOriginalParamBySkill = function(){
	//スキルを習得していなければ、オリジナルパラメータは0とする
	if(this.skills().length === 0){
		return 0;
	}
	return this.skills().reduce( (oriParamSum,skill) => {
		const skillOriParam = Number(skill.meta.oriParam);
		return isNaN(skillOriParam) ? oriParamSum : oriParamSum + skillOriParam;
	},0);
};

基本的には、前述したステートからオリジナルパラメータを取得する流れと同じです。                             

ここまでのコードで、アクター、職業、装備品、スキル、ステートの   要素からオリジナルパラメータを取得することができるようになりました。なのでこれらの値を合計しましょう。最初に書き込んだ関数であるgetOriginalParameterのコードを、以下のように書き換えましょう。

//オリジナルパラメータの計算
Game_Actor.prototype.getOriginalParamater = function(){
	return  this.getOriginalParamByActor() +
			this.getOriginalParamByClass() +
			this.getOriginalParamByEquip() +
			this.getOriginalParamBySkill() +
			this.getOriginalParamByState();
};

JavaScriptはかなり柔軟性のあるプログラミング言語で、足し算をこのように書くことができます。これによって、式が横に長くなりすぎて読みにくく なるのを防ぐことができます。

5:終わりに

これで、ツクールMZにおいてオリジナルパラメータを定義し、取得する プラグインが書けたはずです。                    ツクールシリーズは「プログラミングができなくてもゲームが作れる」と いうキャッチフレーズで売っていますが、それに加えて知識が増えれば  様々なことができます。ぜひ頑張ってみましょう。

この記事が気に入ったらサポートをしてみませんか?