【解決済み】nダメージを受けたとき装備中の特定の装飾品を別の装飾品に変化させる方法

アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

【解決済み】nダメージを受けたとき装備中の特定の装飾品を別の装飾品に変化させる方法

投稿記事by ドラムカン » 2021年5月18日(火) 01:42

いつもお世話になります。

具体的には、
ダメージを受けたアクターが特定の装飾品を装備していたとき、その装飾品の守備力を取得して
ダメージ量と比較し、上回っていれば、n%の確率で、そのダメージを無効化する代わりに
別IDの装飾品(固定)と差し替える、という処理の実現方法を模索しております。

戦闘中にそのような複雑な条件処理を行うには、プラグインを利用する他ないものの
既存のプラグインに実現できそうなものが存在しないため、何とか一から作ろうと考えたのですが
はじめの一歩である「アクターがダメージを受けた時の処理」のクラスさえ、
リファレンスを見てもよく分からない有様です。

とても基本的な部分かとは思うのですが、どうfunctionを定義すればよいか
ご教示くださる奇特な方がいらっしゃることを願って、どうかお願い申し上げます。
最後に編集したユーザー ドラムカン on 2021年5月19日(水) 14:52 [ 編集 1 回目 ]

アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: nダメージを受けたとき装備中の特定の装飾品を別の装飾品に変化させる方法

投稿記事by Plasma Dark » 2021年5月18日(火) 04:47

ひとまず、関連するコードは Game_Action.prototype.apply です。
命中回避判定、ダメージ計算、ダメージ処理を全て行っています。

どういうコードを書くべきかは、実現したい内容の詳細によって決まるのでまだはっきり言えません。

- ダメージを無効にした後、どんな表示にするか
- ダメージを無効にした場合、追加効果も無効にすべきか

まず最低限この辺りを決めて、それからコードを読みつつ実現方法を考えることになると思います。

戦闘関連の独自システムは考えることが多くて大変ですが、頑張ってください。
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: nダメージを受けたとき装備中の特定の装飾品を別の装飾品に変化させる方法

投稿記事by ドラムカン » 2021年5月18日(火) 09:34

Plasma Dark 様

いつもお世話になっております。
貴重な情報をご提供くださり、本当にありがとうございます。

ご質問いただきました点について、僭越ながらご回答させていただきます。

- ダメージを無効にした後、どんな表示にするか
◇ダメージを無効化した際、SEを鳴らし、
 戦闘メッセージに「[装飾品名]が壊れた![装飾品名]は[別の装飾品名]になった!」
 と表示させたいと考えております。

- ダメージを無効にした場合、追加効果も無効にすべきか
◇いえ、追加効果のダメージは入るようにしたいと考えております。
 例えば、連撃の1発目でダメージを無効化したら、その装飾品は壊れた扱いになるため
 2発目はダメージが通る、といった動作を理想としております。
 元の装飾品には守備力がありますが、変化後の装飾品には守備力がなく、
 ダメージ量が増加するというイメージです。

ひとまず、ご教示いただきました Game_Action.prototype.applyについて
読み込んでみたいと思います。
アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: nダメージを受けたとき装備中の特定の装飾品を別の装飾品に変化させる方法

投稿記事by Plasma Dark » 2021年5月18日(火) 12:09

◇いえ、追加効果のダメージは入るようにしたいと考えております。
 例えば、連撃の1発目でダメージを無効化したら、その装飾品は壊れた扱いになるため
 2発目はダメージが通る、といった動作を理想としております。


追加効果という書き方が誤解を生んでしまったかもしれません。
決めておきたいのは、ダメージを無効にした際に、スキルの使用効果(毒ステート付与など)まで無効にすべきか、ということです。

どちらにしても難しいわけではありませんが、書くべきコードは変わってきます。

そして、プラグインを書くのに不慣れであれば、まずはもうちょっと簡単な仕様で書いてみることをオススメします。

例えば、
- アクターがスキルによる攻撃を受ける際、一定確率でダメージを無効にする。
- ダメージを無効にしても、スキルの追加効果は無効にしない。
- ダメージを無効にしても、スキル使用者のTPは増加する。
という内容を先に実装してみるとか。

装備の変化はこれに後付でコードを追加して実現できそうな気がします。

私が実装するとしたら、以下の方針で実装します。
- Game_ActionResult に装飾品によるダメージ無効を表すフラグを追加する。
- ダメージ計算後、ダメージ処理前に無効化判定を行い、無効化する場合にダメージの値を0にするか、ダメージ処理を行わない。
- Window_BattleLog.prototype.displayDamage でダメージ無効フラグを参照し、専用の表示を行う。
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: nダメージを受けたとき装備中の特定の装飾品を別の装飾品に変化させる方法

投稿記事by ドラムカン » 2021年5月18日(火) 13:26

Plasma Dark 様

開発のヒントを与えてくださり、重ね重ねありがとうございます。

追加効果という書き方が誤解を生んでしまったかもしれません。
決めておきたいのは、ダメージを無効にした際に、スキルの使用効果(毒ステート付与など)まで無効にすべきか、ということです。


解釈を誤っていたようで、誠に申し訳ございません。
元の装飾品は、言うなれば防弾チョッキのようなものですので
毒などのステートは防げないため、すべての使用効果の無効判定は考慮いたしません。
あくまで、直接攻撃やスキルのHPダメージに対して判定が行われる仕様になります。

Game_ActionResultでは、装飾品の判定まで可能なのでしょうか?
リファレンスを見る限りですと、装備を扱うオブジェクトが見当たらず
.hpDamageを取ってダメージ量をみることくらいしかできないのかと考えておりました。

また、被ダメージ量は、.makeDamageValueのapplyVariance (damage, variance)で取るよりも
前述の.hpDamageで取るべきなのでしょうか?

初歩的なご質問となり、申し訳ございません。
よろしければ、ご教示いただけますと幸いです。
アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: nダメージを受けたとき装備中の特定の装飾品を別の装飾品に変化させる方法

投稿記事by Plasma Dark » 2021年5月18日(火) 15:51

Game_ActionResultでは、装飾品の判定まで可能なのでしょうか?
リファレンスを見る限りですと、装備を扱うオブジェクトが見当たらず
.hpDamageを取ってダメージ量をみることくらいしかできないのかと考えておりました。


Game_ActionResult は、戦闘におけるバトラーが受けた行動の結果を表すクラスです。
Window_BattleLog はこの結果を参照してアニメーションやメッセージを表示しています。
今回は装飾品によるダメージ無効化が発生した場合にSEやメッセージの演出があるということなので、それを表すフラグを Game_ActionResult に追加するのが筋が良いだろう、という判断です。

Game_Action.prototype.apply のコードをお読みいただければわかるように、 result.miss 等の行動の結果をここで計算して代入しています。
これらと同じように、例えば result.disableDamangeByEquip などという名前でフラグを追加することになると思います。

判定自体を行うのは makeDamageValue か executeDamage か、その辺りになるんじゃないでしょうか。

また、被ダメージ量は、.makeDamageValueのapplyVariance (damage, variance)で取るよりも
前述の.hpDamageで取るべきなのでしょうか?


Game_ActionResult インスタンスの持つ hpDamage は、HPの増減が行われる際にその結果としてセットされます。この意味を不用意に歪めるべきではありません。
(最初は意味も何もわからないと思いますので、その値が使われている箇所を探して読んでみてください)
この値がセットされている状態は、すなわちHPの増減が確定している状態であるべきです。
ダメージ無効化の発動判定を行う際にこの値を参照するにはかなり歪なことをしなければならないでしょう。まともなコーダーなら今回の目的でこの値を使うことはありません。

applyVariance はその名の通り、ダメージ計算において分散を適用するメソッドです。
makeDamageValue の処理を読むと、その後に防御コマンドによるダメージカットが計算されています。
プラグインによってはその後の最終ダメージに何かしら補正をかけていることもあるかもしれません。

どの段階のダメージを判定のために参照するかは仕様次第ですが、 makeDamageValue の戻り値か、 executeDamage の引数を参照するのがわかりやすいと思います。(基本的に、両者は一致するはずです)
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: nダメージを受けたとき装備中の特定の装飾品を別の装飾品に変化させる方法

投稿記事by ドラムカン » 2021年5月18日(火) 16:40

Plasma Dark 様

とても丁寧にご説明くださって、誠にありがとうございます。

現段階の私の理解度ですと、
Plasma Dark 様からご教示いただいた内容の数%しか理解できておりませんので
当該の情報がある程度、理解できるようになりましたら
再度、こちらにレスをつけさせていただこうかと思います。

自分が低レベル過ぎて泣けてきますが
せっかくいただいた貴重な情報ですので、必ず目標を達成したいと考えております。

お気が向きましたら
引き続き、どうかよろしくお願いいたします。
アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: nダメージを受けたとき装備中の特定の装飾品を別の装飾品に変化させる方法

投稿記事by Plasma Dark » 2021年5月18日(火) 23:37

装飾品の防御力に応じてHPダメージを確率で無効にするプラグインのサンプルを書きました。
https://gist.github.com/elleonard/44634ed10aba328ffaff5bf89c5b1cc0

あくまでこれはサンプルなので、装飾品の差し替えやSE再生の処理は入っていません。
このサンプルを積極的にメンテナンスする意思もないことをご了承ください。

このコードが、理解の補助になってくれれば幸いです。
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: nダメージを受けたとき装備中の特定の装飾品を別の装飾品に変化させる方法

投稿記事by ドラムカン » 2021年5月19日(水) 14:22

Plasma Dark 様

ああ……なんて素晴らしい。
骨組みどころか、あと一歩のところまで記述してくださるなんて、何とお礼を申し上げればよいやら……。

このコード分量や内容は、今の私にとって最良の教材です。
本当に本当にありがとうございます。

あとはもうSEの追加と装飾品の差し替え処理、
それから、装飾品を装備しているかどうかや、
その装飾品が壊れる装飾品かどうかmetaを参照して判定させれば完成です。

基本的に、適切なクラスさえ宣言されていれば、その内処理は、
デバッグを重ねれば何とか自力でも答えにたどり着けるのですが
難しいのは、その処理をどのクラスのどこに書けばいいのか分からないという点です。
その骨組みの構築には、ツクールのクラスやオブジェクトの深い理解が必要で、一番の壁になっております。

「この処理はこのクラスのこのオブジェクトを使うんだな」と、
すぐに脳内で紐づけができれば解決する問題ではありますが、
言うは易く行うは難しとはよく言ったもので
いただいたコードを一から自分で書けるようになるまで、一体何年かかるか分かりません。

今回は、Plasma Dark様のお力添えのおかげで自分の欲していた機能を具現化できそうですが
有識者に頼らなければ実現できない今の状況を、早く打開したい限りです。

それと一点、修正箇所を見つけましたので、コード編集いたしました。

【修正前】

コード: 全て選択

    if (this.accessoryDef() < damageValue) {


【修正後】

コード: 全て選択

    if (this.accessoryDef() > damageValue) {


装飾品の守備力よりダメージが大きい場合、破損判定の確率を返す部分で
大なり小なりの条件を変更させていただきました。

本件につきまして、改めて心からお礼申し上げます。
いただいたコードをどれほど欲していたことか、本当にありがとうございました。

“MV:質問” へ戻る