防御成功時の効果について

サイガ
記事: 4
登録日時: 2016年10月24日(月) 22:55

防御成功時の効果について

投稿記事by サイガ » 2016年10月31日(月) 00:42

現在ツクールVXaceでゲーム制作をしております。

敵の攻撃を受けた時、その攻撃対象が防御状態(防御ステートにかかっている)だった場合、
攻撃側と防御側に特定のステートを与えるような処理を組み込みたいです。
(例:味方Aが防御ステートにかかってる状態の時、敵Bの攻撃を受けると、
敵Bはスタンのステートになり、味方Aは攻撃力がUPしたステートにかかる)

恐らく実現するとすればスクリプトをいじることになるのでしょうが、
その辺の知識や技術が足りないのでどうにも独力では実装できません。
どなたかご協力いただけないでしょうか。

faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 防御成功時の効果について

投稿記事by faida » 2016年11月04日(金) 20:23

まずは防御状態の判定がどうなっているか確認しましょうか。
スクリプト内を「防御」で全体検索すると、この部分が見つかるはずです。

コード: 全て選択

  #--------------------------------------------------------------------------
  # ● 防御修正の適用
  #--------------------------------------------------------------------------
  def apply_guard(damage)
    damage / (damage > 0 && guard? ? 2 * grd : 1)
  end
ここから、「guard?」で防御状態かどうかの判別ができるということが分かります。

さて、実際に攻撃側/防御側にステートを付加するにはどうしたら、という部分ですが、
この「防御修正の適用」内では攻撃側のデータが取得できません。
なので、スキル等を使用した際の処理を見てみましょう。

コード: 全て選択

  #--------------------------------------------------------------------------
  # ● スキル/アイテムの効果適用
  #--------------------------------------------------------------------------
  def item_apply(user, item)
    @result.clear
    @result.used = item_test(user, item)
    @result.missed = (@result.used && rand >= item_hit(user, item))
    @result.evaded = (!@result.missed && rand < item_eva(user, item))
    if @result.hit?
      unless item.damage.none?
        @result.critical = (rand < item_cri(user, item))
        make_damage_value(user, item)
        execute_damage(user)
      end
      item.effects.each {|effect| item_effect_apply(user, item, effect) }
      item_user_effect(user, item) # <= ここ
    end
  end
今回はここを使いましょう。「item_user_effect」で全体検索をすると、こちらが出てきます。

コード: 全て選択

  #--------------------------------------------------------------------------
  # ● スキル/アイテムの使用者側への効果
  #--------------------------------------------------------------------------
  def item_user_effect(user, item)
    user.tp += item.tp_gain * user.tcr
  end
ちょうど良く使用者側(攻撃側)への効果と出てきます。
後は適当にadd_state(id)でステートを付加しましょう。

コード: 全て選択

  def item_user_effect(user, item)
    user.tp += item.tp_gain * user.tcr
    if guard? # 追加
      user.add_state(B) # 攻撃側のステート
      self.add_state(A) # 防御側のステート
    end
  end
基本はこんなところですかね。

おそらく、これ以上に条件が必要になるでしょうから、適当に小ネタでも出しておきます。
item.is_a?(RPG::Skill) # スキルかどうかの判別
user.actor != self.actor? # 敵味方が分かれているかどうかの判別
(「攻撃者がアクターかどうか」が、「防御側がアクターかどうか」と異なるかどうかの判別)
self.result.hp_damage > 0 # HPダメージを1でも受けたかどうか
……実際にどう組めばいいのかわからない場合は、また質問してください。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
サイガ
記事: 4
登録日時: 2016年10月24日(月) 22:55

Re: 防御成功時の効果について

投稿記事by サイガ » 2016年11月07日(月) 20:29

faida様、ご丁寧な解説ありがとうございます。

ご指導いただいた方法を元にスクリプトをいじってはみましたが、どうにも上手くいきません。
(AとBで設定したステートがどちらも防御側に適用されているみたい?)
具体的な実装方法を教えていただけないでしょうか。よろしくお願いいたします。
faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 防御成功時の効果について

投稿記事by faida » 2016年11月07日(月) 22:06

先に提示した通り組むと、「防御」した時に条件を満たしてしまいます。(「攻撃側」と「防御側」が同じため)
なので、if文を増やして回避しましょう。

コード: 全て選択

  def item_user_effect(user, item)
    user.tp += item.tp_gain * user.tcr
    if guard?
      if self != user # 「攻撃側」が自身(「防御側」)でなければ
        user.add_state(B)
        self.add_state(A)
      end
    end
  end
また、「and」で条件文をつなぐこともできます。

コード: 全て選択

  def item_user_effect(user, item)
    user.tp += item.tp_gain * user.tcr
    if guard? and self.actor? != user.actor? # 「攻撃側」が味方でなければ
      user.add_state(B)
      self.add_state(A)
    end
  end
さらに、「and」は「&&」で置き換えることもできます。

コード: 全て選択

  def item_user_effect(user, item)
    user.tp += item.tp_gain * user.tcr
    if guard? && self.result.hp_damage > 0 # 受けたダメージが1以上であれば
      user.add_state(B)
      self.add_state(A)
    end
  end
(厳密には異なるものですが、とりあえず置き換えることができるものであるとさせてください)
基本的には使いやすいものを使用してください。(どの追加方法でも同じ条件文を使用できます)

※今更ながら、「self.actor? != user.actor?」の代わりに「self.opposite?(user)」が使えることが分かったので追記しておきます。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。

“VX / Ace:質問” へ戻る