えるまめさん
こんにちは! 面白そうな質問内容でしたので、ちょっと調べて見ました。
スキルを使用したときのコストの計算は下記となっていました。
コード: 全て選択
Game_BattlerBase.prototype.skillMpCost = function(skill) {
return Math.floor(skill.mpCost * this.mcr);
};
消費MPにMP消費率を乗算しています。
ここで、剣崎宗二さんがおっしゃっている通りレート計算を加算系にしてあげれば良いと考えます。
skill.mpCostはデータベースにて設定した消費量です。
では、this.mcrのレート(倍率)の計算方法は?
1.mcrはGame_BattlerBaseのObject.definePropertiesにて定義されています。
コード: 全て選択
Object.defineProperties(Game_BattlerBase.prototype, {
・・・
// Mp Cost Rate
mcr: { get: function() { return this.sparam(4); }, configurable: true },
・・・
});
コスト計算の際にthis.mcrと呼び出すことでfunction() { return this.sparam(4); }のレートが帰ってきます。
2.sparam関数とは何か。
剣崎宗二さんがおっしゃっている通り、乗算系のレート計算です。
考え方は簡単で、MP消費率が40%と50%の装備品AとBを装備していた場合、MP消費率は20%と計算します。
逆にxparam関数の場合は、命中率が30%と70%の装備品AとBを装備していた場合、命中率は100%と計算します。
コード: 全て選択
Game_BattlerBase.prototype.sparam = function(sparamId) {
return this.traitsPi(Game_BattlerBase.TRAIT_SPARAM, sparamId);
};
Game_BattlerBase.prototype.traitsPi = function(code, id) {
return this.traitsWithId(code, id).reduce(function(r, trait) {
return r * trait.value;
}, 1);
};
Game_BattlerBase.prototype.traitsWithId = function(code, id) {
return this.allTraits().filter(function(trait) {
return trait.code === code && trait.dataId === id;
});
};
コードを見てみると上記の様になっています。
ざっくりですが、そのアクターが持っている全ての特徴からcodeとidに一致している特徴を全て抽出し、
全て乗算して最終的なレートを計算していると考えられます。
ここでcodeは乗算系か加算系か、idは特徴の種類(命中率、MP消費率・・・)の識別をしています。
さて、ここで特徴にMP消費率50%の装備品を試しに作成してみて、dataにあるArmors.jsonを覗くと下記の様になっています。
{"id":4,"atypeId":1,"description":"","etypeId":5,"traits":[{"code":23,"dataId":4,"value":0.5}],"iconIndex":145,"name":"指輪","note":"","params":[0,0,0,0,10,0,0,0],"price":300}
注目すべきは下記の点です。
traits":[{"code":23,"dataId":4,"value":0.5}]
参考までにMP消費率を50%に変更する特徴のcodeとidは23と4ということが分かりますね。
結論として、プラグインを作成するしかありません。
一番ベストなのは、下記の様に乗算系のレート計算を加算で計算する新しいレート計算の関数を作り、
mcrをまるごと再定義してあげれば良いと思われますが、下記のコードでmcrだけを再定義できるのかはちょっと分かりません。
(1/26)コード変更しました。これで問題ないはずです!
コード: 全て選択
Game_BattlerBase.prototype.sxparam = function(sparamId) {
return this.traitsSum(Game_BattlerBase.TRAIT_SPARAM, sparamId);
};
Object.defineProperty(Game_BattlerBase.prototype, 'mcr',{
// Mp Cost Rate Special
get: function() { return this.sxparam(4); },
configurable: true
});
以上です。長文失礼しました。
考え方の記述のみで申し訳ありませんが、何分内容が難しいためご容赦願います。