const rate = 50;
actor.gainHp(actor.mhp * rate / 100);
(() => {
const _Game_Action_executeHpDamage = Game_Action.prototype.executeHpDamage;
Game_Action.prototype.executeHpDamage = function(target, value) {
if (this.item().meta.damageRate) {
value = target.mhp * value / 100;
}
_Game_Action_executeHpDamage.call(this, target, value);
};
const _Game_Action_executeMpDamage = Game_Action.prototype.executeMpDamage;
Game_Action.prototype.executeMpDamage = function(target, value) {
if (this.item().meta.damageRate) {
value = target.mmp * value / 100;
}
_Game_Action_executeMpDamage.call(this, target, value);
};
})();
コメントありがとうございます!プラグインということは、gainHp はご存知ですよね。まずは以下の式が基本になります。
これは、rate つまり 最大HPを50%回復することになります。JavaScript:const rate = 50; actor.gainHp(actor.mhp * rate / 100);
これをもとに見て行きましょう。
具体的には、HP/MPの設定値を%で計算するスキルやアイテムのメモに<damageRate>と書いた場合に割合にする場合、
以下のように書きます。
JavaScript:(() => { const _Game_Action_executeHpDamage = Game_Action.prototype.executeHpDamage; Game_Action.prototype.executeHpDamage = function(target, value) { if (this.item().meta.damageRate) { value = target.mhp * value / 100; } _Game_Action_executeHpDamage.call(this, target, value); }; const _Game_Action_executeMpDamage = Game_Action.prototype.executeMpDamage; Game_Action.prototype.executeMpDamage = function(target, value) { if (this.item().meta.damageRate) { value = target.mmp * value / 100; } _Game_Action_executeMpDamage.call(this, target, value); }; })();
上記をプラグインにして試してみてください。
色々とお教えいただきありがとうございます。HPやMPを割合で減らすといっても、別に特殊なことをやっているわけではなくて、
単に最大HP・最大MPの何%に当たる量を計算して、固定値の代わりにその量を増減しているだけです。
スクリプトで固定値を増減させる方法が分かっているのであれば、
その固定値のところに、代わりに最大HP・最大MPの何%に当たる量の計算式を書けばOKです。
ただし、量は整数でないといけないので、Math.floorやMath.ceil、Math.roundなどで切り捨て・切り上げ・四捨五入いずれかをしてやる必要があります。
ちなみに、固定値の増減は調べたら分かったとのことですが、
現状どのように書いているのかを記載してもらった方が、こちらとしても答えやすいかなと思います。
スクリプトの書き方は一通りではなく、既存の書き方があるならそれに沿って教えた方が分かりやすいためです。
$gameParty.members().forEach(function(actor) {
this.changeHp(actor, 変化量, true);
}.bind(this));
$gameParty.members().forEach(function(actor) {
actor.gainMp(変化量);
});
こんな感じで3つ記述してました。$gameParty.members().forEach(function(actor) {
this.changeHp(actor, -Math.floor(actor.mhp * 0.75), true);
}.bind(this));
$gameParty.members().forEach(function(actor) {
actor.gainMp(-Math.floor(actor.mmp * 0.3));
});
おかげさまで自分のやりたいことが出来ました!ここまで分かっていらっしゃるのであれば、話は簡単ですね!
固定値でのHPの増減と、割合でのHPの増減とを比べると、
固定値の「変化量」のところが「-Math.floor(actor.mhp * 0.75)」になっているのが分かります。
「-Math.floor(actor.mhp * 0.75)」の意味は、アクターの最大HP(mhp)に0.75を掛けて(75%の意味)、
Math.floorで小数点以下を切り捨てて整数にして、減らすのでマイナス(-)を付けています。
つまり、変化量を固定値の代わりに、そのアクターの最大HPの75%にあたる量の計算式に変えているわけです。
MPもこれと同様に、固定値でのMPの増減の「変化量」のところを「最大MPの何%」を求める計算式に変えればOKです。
最大HPはmhp=MaxHPなので、最大MPはMaxMP=mmpです。
したがって、例えば最大MPの30%を減らしたければ、
と書けばOKです。JavaScript:$gameParty.members().forEach(function(actor) { actor.gainMp(-Math.floor(actor.mmp * 0.3)); });
あたりに着目して見てみると、いろいろ応用しやすくなるのではと思います!
- HP・MPを割合で減らすとはどういうことか(→最大HP/MPの○%に当たる量を計算してその分だけ減らす)
- 固定値での増減と割合での増減とのスクリプトの違いはどこか
- HPの増減とMPの増減とのスクリプトの違いはどこか
- スクリプトのそれぞれの部分は何をやっているのか