pluginの作り方

※これを書いてる人はJavaScriptのことをあまりよく分かってません※
トップページに書いてある通り、公式の「スクリプト情報」でも同様の解説が行われているのでそちらの解説に目を通した良いでしょう


概要

戦闘計算式の変更、ゲーム中の表示を細部まで変更するにはツール側で可能な設定だけでは限界があります。
そこでscriptフォルダ(以下、script)の中に入っているスクリプトを書き換える必要があるわけですが、
scriptの中のファイルを直接修正することは全くお勧めできません。
それでも一応動作はするものの、
SRPG Studioのアップデートを行った際にscriptの中身が上書きされて初期化されてしまうからです。
上書きを避ける為にはpluginフォルダ(以下、plugin)の中に加工したスクリプトのファイルを入れておく必要があります。
pluginの中のスクリプトはアップデートで上書きされることが無く、
ゲーム中の処理としてもscriptの中のファイルの処理よりpluginの中のファイルの処理の方が優先されるのです。

かと言ってscriptのファイルをそのままpluginの中にコピーするのも問題があります。
アップデートで内容が変わらないということはアップデートしてもその内容が反映されないということです。
下手すればアップデートで追加されたはずの機能を使えずエラーを引き起こします。
この問題を回避する為には以下のようなファイルを作成する必要があるのです。

作り方

まず白紙のテキストファイルを作ります。
または、scriptからjsファイルをコピペして白紙にして別の場所に保存します。
誤ってscript側のファイルに上書き保存しちゃったらツールの「ヘルプ」→「復元処理」から復元しましょう
最終的に拡張子jsで保存する必要があるので、拡張子の変え方が分からない方は後者が都合良いです。
そして、下記のように入力します。



(function() {


})();



この{}の中に書き換えたい関数(処理)をコピペしていく形になります。
(functionで囲わなくても動くことは動きますが、
 後述のalias化などの際に関数外での変数の宣言が多分できなくなるのでとりあえず囲っておきましょう)

試しに、ユニットの攻撃力を計算する部分を変更するプラグインとして作ってみましょう。
該当する処理はsingletonフォルダのsingleton-calculator.jsの中にあります。
getPowerがそれです。この部分の関数をまるまるコピペしてきましょう。
するとこうなります。




(function() {

getPower: function(unit, weapon) {
	var pow;
	
	if (Miscellaneous.isPhysicsBattle(weapon)) {
		// 物理攻撃または投射攻撃
		pow = RealBonus.getStr(unit);
	}
	else {
		// 魔法攻撃
		pow = RealBonus.getMag(unit);
	}
	
	// 武器の威力 + (力 or 魔力)
	return pow + weapon.getPow();
},

})();



このままだとゲーム起動時に確実にエラーを起こします。
エラーを回避する為には以下のように修正します。



(function() {

AbilityCalculator.getPower = function(unit, weapon) {
	var pow;
	
	if (Miscellaneous.isPhysicsBattle(weapon)) {
		// 物理攻撃または投射攻撃
		pow = RealBonus.getStr(unit);
	}
	else {
		// 魔法攻撃
		pow = RealBonus.getMag(unit);
	}
	
	// 武器の威力 + (力 or 魔力)
	return pow + weapon.getPow();
};

})();



何処が修正されたのかというと、
  • 「getpower」の前に「AbilityCalculator.」を追加したこと
  • getPowerとfunction(unit, weapon)の間の「:」が「=」になっていること
  • return pow + weapon.getPow();の後の「},」が「};」になっていること
です。

一番目は「AbilityCalculatorのgetpower」であることをちゃんと示してあげます。

二番目に関しては何で「:」だと駄目なのかさっぱり分かりませんが、
そうやらないとツールが通してくれないのでそうします。
(多分AbilityCalculator.getpowerという既に存在するものに「=」で代入して上書きしてるイメージなのかなとは思うけど)

三番目は「,」が読点、「;」が句点だと考えると納得いきます。
ツールが「このスクリプト句点で締められてねえぞヴォラ」と怒り出すわけですね。
なので「;」で関数をちゃんと閉じるようにしておきましょう。

とりあえずこれで動作はするようになったはずです。
この状態であれば、「AbilityCalculatorのgetpower」のみが上書きされた状態になるので、
singleton-calculator.jsの他の処理はscript側の処理のままになり、エラーを回避できます。

後はpluginフォルダの中に.jsファイルとして保存しておきましょう。

alias化

しかし、このままだとscript側のgetPowerがplugin側のgetPowerに上書きされている状態ということなので、
アップデートの際にgetPowerに修正が加えられた時に反映されません
また、pluginの中の別のスクリプトがgetPowerに修正を加えていた場合もどちらかが反映されなくなります
それを解決する為に処理をalias化します。




(function() {

var alias1 = AbilityCalculator.getPower;

AbilityCalculator.getPower = function(unit, weapon) {
	var pow = alias1.call(this, unit, weapon);

	return pow;
};

})();




特に難しいことはありません。
plugin側のAbilityCalculator.getPowerがscript側のgetpowerの処理を上書きしてしまう前に、
var alias1 = AbilityCalculator.getPower;」が
変数alias1の中にscript側のgetpowerの処理を丸ごと入れて保存しておく」ものだというだけの話です。
元々の処理の「pow = RealBonus.getStr(unit);」が
変数powの中にユニットの力の数値を読み込む処理(の結果)を入れておく」というのとほぼ同じ理屈です。
そして「alias1.call(this, unit, weapon);」で保存しておいた処理を呼び出して
そこから返ってきた数値をplugin側の処理のpowに入れておきます。
これ以降の変数pow用済みになったscript側の処理とは無関係になるので、
こちらの数値に変更を加えるようにすることで、
アップデートの内容も反映されるし他のプラグインとの競合も避けられるというわけです。

callの括弧の中身は(this, unit, weapon);となっておりますが、
1つ目は「this」で固定と思っていいと思います
同じ名前の関数の中で全ての処理を済ませているので「this」でいいのです。(だよね?
thisの後にはその関数のfunctionの方の括弧の中の文字列(引数)を入れます。
入れないと呼び出した処理に数値などが渡せずエラーを吐き出します。

alias化についてはこういった認識で大丈夫だと思います。
少なくともSRPG Studioのプラグイン絡みに限っては

また、下記のように自分で1から処理を作る時など、
script側の処理を使う必要が無い・他のプラグインも使用しない場合は
alias化の必要が無いことも覚えておきましょう。(この場合はむしろアップデートの反映が邪魔になるので)



(function() {

AbilityCalculator.getPower = function(unit, weapon) {
	var pow;
	
	if (Miscellaneous.isPhysicsBattle(weapon)) {
		// 物理攻撃または投射攻撃
		pow = RealBonus.getStr(unit);
	}
	else {
		// 魔法攻撃
		pow = RealBonus.getMag(unit);
	}
	
	pow = Math.floor(pow / 2);
	
	// 武器の威力 + (力 or 魔力)
	return pow + weapon.getPow();
};

})();

この処理はaliasを使わず、攻撃力に反映されるユニットの力や魔力が半減されるようにしています。
aliasを扱う場合は元々の処理の「力or魔力+武器攻撃力」の数値を扱うことになるため、
既存の処理の合間に別の処理を付け加えたい、既存の処理を削りたい場合はaliasは不向きです。



最終更新:2017年04月18日 04:43