ページ 11

【解決】RegeneFlat.js導入時のポップアップ不具合について

Posted: 2020年12月06日(日) 20:36
by ksk
いつも大変お世話になっております。

まっつUP様製作の『RegeneFlat.js』(バージョン1.02、絶対値のDOTダメージを設定プラグイン)を導入し、
ターン終了時にMPを固定値で回復させる仕様を実装しております。

regenempのパラメーターをステートの10番に設定し、ステート名を『MP再生』と表記、
あとは装備やアクターの特徴欄などに、ステート有効度『MP再生1%』と設定することで、
ターン終了時にMPを固定値で1回復させておりました。

しかしながら、特定の条件でMP回復時のポップアップがおかしくなることがあります。
1例を挙げますと、例えばアクターの特徴欄にステート有効度『MP再生1%』を6項目設定し、
ターン終了時にMPを6回復させようとすると、ポップアップの表示が『6 0000000000000000…』となります。
なお、『MP再生1%』の重複が5個までの場合は正常に『5』と表示され、
重複が7個の場合は表示が『7 0000000000000000…』となります。
なお、MPの回復自体は正常に動作しているようで、表示のみおかしくなります。

上ポップアップの不具合がなぜ生じるのか、また改善方法をご存知の方がいましたら教えて頂けないでしょうか。

ちなみにですが、上記の現象は新規プロジェクトで『RegeneFlat.js』のみ導入した際にも確認しております。
また参考になるか分かりませんが、私が普段使用しているポップアップ表示変更プラグイン、
『VE_DamagePopup.js』の環境下ですと、表示が『6N000000000000…』となります。

Re: RegeneFlat.js導入時のポップアップ不具合について

Posted: 2020年12月08日(火) 19:50
by ecf5DTTzl6h6lJj02
こんばんは。
ksk さんが書きました:いつも大変お世話になっております。

まっつUP様製作の『RegeneFlat.js』(バージョン1.02、絶対値のDOTダメージを設定プラグイン)を導入し、
ターン終了時にMPを固定値で回復させる仕様を実装しております。

regenempのパラメーターをステートの10番に設定し、ステート名を『MP再生』と表記、
あとは装備やアクターの特徴欄などに、ステート有効度『MP再生1%』と設定することで、
ターン終了時にMPを固定値で1回復させておりました。

しかしながら、特定の条件でMP回復時のポップアップがおかしくなることがあります。
1例を挙げますと、例えばアクターの特徴欄にステート有効度『MP再生1%』を6項目設定し、
ターン終了時にMPを6回復させようとすると、ポップアップの表示が『6 0000000000000000…』となります。
なお、『MP再生1%』の重複が5個までの場合は正常に『5』と表示され、
重複が7個の場合は表示が『7 0000000000000000…』となります。
なお、MPの回復自体は正常に動作しているようで、表示のみおかしくなります。

上ポップアップの不具合がなぜ生じるのか、また改善方法をご存知の方がいましたら教えて頂けないでしょうか。

ちなみにですが、上記の現象は新規プロジェクトで『RegeneFlat.js』のみ導入した際にも確認しております。
また参考になるか分かりませんが、私が普段使用しているポップアップ表示変更プラグイン、
『VE_DamagePopup.js』の環境下ですと、表示が『6N000000000000…』となります。
HP再生率や、MP再生率などの %で設定される項目は、内部的には、浮動小数点で値が設定されています。
この浮動小数点は、2進数で表現する性質上、どうしても正確に表現できず、微小な誤差が生じることがあります。(丸め誤差と呼ばれています)
表示するうえでは、この誤差部分が、微小であるために、切り捨てられて、正しく表示される(ように見えている)ことがほとんどですが、計算をしていくうちに、この誤差が積み重なって、切り捨てられない部分に到達してしまうことがあります。
今回、このケースに引っ掛かり、計算結果が 6.000000000000001 や 7.000000000000001 になってしまうので、
ポップアップがおかしくなっています。

対策として、RegeneFlat.jsに対して次の変更を行ってください。

丸め誤差の対策として、76行目付近にある

コード: 全て選択

return this.traitsSum(Game_BattlerBase.TRAIT_STATE_RATE, stateId);

コード: 全て選択

// 丸め誤差対策として、小数点第1位まで有効にして、切り捨てる。
// (%で設定する項目が小数点第1まで有効なので)
return Math.floor(this.traitsSum(Game_BattlerBase.TRAIT_STATE_RATE, stateId) * 1000) / 1000;
に変更する。

小数点第1位まで有効にしているので、計算結果が整数にならない場合があるため、整数に直す処理を入れます。

コード: 全て選択

value += this.stateRate(RFregenehp) * minus;
及び

コード: 全て選択

value += this.stateRate(RFregenemp) * minus;
の下に次のコードを追加します。

コード: 全て選択

value = Math.trunc(value);
おそらく、これで正しく表示されるようになるのではないかと思います。

Re: RegeneFlat.js導入時のポップアップ不具合について

Posted: 2020年12月08日(火) 21:36
by ksk
ecf5DTTzl6h6lJj02 様

早速の返答ありがとうございます。
また、非常に分かりやすい解説も添えて下さり恐縮です。

プラグインをご指摘いただいた通り修正したところ、正常に整数で表示されるようになりました。
本当にありがとうございました。