【解決済み】スクリプトでパーティーメンバーのHP・MPを%分増やしたり、減らしたりする方法が知りたいです

Maker-VX

ユーザー
いつもお世話になっております。
HP・MPの増減をイベントコマンドでやるよりも楽なことがあるので、稀にスクリプトで記述しています。

そこで質問なのですが、パーティーメンバーのHP・MPを「%」で増減する場合はどのように記述すればよいか
どなたかお教えいただけないでしょうか(パーティーメンバーのMPを30%減らすとかをやりたい)
固定値の増減は調べたらわかりましたが、%の場合は調べても分かりませんでした……

以上、よろしくお願いいたします。
 
プラグインということは、gainHp はご存知ですよね。まずは以下の式が基本になります。
JavaScript:
const rate = 50;
actor.gainHp(actor.mhp * rate / 100);
これは、rate つまり 最大HPを50%回復することになります。

これをもとに見て行きましょう。

具体的には、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);
  };
})();

上記をプラグインにして試してみてください。
 

Maker-VX

ユーザー
プラグインということは、gainHp はご存知ですよね。まずは以下の式が基本になります。
JavaScript:
const rate = 50;
actor.gainHp(actor.mhp * rate / 100);
これは、rate つまり 最大HPを50%回復することになります。

これをもとに見て行きましょう。

具体的には、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の増減をスクリプトで行いたいので
その記述を知りたいという質問でした。

$gameParty.members().forEach(function(actor) {
this.changeHp(actor, -Math.floor(actor.mhp * 0.5), true);
}.bind(this));

↑のスクリプトでパーティーメンバーのHPを割合で減らせるのは分かりましたが、MPを割合で減らす方法が分からないです。
この辺の知識はないに等しいので、また変なことを言ってしまっていたらすみません。
もし、よろしければご教授いただけないでしょうか。
 

panda

ユーザー
HPやMPを割合で減らすといっても、別に特殊なことをやっているわけではなくて、
単に最大HP・最大MPの何%に当たる量を計算して、固定値の代わりにその量を増減しているだけです。

スクリプトで固定値を増減させる方法が分かっているのであれば、
その固定値のところに、代わりに最大HP・最大MPの何%に当たる量の計算式を書けばOKです。
ただし、量は整数でないといけないので、Math.floorやMath.ceil、Math.roundなどで切り捨て・切り上げ・四捨五入いずれかをしてやる必要があります。

ちなみに、固定値の増減は調べたら分かったとのことですが、
現状どのように書いているのかを記載してもらった方が、こちらとしても答えやすいかなと思います。
スクリプトの書き方は一通りではなく、既存の書き方があるならそれに沿って教えた方が分かりやすいためです。
 

Maker-VX

ユーザー
HPやMPを割合で減らすといっても、別に特殊なことをやっているわけではなくて、
単に最大HP・最大MPの何%に当たる量を計算して、固定値の代わりにその量を増減しているだけです。

スクリプトで固定値を増減させる方法が分かっているのであれば、
その固定値のところに、代わりに最大HP・最大MPの何%に当たる量の計算式を書けばOKです。
ただし、量は整数でないといけないので、Math.floorやMath.ceil、Math.roundなどで切り捨て・切り上げ・四捨五入いずれかをしてやる必要があります。

ちなみに、固定値の増減は調べたら分かったとのことですが、
現状どのように書いているのかを記載してもらった方が、こちらとしても答えやすいかなと思います。
スクリプトの書き方は一通りではなく、既存の書き方があるならそれに沿って教えた方が分かりやすいためです。
色々とお教えいただきありがとうございます。
固定値の増減はこちらのサイトを参考にしまして

HPの増減は
$gameParty.members().forEach(function(actor) {
this.changeHp(actor, 変化量, true);
}.bind(this));

MPの増減は
$gameParty.members().forEach(function(actor) {
actor.gainMp(変化量);
});

割合でのHPの増減はこちらのサイトを参考にして
$gameParty.members().forEach(function(actor) {
this.changeHp(actor, -Math.floor(actor.mhp * 0.75), true);
}.bind(this));
こんな感じで3つ記述してました。
 

panda

ユーザー
ここまで分かっていらっしゃるのであれば、話は簡単ですね!

固定値での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%を減らしたければ、
JavaScript:
$gameParty.members().forEach(function(actor) {
  actor.gainMp(-Math.floor(actor.mmp * 0.3));
});
と書けばOKです。
  • HP・MPを割合で減らすとはどういうことか(→最大HP/MPの○%に当たる量を計算してその分だけ減らす)
  • 固定値での増減と割合での増減とのスクリプトの違いはどこか
  • HPの増減とMPの増減とのスクリプトの違いはどこか
  • スクリプトのそれぞれの部分は何をやっているのか
あたりに着目して見てみると、いろいろ応用しやすくなるのではと思います!
 

Maker-VX

ユーザー
ここまで分かっていらっしゃるのであれば、話は簡単ですね!

固定値での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%を減らしたければ、
JavaScript:
$gameParty.members().forEach(function(actor) {
  actor.gainMp(-Math.floor(actor.mmp * 0.3));
});
と書けばOKです。
  • HP・MPを割合で減らすとはどういうことか(→最大HP/MPの○%に当たる量を計算してその分だけ減らす)
  • 固定値での増減と割合での増減とのスクリプトの違いはどこか
  • HPの増減とMPの増減とのスクリプトの違いはどこか
  • スクリプトのそれぞれの部分は何をやっているのか
あたりに着目して見てみると、いろいろ応用しやすくなるのではと思います!
おかげさまで自分のやりたいことが出来ました!
分かりにくい質問にも関わらず、お付き合いくださり感謝の極みですm(_ _"m)
自分もまだまだ勉強不足だと感じたので、次はもっと分かりやすい質問を心がけたいですね。

では、本件を「解決済み」とさせていただきます。
神無月サスケ様、panda様、コメント本当にありがとうございました!
 
トップ