【解決済み】攻撃を受けないようにしたい

ふちさ
記事: 3
登録日時: 2024年5月04日(土) 05:31

【解決済み】攻撃を受けないようにしたい

投稿記事by ふちさ » 2024年5月21日(火) 00:19

こんにちは。ツクールMZの戦闘についての質問です。
戦闘の際に攻撃を全く受けなくなる状態を作りたいと考えております。
ダメージ無効というよりは戦闘不能と同じで、全体攻撃の範囲にすら入らないのをイメージしています。
良い方法があれば教えてください!
最後に編集したユーザー ふちさ on 2024年5月24日(金) 00:39 [ 編集 2 回目 ]

アバター
くろうど
記事: 279
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡を取る:

Re: 攻撃を受けないようにしたい

投稿記事by くろうど » 2024年5月22日(水) 02:03

なぜダメージ無効ではダメなのかなど、その他詳細な要件が分かりませんが、

スキル効果の「逃げる」を使えば1キャラずつ戦闘から離脱できるので、各種効果の対象にならなくなります。
ある意味で戦闘不能と同じです。

FF6の鼻息みたいな効果を求めているのであれば、これで実現できるかもしれません。

この要件ではない場合は分かりません。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
ふちさ
記事: 3
登録日時: 2024年5月04日(土) 05:31

Re: 攻撃を受けないようにしたい

投稿記事by ふちさ » 2024年5月22日(水) 04:58

言葉足らずで申し訳ありません。
ドラクエの石化のような、とある状態異常にかかると敵から無視されるような状況を想像しておりました。その為に攻撃を受けるとなんか不自然な気がしまして。
もしくは戦闘不能から復帰出来なくなるような、そこにいるけどその戦闘中にはもう存在しないといった形にしたいと思っておりました。
すおう
記事: 38
登録日時: 2024年5月17日(金) 08:30

Re: 攻撃を受けないようにしたい

投稿記事by すおう » 2024年5月22日(水) 21:25

あるかわかりませんが新たにプラグインを導入しない方向で方法を考えてみました。

まず攻撃を受けない状態のステートが『石化』だとして
単体攻撃は狙われ率を*0%にすれば個人に攻撃は来ないと思います
全体攻撃はどうしてもくるのですべての属性有効度を*0%にしてしまうのはどうでしょうか
『○○はダメージを受けなかった』表記は出ますが、まあ全体攻撃だし、
石化してても当たるということで・・・(だめ?)

これでOKかと思ったのですが、問題は石化した人以外が死亡したときです。
石化が時間で解けるなら放置すればよいですが、そうでなければ永遠に戦闘が続きます。
そこで『パーティ全員が死んでいるか石化しているときゲームオーバーになる』コモンイベントを作ります
このコモンイベントを例えばターン終了時に動かして条件に合えばゲームオーバーにしてしまえばいいわけです

さてこのコモンイベントをどう作るかですが、キャラクター1人1人の状態を条件分岐で
分別するのは骨が折れるので、ここはスクリプトを使います

まずパーティの生存者数をカウントします。以下のスクリプト結果を変数に代入してください
$gameParty.aliveMembers().length

次にパーティの中で特定のステート(今回は石化)を持っているキャラの人数を計算します。
先ほどの変数から以下のスクリプトで『減算』してください
$gameParty.members().filter(member => member.isStateAffected(ステートのID)).length

これで変数が0以下であれば、動ける人がいなくなったわけでゲームオーバーの判定ができるようになります
なお検証したわけではないのでうまくいかなかったらごめんなさい
すおう
記事: 38
登録日時: 2024年5月17日(金) 08:30

Re: 攻撃を受けないようにしたい

投稿記事by すおう » 2024年5月22日(水) 21:54

一応、追加プラグインでのやり方も簡単には載せておきますが、
多少のプラグインの構造を理解している前提になります

要は全体攻撃のときに死亡状態のキャラは対象にしないという処理に他のステートIDを追加してしまえばいいのです
各キャラごとに戦闘不能状態かを判定しているのはこの関数です
rmmz_objects.js

コード: 全て選択

Game_BattlerBase.prototype.isDeathStateAffected = function() {
    return this.isStateAffected(this.deathStateId());
};


なのでこの基礎プラグインを書き換えればいいのですが直接書き換えるのは危ないので以下の関数を含んだ
追加プラグインを作ります

コード: 全て選択

const _Game_BattlerBase_isDeathStateAffected = Game_BattlerBase.prototype.isDeathStateAffected;
Game_BattlerBase.prototype.isDeathStateAffected = function() {
    return _Game_BattlerBase_isDeathStateAffected.apply(this, arguments) || this.isStateAffected(ステートID);
};


これで全体攻撃・単体攻撃の対象になることはなくなります
ただ、じゃあこのキャラを回復したり全体回復したり蘇生したりした場合どうなるのかという疑問が生じます
他にも生きているけど死んでいるような状態異常による想定外の処理が出てくる可能性があります
その辺どうなるのかわからないので検証が必要です。
ふちさ
記事: 3
登録日時: 2024年5月04日(土) 05:31

Re: 攻撃を受けないようにしたい

投稿記事by ふちさ » 2024年5月24日(金) 00:38

くろうど様、すおう様、返信ありがとうございます。
すおう様の案に従って検証した結果、理想に近いものが出来上がりました!
どうもありがとうございました!

“MZ:質問” へ戻る