【RGSS3】ダメージ0でも解除されるステート

せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

【RGSS3】ダメージ0でも解除されるステート

投稿記事by せくもん » 2019年8月11日(日) 21:25

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

現在製作中のゲームでタンク役のスキルを充実させる為に下記の様なスキルを制作しました。

『スーパーガード』はかばうの上位互換で味方の身代わりをしつつ
物理ダメージ率0%、魔法ダメージ率0%で必中攻撃以外を完全にシャットアウトします。
『マルチカウンター』は反撃と魔法反射を併せ持ったスキルで
必中攻撃以外を無効化し、カウンター攻撃を仕掛けます。

どちらもそのままでは強力過ぎるので、かばう・反撃・魔法反射との差別化を考えて
一度スキルが発動したらステートを解除する仕様にしたいのですが
『ダメージで解除』のチェックを入れても、そもそもダメージを受けていないので解除出来ません。

継続ターン数経過前でも、一度スキルが発動した時点で『ダメージで解除』と同様に
ステートを解除させるには、どの様にしたら良いのでしょうか?

アバター
まっつUP
記事: 1155
登録日時: 2016年8月11日(木) 15:38
お住まい: タケノコ王国

Re: 【RGSS3】ダメージ0でも解除されるステート

投稿記事by まっつUP » 2019年8月11日(日) 22:39

せくもん様
スクリプトエディタ中で
on_damage(@result.hp_damage) if @result.hp_damage > 0
を検索して該当した行のif @result.hp_damage > 0をif @result.hp_damage >= 0すれば
ダメージが0の時でもダメージ時のステート解除判定が処理されます。
コメントアウトしてしまう場合は回復時にも処理されるので注意してください。

バリア系のスクリプトは探せばありそうなので
この方法で不満がある場合は探してみてもよいと思います。
僕はそんな時間はかけてませんが、見つけられませんでした。
RPGで笑顔を・・・

ツイッター(ツクラーの巣窟)(閲覧は自己責任でお願いします)
https://twitter.com/mattuup

github
https://github.com/mattuup/RPGMakerMZ
u-kun
記事: 17
登録日時: 2018年4月11日(水) 01:40

Re: 【RGSS3】ダメージ0でも解除されるステート

投稿記事by u-kun » 2019年8月12日(月) 00:49

単純にスーパーカードやマルチカウンターのステートを解除する効果をすべての攻撃スキルに持たせてはどうでしょうか。
「ダメージで解除」の条件に0ダメージを含めてしまうと、今後0ダメージでは解除したくないステートが登場した時に面倒なことになりそうです。
ecf5DTTzl6h6lJj02
記事: 447
登録日時: 2018年12月23日(日) 13:55

Re: 【RGSS3】ダメージ0でも解除されるステート

投稿記事by ecf5DTTzl6h6lJj02 » 2019年8月12日(月) 13:41

メモ欄に、ステート解除用の文字列を設定する形で、スクリプトを試作してみたので、
試してください。

コード: 全て選択

=begin
  #-------------------------------------------------------------------------
    ◆被攻撃時、反撃時、魔法反射時にステートを解除するスクリプト
  #-------------------------------------------------------------------------
    ステートのメモ欄に以下を記述することで、表題の動作を設定します。
   
    ※デフォルト時の文言です。
      文言は、文字列を設定するモジュールで、自由に変更できます。
     
    <0ダメージ解除>: ダメージを受けていなくても攻撃が命中した場合はステート解除。
                     相手がミスしたとき、プレイヤーが回避したときは解除しない。
                     『ダメージで解除』の項目が設定されている必要があるので注意。
    <反撃解除>     : 反撃時にステート解除
    <反射解除>     : 魔法反射時にステート解除
  #-------------------------------------------------------------------------
=end

if true     #スクリプトを有効にするならtrue
 
#-----------------------------------------------------------------------------
#  ■メモ欄に記述する文字列を設定するモジュール
#-----------------------------------------------------------------------------
module  Remove_Strings
  STR_REMOVE_DAMAGE0 = "<0ダメージ解除>"          #ノーダメージでも解除する文字列
  STR_REMOVE_COUNTER = "<反撃解除>"               #反撃時に解除する文字列
  STR_REMOVE_REFLECT = "<反射解除>"               #魔法反射時に解除する文字列
end

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● ダメージの処理
  #    呼び出し前に @result.hp_damage @result.mp_damage @result.hp_drain
  #    @result.mp_drain が設定されていること。
  #--------------------------------------------------------------------------
  def execute_damage(user)
    on_damage(@result.hp_damage) if @result.hp_damage >= 0    #ノーダメージを含める
    self.hp -= @result.hp_damage
    self.mp -= @result.mp_damage
    user.hp += @result.hp_drain
    user.mp += @result.mp_drain
  end
  #--------------------------------------------------------------------------
  # ● 被ダメージ時の処理
  #--------------------------------------------------------------------------
  def on_damage(value)
    if value > 0                    #ダメージあり?
      remove_states_by_damage       #通常のダメージでのステート解除
      charge_tp_by_damage(value.to_f / mhp)
    else
      remove_states_by_damage_0     #ノーダメージでのステート解除
    end     
  end
  #--------------------------------------------------------------------------
  # ● ダメージ 0 によるステート解除
  #--------------------------------------------------------------------------
  def remove_states_by_damage_0
    states.each do |state|
      #メモ欄にノーダメージでも解除する用の文字列が記述があり、
      #ダメージで解除』項目が設定されていて、
      #乱数の値(0~99)が、設定した%の数字を下回っている場合は解除
      state.note.each_line{ |line|
      if /^#{Remove_Strings::STR_REMOVE_DAMAGE0}(?![\S]).*/ =~ line &&
            state.remove_by_damage && rand(100) < state.chance_by_damage         
        remove_state(state.id)
      end }
    end
  end
  #--------------------------------------------------------------------------
  # ● 反撃によるステート解除
  #--------------------------------------------------------------------------
  def remove_states_by_counter
    states.each do |state|
      #メモ欄に反撃時解除用の文字列が記述されているなら解除
      state.note.each_line{ |line|
          remove_state(state.id) if /^(#{Remove_Strings::STR_REMOVE_COUNTER})(?![\S]).*/ =~ line }
    end       
  end
  #--------------------------------------------------------------------------
  # ● 魔法反射によるステート解除
  #--------------------------------------------------------------------------
  def remove_states_by_reflection
    states.each do |state|
      #メモ欄に魔法反射時解除用の文字列が記述されているなら解除
      state.note.each_line{ |line|
          remove_state(state.id)  if /^(#{Remove_Strings::STR_REMOVE_REFLECT})(?![\S]).*/ =~ line  }
    end
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 反撃の発動
  #--------------------------------------------------------------------------
  alias invoke_counter_attack_o invoke_counter_attack
  def invoke_counter_attack(target, item)
    invoke_counter_attack_o(target, item)
    target.remove_states_by_counter     
  end
  #--------------------------------------------------------------------------
  # ● 魔法反射の発動
  #--------------------------------------------------------------------------
  alias invoke_magic_reflection_o invoke_magic_reflection
  def invoke_magic_reflection(target, item)
    invoke_magic_reflection_o(target, item)
    target.remove_states_by_reflection
  end
end

end


なお、マルチカウンター用の、反撃、及び、魔法反射のステートは本来のものとは別に作成することを推奨します。

追記:
文字列判定をしている部分を変更しましたので、差し替えてください。
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 【RGSS3】ダメージ0でも解除されるステート

投稿記事by せくもん » 2019年8月12日(月) 21:54

皆様、ご返答ありがとうございます。

ecf5DTTzl6h6lJj02さんの作られたスクリプトを導入した所、無事想定通りの仕様に出来ました。
まっつUPさん、u-kunさんの方法も試したのですが『スーパーガード』に関してはステート解除出来るのですが
どうやらツクールの仕様で反撃や反射ではresult.hp_damageは発生しないらしく
『マルチカウンター』の方ではステートを解除する事が出来ないみたいです。
とはいえ、ご意見をいただけた事には感謝いたします。ありがとうございました。


>まっつUPさん
バリア系のスクリプトを探しているとの事ですが、自分は素材サイトに関してはあまり詳しくないので
とりあえず、検索して出てきた物を見繕ってみました。

バリア&対バリアシステム
[url]
http://artificialprovidence.web.fc2.com ... S3B_AB.txt
[/url]

耐久力のあるバリア
[url]
https://faida.wiki.fc2.com/wiki/%E8%80% ... A%E3%82%A2
[/url]

一定以下のダメージを無効化(ツクマテ内のトピックです)
[url]
viewtopic.php?t=4043
[/url]

単純に物理や魔法のダメージを0にしたいだけでしたら弊トピックでの『スーパーガード』は
デフォルトの特殊能力値である物理ダメージ率、魔法ダメージ率を0%に設定するだけで
スクリプトの導入無しに簡単に再現出来ますので参考になさって下さい。

“VX / Ace:質問” へ戻る