百分率については、温州みかんさんにご説明頂いた通りです。
提示したプラグインを使うために必要なことは
1. 経験値倍率、獲得お金倍率、アイテムドロップ確率の倍率を表す変数を用意する
2. スキル効果のコモンイベントでそれらの変数の値を百分率で設定する
の2点のみです。
プラグインやプログラムに限らないことですが、ある程度の規模を持った文書を理解するコツは、まず全体像を大雑把に把握することです。
まともなプラグインであれば、ヘルプを読むことでそのプラグインが何をするものなのか、なんとなく把握できると思います。ここが第一歩です。
もう少し詳しくコードを読むのであればGistやVisual Studio Codeなどのシンタックスハイライトの効く環境で読まれると良いかと思います。
スクショのような感じで、それぞれ色分けされているのには意味があり、理解を助けてくれるはずです。(私はGitHubでダークモードを使う設定をしているのでこの配色ですが、そうでない場合も色分けの意味は変わりません)
View attachment 15521
例えば function, const, return はJavaScriptに元々あるキーワードです。
それぞれ以下のような意味を持っていますが、詳しくは
MDN や
JSPrimer を参考にしてください。
function: 関数を定義する
const: 再代入不可能な変数を定義する
return: 関数の呼び出し元に値を返す
他の色分けについても意味はあるのですが、最初のうちはなんとなく同じ色のものは同じ種類のものなんだな、と思っておけば十分です。
まず中括弧の中身を飛ばして読んでみます。
JavaScript:
function Game_Troop_ExpGoldRateVariableMixIn(gameTroop) {
// 何かコードが書かれているが、最初は見ない
}
Game_Troop_ExpGoldRateVariableMixIn(Game_Troop.prototype);
Game_Troop_ExpGoldRateVariableMixIn という関数を定義して、その後ですぐに呼び出しています。
引数は Game_Troop.prototype ですが、これは rmmz_objects.js で定義された敵グループクラスのプロトタイプです。
(プロトタイプとは何か、まで説明すると長いので省略します)
関数を定義して、コアスクリプトで定義されたものを引数として渡している、というわけですね。
この書き方は必須ではなく、読みやすさ書きやすさのために私個人が実施しているテクニックです。
関数に引数として渡されている gameTroop は、 Game_Troop.prototype と読み替えても構いません。
では、関数の中身を見ていきましょう。
JavaScript:
const _goldRate = gameTroop.goldRate;
gameTroop.goldRate = function () {
return _goldRate.call(this) * $gameVariables.value(settings.goldRateVariable)/100;
};
gameTroop は先程関数に渡された引数で、敵グループクラスのプロトタイプです。
すると、そのメンバーである goldRate は敵グループのお金倍率だろうとなんとなく推測できるかと思います。
(少し奇妙かもしれませんが、獲得金額2倍のパーティ能力の処理は、 Game_Troop.prototype.goldRate 関数の処理として書かれています。詳しくは rmmz_objects.js を参照してください)
JavaScript:
const _goldRate = gameTroop.goldRate;
これは単純な代入ですね。元々コアスクリプトで定義されていた Game_Troop.prototype.goldRate を _goldRate という再代入不可の変数に代入しています。
JavaScript:
gameTroop.goldRate = function () {
// 何かコードが書かれているが、最初は見ない
};
こちらも、関数の中身はまず無視して読んでみましょう。
これも代入です。
Game_Troop.prototype.goldRate に関数を代入しています。つまり、コアスクリプトに定義されていた関数を、ここで定義する別の関数に置き換えています。
さっき元々の関数を _goldRate に代入しておいたのは、置き換える前の関数もこのあと使うから、です。
JavaScript:
return _goldRate.call(this) * $gameVariables.value(settings.goldRateVariable)/100;
関数の中身です。 _goldRate は先程代入した、コアスクリプトに元々定義されている関数です。
.call(this) は、その関数を(thisを束縛して)呼び出す書き方です。
元々の関数を呼び出し、その結果に変数の値をかけて100で割った値を返しています。
$gameVariables はゲーム内変数を管理するオブジェクトで、.value(変数ID) でその変数の値にアクセスできます。
settings.goldRateVariable は29行目付近で読み込んでいるプラグインパラメータの値で、名前の通りお金倍率変数を表します。
つまり、このゲーム内変数の値が120であったなら、 Game_Troop.prototype.goldRate 関数の返す値は
(元々の関数によって計算された数値) * 120 / 100
となります。
元々の関数の計算結果は獲得金額2倍の特徴をパーティの誰かが持っていれば2、誰も持っていなければ1です。
獲得金額2倍特徴を誰も持っていなかったとして、 1 * 120 /100 で最終的な結果は1.2になりますね。
Game_System_ExpGoldDropItemRateVariableMixIn 関数には、コメントにもあるように戦闘開始時に各種倍率を100でリセットするための処理を書いています。
MNKR_TimingInvokeCommonMZ.jsなどで代用可能なので、必ずしも書かなくても良いかなとも思いましたが、以下の理由からこのプラグインに書いています。
- 1プラグインで完結していたほうが説明は容易
- 戦闘開始ごとの初期化を前提とするゲーム仕様かつ戦闘開始時に別の処理を行わないのであれば、処理が分散するよりも管理しやすい