SRPG Studio ~ シミュレーションRPG作成ソフト

スクリプトの記述

Plugin開発において、Scriptフォルダに直接手を加えるのではなく、 Pluginフォルダにファイル配置することが一番の基礎となります。 そして次に重要となるのは、既存のメソッドを上書きする際に、 そのメソッドを事前に保存しておくテクニックを身につけることです。 公式Pluginのcustom-class.jsを例に、まずはよくないコードから確認します。

AbilityCalculator.getCritical = function(unit, weapon) {
	var percent = 0;
	var cls = unit.getClass();
	
	// カスタムパラメータにcrtが存在し、数値が設定されているか調べる
	if (typeof cls.custom.crt !== 'number') {
		return percent;
	}
	
	if (percent < 0) {
		percent = cls.custom.crt;
	}
	else {
		percent += cls.custom.crt;
	}
	
	return percent;
};
		

このPluginの目的はクラスにcrtというカスタムパラメータが設定されているならば、その値を返すというものです。 特定のクラスにクリティカル補正を設定するという機能が既定で存在しないため、 このようなPluginが用意されています。 しかし、このコードには、本来のクリティカル率を無視しているという致命的な問題があります。 AbilityCalculator.getCriticalはユニットのクリティカル率を求めるメソッドですが、 カスタムパラメータのcrtだけを返しているため、ユニットの技がどれだけ高くても、 クリティカル率はcrtの値になってしまいます。

上記した問題を防ぐには、既存のgetCriticalメソッドを事前に呼び出しておくというものになります。 これはイメージとしては次のようなものになります。

var percent = AbilityCalculator.getCritical(unit, weapon);
		

このようにすれば、本来のクリティカル率を取得できるように思えますが、実際には誤りとなります。 AbilityCalculator.getCriticalは既に上書きしているメソッドであるため、 このような処理を記述すると、AbilityCalculator.getCriticalが無限に呼ばれることになるためです。 この問題を防ぐには、上書きされる前のAbilityCalculator.getCriticalを保存しておき、 それを呼び出すようにすることです。

var alias1 = AbilityCalculator.getCritical;
AbilityCalculator.getCritical = function(unit, weapon) {
	var percent = alias1.call(this, unit, weapon);
		

2行目のAbilityCalculator.getCritical =が実行される前に、alias1にメソッドを保存します。 そして、3行目ではalias1を呼び出すことで、上書きされるメソッドが正常に呼ばれることになります。 alias1という変数は自由に命名して問題ありませんが、呼び出す際にはcallとthisの指定が必要になる点に注意してください。

Plugin開発では、そのPluginが他のPluginに影響を与えない、かつ影響を受けないようにすることも重要になります。 上記コードではalias1をグローバル変数として定義したことになりますが、 これでは他のPluginがalias1というグローバル変数を定義した時に競合が発生してしまうことになります。 よって、グローバル変数をそのPluginの中でのみ有効にする必要があります。 以下に完成したcustom-class.jsを示します。

(function() {

var alias1 = AbilityCalculator.getCritical;
AbilityCalculator.getCritical = function(unit, weapon) {
	var percent = alias1.call(this, unit, weapon);
	var cls = unit.getClass();
	
	// カスタムパラメータにcrtが存在し、数値が設定されているか調べる
	if (typeof cls.custom.crt !== 'number') {
		return percent;
	}
	
	if (percent < 0) {
		percent = cls.custom.crt;
	}
	else {
		percent += cls.custom.crt;
	}
	
	return percent;
};

})();
		

コードの開始に(function() {を記述し、最後には})();を記述します。 これにより、この中で定義された変数やオブジェクトは、他のPluginから参照できなくなります。

目次

スクリプト・マニュアル

ヘルプ・マニュアル