反撃スキル

アバター
なたね
記事: 12
登録日時: 2017年1月11日(水) 00:34
連絡を取る:

反撃スキル

投稿記事by なたね » 2017年4月25日(火) 12:46

反撃行動を拡張するスクリプトを作って頂きたいです。
アクターによって、反撃時に防御したり、回復したり、アイテムを使用できるようにしていただきたいです。宜しくお願いします。

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

Re: 反撃スキル

投稿記事by faida » 2017年4月25日(火) 21:20

一つだけ。
デフォルトだと「反撃」する際は「相手の攻撃をキャンセル」するので、「反撃時に防御」ってやっても防御してくれません。
もう少し正確に言えば「攻撃に反応して防御や回復はするけど、攻撃がそもそも当たらないから防御や回復の意味があんまりない」
ってことです。
それでも大丈夫なんですかね。

ちなみに反撃時のスキルを通常攻撃以外にするならすぐできます。
まぁ対象が攻撃してきた敵になっちゃうんですけど。
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
アバター
なたね
記事: 12
登録日時: 2017年1月11日(水) 00:34
連絡を取る:

Re: 反撃スキル

投稿記事by なたね » 2017年4月25日(火) 22:09

faida様、そうでした。vxaceはダメージを受けないんでしたね。すっかり忘れていました。
ダメージを受けて防御や回復を行うと言うのは難しいんでしょうか?
faida
記事: 184
登録日時: 2015年12月17日(木) 16:44

Re: 反撃スキル

投稿記事by faida » 2017年4月27日(木) 22:27

なんかできたのでとりあえずどうぞ。

コード: 全て選択

=begin
◆概要
特殊な反撃を作成します。

◆機能
・メモ欄に<攻撃前反撃 a, b, c, ..., n%>と記入すると、敵の行動前にn%の確率で
a, b, c, ...のスキルのどれかを発動します。
・メモ欄に<攻撃後反撃 a, b, c, ..., n%>と記入すると、敵の攻撃後にn%の確率で
a, b, c, ...のスキルのどれかを発動します。
・メモ欄に<回避反撃 a, b, c, ..., n%>と記入すると、敵の攻撃後にn%の確率で
a, b, c, ...のスキルのどれかを発動します。
・a, b, c, ...を負にするとアイテムになります。
・メモ欄に<反撃スキル n>と記入すると、「通常の」反撃の際にIDnのスキルで反撃
します。アイテムは不可能です。
例:<攻撃後反撃 1, 50%> やられたらやり返すかもしれない
  <攻撃前反撃 2, 50%> やられる前に身を守るかもしれない
  <攻撃後反撃 -1, -2, -3, 100%> オートポーション

◆仕様
・攻撃前って書いてるけど攻撃じゃなくても反応します。
・味方には反撃しません。

◆使用上の注意
・★……エイリアス ●……再定義 ○……新規定義

◆作者:faida @faida3983

◆更新履歴
ver1.0 : 公開
ver1.1 : Ruby1.9に存在しないメソッドがあったので修正

=end

module FAI_CNT_EX
  # 設定項目:反撃スキルの機能を使う
  # 機能を切ることで競合が起こりにくくなったりするかもしれません。「かも」ですが。
  USE_CNT_SKL = false
  # 設定項目:魔法とか必中攻撃とかでも反撃する
  # 普通の反撃は魔法とか必中攻撃とかでは反撃できません。
  BEF_CNT_FOR_CERT = true
  HIT_CNT_FOR_CERT = true
  EVA_CNT_FOR_CERT = false
  BEF_CNT_FOR_MAG = true
  HIT_CNT_FOR_MAG = true
  EVA_CNT_FOR_MAG = false
 
  BEF_CNT = /<攻撃前反撃\s*(\-?\d+(?:\,\s*\-?\d+)*)\s*\,\s*(\d+)[%%]>/
  HIT_CNT = /<攻撃後反撃\s*(\-?\d+(?:\,\s*\-?\d+)*)\s*\,\s*(\d+)[%%]>/
  EVA_CNT = /<回避反撃\s*(\-?\d+(?:\,\s*\-?\d+)*)\s*\,\s*(\d+)[%%]>/
  CNT_SKL = /<反撃スキル\s*(\d+)>/
  BEF_CNT_PLUS = /<攻撃前反撃率\s*([\+\-]?\d+)[%%]>/
  HIT_CNT_PLUS = /<攻撃後反撃率\s*([\+\-]?\d+)[%%]>/
  EVA_CNT_PLUS = /<回避反撃率\s*([\+\-]?\d+)[%%]>/
end

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ メモ取得
  #--------------------------------------------------------------------------
  def fai_cnt_ex_note
    @before_counter = []
    @hit_counter = []
    @evade_counter = []
    @counter_skill = 0
    note.each_line{|line|
      case line
      when FAI_CNT_EX::BEF_CNT
        n = $2.to_i
        @before_counter << [$1.scan(/\-?\d+/).map{|n|n.to_i}, n / 100.0]
      when FAI_CNT_EX::HIT_CNT
        n = $2.to_i
        @hit_counter << [$1.scan(/\-?\d+/).map{|n|n.to_i}, n / 100.0]
      when FAI_CNT_EX::EVA_CNT
        n = $2.to_i
        @evade_counter << [$1.scan(/\-?\d+/).map{|n|n.to_i}, n / 100.0]
      when FAI_CNT_EX::CNT_SKL
        @counter_skill = $1.to_i
      when FAI_CNT_EX::BEF_CNT_PLUS
        @before_counter << [0, $1.to_i / 100.0]
      when FAI_CNT_EX::HIT_CNT_PLUS
        @hit_counter << [0, $1.to_i / 100.0]
      when FAI_CNT_EX::EVA_CNT_PLUS
        @evade_counter << [0, $1.to_i / 100.0]
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ パラメータ
  #--------------------------------------------------------------------------
  def before_counter
    fai_cnt_ex_note if !@before_counter
    @before_counter
  end
  def hit_counter
    fai_cnt_ex_note if !@hit_counter
    @hit_counter
  end
  def evade_counter
    fai_cnt_ex_note if !@evade_counter
    @evade_counter
  end
  def counter_skill
    fai_cnt_ex_note if !@counter_skill
    @counter_skill
  end
end

#==============================================================================
# ■ Game_BattlerBase
#==============================================================================

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ○ パラメータ
  #--------------------------------------------------------------------------
  def before_counter
    feature_objects.collect{|a|a.before_counter}.flatten(1)
  end
  def bcr # before_counter_rate
    feature_objects.inject(0.0){|r, a|
      r + (((a.before_counter.find{|arr|arr[0] == 0} || [0])[1]) || 0)
    }
  end
  def hit_counter
    feature_objects.collect{|a|a.hit_counter}.flatten(1)
  end
  def hcr # hit_counter_rate
    feature_objects.inject(0.0){|r, a|
      r + (((a.hit_counter.find{|arr|arr[0] == 0} || [0])[1]) || 0)
    }
  end
  def evade_counter
    feature_objects.collect{|a|a.evade_counter}.flatten(1)
  end
  def ecr # evade_counter_rate
    feature_objects.inject(0.0){|r, a|
      r + (((a.evade_counter.find{|arr|arr[0] == 0} || [0])[1]) || 0)
    }
  end
  #--------------------------------------------------------------------------
  # ○ IDからオブジェクトを取得
  #--------------------------------------------------------------------------
  def use_cnt_item(id)
    id >= 0 ? $data_skills[id] : $data_items[-id]
  end
  #--------------------------------------------------------------------------
  # ○ 反撃スキルとか確率とか
  #--------------------------------------------------------------------------
  def item_bef_cnt(user, item)
    return nil if !opposite?(user)
    return nil if !FAI_CNT_EX::BEF_CNT_FOR_CERT && item.certain?
    return nil if !FAI_CNT_EX::BEF_CNT_FOR_MAG && item.magical?
    (before_counter.find{|arr|
      arr[0].any?{|i|usable?(use_cnt_item(i))} && arr[1] + bcr >= rand} || [0]
    )[0]
  end
  def item_hit_cnt(user, item)
    return nil if !@result.hit? || !opposite?(user)
    return nil if !FAI_CNT_EX::HIT_CNT_FOR_CERT && item.certain?
    return nil if !FAI_CNT_EX::HIT_CNT_FOR_MAG && item.magical?
    (hit_counter.find{|arr|
      arr[0].any?{|i|usable?(use_cnt_item(i))} && arr[1] + hcr >= rand} || [0]
    )[0]
  end
  def item_eva_cnt(user, item)
    return nil if !@result.evaded || !opposite?(user)
    return nil if !FAI_CNT_EX::EVA_CNT_FOR_CERT && item.certain?
    return nil if !FAI_CNT_EX::EVA_CNT_FOR_MAG && item.magical?
    (evade_counter.find{|arr|
      arr[0].any?{|i|usable?(use_cnt_item(i))} && arr[1] + ecr >= rand} || [0]
    )[0]
  end
  def counter_skill
    feature_objects.collect{|a|a.counter_skill}.sample
  end
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ★ スキル/アイテムの効果を適用
  #--------------------------------------------------------------------------
  alias fai_cnt_ex_apply_item_effects apply_item_effects
  def apply_item_effects(target, item)
    process_counter_ex(target, target.item_bef_cnt(@subject, item))
    fai_cnt_ex_apply_item_effects(target, item)
    process_counter_ex(target, target.item_hit_cnt(@subject, item))
    process_counter_ex(target, target.item_eva_cnt(@subject, item))
  end
  #--------------------------------------------------------------------------
  # 〇 特殊反撃の共通処理
  #--------------------------------------------------------------------------
  def process_counter_ex(target, arr)
    return if !arr || arr == 0
    id = arr.find{|i|target.usable?(target.use_cnt_item(i))}
    return if !id || id == 0
    item = target.use_cnt_item(id)
    action = Game_Action.new(target)
    item.is_a?(RPG::Item) ? action.set_item(item.id) : action.set_skill(item.id)
    ts = action.make_targets.compact
    @log_window.display_use_item(target, item)
    target.use_item(item)
    refresh_status
    show_animation(ts, item.animation_id)
    ts.each{|t|
      t.item_apply(target, item)
      refresh_status
      @log_window.display_action_results(t, item)
    }
  end
 
  if FAI_CNT_EX::USE_CNT_SKL
 
  #--------------------------------------------------------------------------
  # ● 反撃の発動
  #--------------------------------------------------------------------------
  def invoke_counter_attack(target, item)
    @log_window.display_counter(target, item)
    attack_skill = $data_skills[target.counter_skill]
    @subject.item_apply(target, attack_skill)
    refresh_status
    @log_window.display_action_results(@subject, attack_skill)
  end
 
  end # <= if FAI_CNT_EX::USE_CNT_SKL

end

※一応旧バージョンに需要があるかもしれないので残しておきますって書くの忘れたので2回です
最後に編集したユーザー faida on 2018年4月30日(月) 16:26 [ 編集 2 回目 ]
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
アバター
なたね
記事: 12
登録日時: 2017年1月11日(水) 00:34
連絡を取る:

Re: 反撃スキル

投稿記事by なたね » 2017年4月29日(土) 14:55

faida様。この度は作製していただきありがとうございました。
思っていた動作ができたので、本当に嬉しいです。
半ば諦めていた事なので、とても感謝しています。
本当にありがとうございました。
ぐれん
記事: 3
登録日時: 2018年4月22日(日) 16:39

Re: 反撃スキル

投稿記事by ぐれん » 2018年4月22日(日) 16:44

お世話になっております。
こちらのスクリプトを利用させていただいているのですが、
「反撃を受けない攻撃」または「特定の属性のダメージを受けた後に反撃」を実装していただく事は可能でしょうか?

宜しくお願いいたします。
ぐれん
記事: 3
登録日時: 2018年4月22日(日) 16:39

Re: 反撃スキル

投稿記事by ぐれん » 2018年4月25日(水) 18:57

お世話になっております。
こちらのスクリプトのテストを行っていたのですが、
こちらのスクリプトを適用後、デフォルトの「反撃率」によって反撃を行う際にエラーが起きることを確認いたしました。

エラーメッセージは以下になります。
------------------------------------------

スクリプト '反撃スキル' の 173 行目で NoMethodError が発生しました。
undefined method `choice' for [0, 0, 0, 0, 0, 0]:Array

------------------------------------------

お手数ですが、上記と合わせてご確認の検討をお願いいたします。
faida
記事: 184
登録日時: 2015年12月17日(木) 16:44

Re: 反撃スキル

投稿記事by faida » 2018年4月30日(月) 11:07

なんやかんや色々考慮した結果変なことになりました。

コード: 全て選択

=begin
◆概要
特殊な反撃を作成します。

◆機能
・メモ欄に<通常反撃 a, b, c, ..., n%>と記入すると、n%の確率で敵の物理攻撃を
キャンセルし、a, b, c, ...のスキルのどれかを発動します。
上記仕様に伴い、デフォルトの反撃率の設定は<通常反撃 1 n%>とほぼ同じになります。
・メモ欄に<攻撃前反撃 a, b, c, ..., n%>と記入すると、敵の行動前にn%の確率で
a, b, c, ...のスキルのどれかを発動します。
・メモ欄に<攻撃後反撃 a, b, c, ..., n%>と記入すると、敵の攻撃後にn%の確率で
a, b, c, ...のスキルのどれかを発動します。
・メモ欄に<回避反撃 a, b, c, ..., n%>と記入すると、敵の攻撃回避後にn%の確率で
a, b, c, ...のスキルのどれかを発動します。
・a, b, c, ...を負にするとアイテムになります。
例:<攻撃後反撃 1, 50%> やられたらやり返すかもしれない
  <攻撃前反撃 2, 50%> やられる前に身を守るかもしれない
  <攻撃後反撃 -1, -2, -3, 100%> オートポーション
・メモ欄に<条件付反撃 str>と記入すると、「直後に」設定した反撃は
strを満たす場合のみ発動します。strは条件式を入れます。
・メモ欄に<全条件付反撃 str>と記入すると、「以降、このメモ欄に」設定した反撃は全て
strを満たす場合のみ発動します。strは条件式を入れます。
例:敵の攻撃力が自分の攻撃力より上→user.atk > self.atk
   ID3の属性攻撃に対しての反撃→item.damage.element_id == 3
   「この」スキルを指定する場合の例→s.tp_cost <= self.tp / 2
   適当に設定項目作れば簡略化も可→eval(FAI_CNT_EX::CND_CNT_LIST[1])
・メモ欄に<反撃不可>と記入すると、そのバトラーが行う攻撃に対して一切の反撃が
できなくなります。これはスキル系・ステート系のどちらでも有効です。
・メモ欄に<反撃不可 :normal>と記入すると、通常の反撃ができなくなります。
・メモ欄に<反撃不可 :attack>と記入すると、敵に対する反撃ができなくなり
ます。これらと以下のスクリプトでだいたい察してください。

◆仕様
・攻撃前って書いてるけど攻撃じゃなくても反応します。
・味方には反撃しません。
・デフォルトの反撃率の設定は<通常反撃 1 n%>と同じですが、他の反撃率とは違い
反撃率設定が複数ある場合は<通常反撃 1 n%>のn%が上昇するのみです。
また、別のスクリプトで通常攻撃スキルが変更されている場合、デフォルトの反撃も
通常攻撃スキルを発動します。
例:<通常反撃 1 20%>を持つ武具を3つ装備すると、この発動率は理論上
   100 - (100-20) ^ 3 = 48.8 %となりますが、
   デフォルトの反撃率20%を持つ武具を3つ装備すると、この発動率は理論も何もなく
   20 * 3 = 60 % となります。
・<全条件付反撃 str>を設定中に<条件付反撃 str>を設定すると、直後の反撃のみ
<条件付反撃 str>が適用されます。それ以外は<全条件付反撃 str>が適用されます。

◆使用上の注意
・★……エイリアス ●……再定義 ○……新規定義

◆作者:faida @faida3983

◆更新履歴
ver1.0 : 公開
ver2.0 : 全体的に構造を見直したので一気にバージョンが上がりました。

=end

module FAI_CNT_EX
  # 設定項目:魔法とか必中攻撃とかでも反撃する
  # 普通の反撃は魔法とか必中攻撃とかでは反撃できません。
  BEF_CNT_FOR_CERT = true
  HIT_CNT_FOR_CERT = true
  EVA_CNT_FOR_CERT = false
  BEF_CNT_FOR_MAG = true
  HIT_CNT_FOR_MAG = true
  EVA_CNT_FOR_MAG = false
 
  NOT_CNT_TYPE = {}
  NOT_CNT_TYPE[:all] = [[:normal, :before, :hit, :evade], []]
  NOT_CNT_TYPE[:normal] = [[:normal], []]
  NOT_CNT_TYPE[:before] = [[:before], []]
  NOT_CNT_TYPE[:hit] = [[:hit], []]
  NOT_CNT_TYPE[:evade] = [[:evade], []]
  NOT_CNT_TYPE[:attack] = [[:normal, :before, :hit, :evade],
    ["s.for_opponent?"]]
  NOT_CNT_TYPE[:defence] = [[:normal, :before, :hit, :evade],
    ["s.for_friend?"]]
 
  CND_CNT_LIST = []
  CND_CNT_LIST[0] = "[3,4,5,6,7,8,9,10].include?(item.damage.element_id)"
 
  CND_CNT = /<条件付反撃\s*(.+)>/
  ACND_CNT = /<全条件付反撃\s*(.+)>/
  NOR_CNT = /<通常反撃\s*(\-?\d+(?:\,\s*\-?\d+)*)\s*\,\s*(\d+)[%%]>/
  BEF_CNT = /<攻撃前反撃\s*(\-?\d+(?:\,\s*\-?\d+)*)\s*\,\s*(\d+)[%%]>/
  HIT_CNT = /<攻撃後反撃\s*(\-?\d+(?:\,\s*\-?\d+)*)\s*\,\s*(\d+)[%%]>/
  EVA_CNT = /<回避反撃\s*(\-?\d+(?:\,\s*\-?\d+)*)\s*\,\s*(\d+)[%%]>/
  NOT_CNT = /<反撃不可\s*(?:\:(.+))*>/
  NOR_CNT_PLUS = /<通常反撃率\s*([\+\-]?\d+)[%%]>/
  BEF_CNT_PLUS = /<攻撃前反撃率\s*([\+\-]?\d+)[%%]>/
  HIT_CNT_PLUS = /<攻撃後反撃率\s*([\+\-]?\d+)[%%]>/
  EVA_CNT_PLUS = /<回避反撃率\s*([\+\-]?\d+)[%%]>/
end

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ メモ取得
  #--------------------------------------------------------------------------
  def fai_cnt_ex_note
    @normal_counter = []
    @before_counter = []
    @hit_counter = []
    @evade_counter = []
    @forbid_counter = []
    @_condition_counter = nil
    @_condition_counter_all = nil
    note.each_line{|line|
      case line
      when FAI_CNT_EX::CND_CNT
        next @_condition_counter = $1
      when FAI_CNT_EX::ACND_CNT
        @_condition_counter_all = $1
      when FAI_CNT_EX::NOR_CNT
        rate = $2.to_i; skill_ids = $1.scan(/\-?\d+/).map{|n|n.to_i}
        @normal_counter << fai_cnt_note_ex_arr(skill_ids, rate)
      when FAI_CNT_EX::BEF_CNT
        rate = $2.to_i; skill_ids = $1.scan(/\-?\d+/).map{|n|n.to_i}
        @before_counter << fai_cnt_note_ex_arr(skill_ids, rate)
      when FAI_CNT_EX::HIT_CNT
        rate = $2.to_i; skill_ids = $1.scan(/\-?\d+/).map{|n|n.to_i}
        @hit_counter << fai_cnt_note_ex_arr(skill_ids, rate)
      when FAI_CNT_EX::EVA_CNT
        rate = $2.to_i; skill_ids = $1.scan(/\-?\d+/).map{|n|n.to_i}
        @evade_counter << fai_cnt_note_ex_arr(skill_ids, rate)
      when FAI_CNT_EX::NOT_CNT
        @forbid_counter <<  ($1 || "all").to_sym
      when FAI_CNT_EX::NOR_CNT_PLUS
        @normal_counter << fai_cnt_note_ex_arr(0, $1.to_i)
      when FAI_CNT_EX::BEF_CNT_PLUS
        @before_counter << fai_cnt_note_ex_arr(0, $1.to_i)
      when FAI_CNT_EX::HIT_CNT_PLUS
        @hit_counter << fai_cnt_note_ex_arr(0, $1.to_i)
      when FAI_CNT_EX::EVA_CNT_PLUS
        @evade_counter << fai_cnt_note_ex_arr(0, $1.to_i)
      end
      @_condition_counter = nil
    }
    @_condition_counter_all = nil
  end
  def fai_cnt_note_ex_cnd
    if @_condition_counter; @_condition_counter
    elsif @_condition_counter_all; @_condition_counter_all
    else; "true"
    end
  end
  def fai_cnt_note_ex_arr(skill_id, rate)
    [skill_id, rate / 100.0, fai_cnt_note_ex_cnd]
  end
  #--------------------------------------------------------------------------
  # ○ パラメータ
  #--------------------------------------------------------------------------
  def normal_counter
    fai_cnt_ex_note if !@normal_counter
    @normal_counter
  end
  def before_counter
    fai_cnt_ex_note if !@before_counter
    @before_counter
  end
  def hit_counter
    fai_cnt_ex_note if !@hit_counter
    @hit_counter
  end
  def evade_counter
    fai_cnt_ex_note if !@evade_counter
    @evade_counter
  end
  def forbid_counter
    fai_cnt_ex_note if !@forbid_counter
    @forbid_counter
  end
end

#==============================================================================
# ■ Game_BattlerBase
#==============================================================================

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ○ パラメータ
  #--------------------------------------------------------------------------
  def normal_counter
    arr = cnt > 0 ? [[[attack_skill_id], cnt, "true"]] : []
    arr + feature_objects.collect{|a|a.normal_counter}.flatten(1)
  end
  def ncr # normal_counter_rate
    feature_objects.inject(0.0){|r, a|
      r + (a.normal_counter.find{|arr|arr[0] == 0} || [0, 0])[1]
    }
  end
  def before_counter
    feature_objects.collect{|a|a.before_counter}.flatten(1)
  end
  def bcr # before_counter_rate
    feature_objects.inject(0.0){|r, a|
      r + (a.before_counter.find{|arr|arr[0] == 0} || [0, 0])[1]
    }
  end
  def hit_counter
    feature_objects.collect{|a|a.hit_counter}.flatten(1)
  end
  def hcr # hit_counter_rate
    feature_objects.inject(0.0){|r, a|
      r + (a.hit_counter.find{|arr|arr[0] == 0} || [0, 0])[1]
    }
  end
  def evade_counter
    feature_objects.collect{|a|a.evade_counter}.flatten(1)
  end
  def ecr # evade_counter_rate
    feature_objects.inject(0.0){|r, a|
      r + (a.evade_counter.find{|arr|arr[0] == 0} || [0, 0])[1]
    }
  end
  def forbid_counter(item)
    (feature_objects+[item]).inject([]){|r, a| r | a.forbid_counter }
  end
  #--------------------------------------------------------------------------
  # ○ IDからオブジェクトを取得
  #--------------------------------------------------------------------------
  def use_cnt_item(id)
    id >= 0 ? $data_skills[id] : $data_items[-id]
  end
end

#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler < Game_BattlerBase
  attr_reader :set_counter_skills
  #--------------------------------------------------------------------------
  # ○ 反撃可能かチェック
  #--------------------------------------------------------------------------
  def counterable?(type, user, item, cnt_skill_id, str)
    s = use_cnt_item(cnt_skill_id)
    return false if !usable?(s) || !eval(str)
    user.forbid_counter(item).each{|symbol|
      cond = FAI_CNT_EX::NOT_CNT_TYPE[symbol]
      return false if cond[0].include?(type) && (cond[1].empty? ||
      cond[1].any?{|st|eval(st)})
    }
  end
  #--------------------------------------------------------------------------
  # ★ スキル/アイテムの反撃率計算
  #--------------------------------------------------------------------------
  alias fai_cnt_ex_item_cnt item_cnt
  def item_cnt(user, item)
    @set_counter_skills = nil
    return 0 unless opposite?(user) && item.physical?
    ids = (normal_counter.find{|arr|
      arr[0].any?{|i|
        counterable?(:normal, user, item, i, arr[2])} && arr[1] + ncr >= rand
      } || [0]
    )[0]
    @set_counter_skills = ids == 0 ? nil : ids
    return @set_counter_skills ? 1.0 : 0.0
    fai_cnt_ex_item_cnt(user, item)
  end
  #--------------------------------------------------------------------------
  # ○ 反撃スキルとか確率とか
  #--------------------------------------------------------------------------
  def item_bef_cnt(user, item)
    return nil if !opposite?(user)
    return nil if !FAI_CNT_EX::BEF_CNT_FOR_CERT && item.certain?
    return nil if !FAI_CNT_EX::BEF_CNT_FOR_MAG && item.magical?
    (before_counter.find{|arr|
      arr[0].any?{|i|
        counterable?(:before, user, item, i, arr[2])} && arr[1] + bcr >= rand
      } || [0]
    )[0]
  end
  def item_hit_cnt(user, item)
    return nil if !@result.hit? || !opposite?(user)
    return nil if !FAI_CNT_EX::HIT_CNT_FOR_CERT && item.certain?
    return nil if !FAI_CNT_EX::HIT_CNT_FOR_MAG && item.magical?
    (hit_counter.find{|arr|
      arr[0].any?{|i|
        counterable?(:hit, user, item, i, arr[2])} && arr[1] + hcr >= rand
      } || [0]
    )[0]
  end
  def item_eva_cnt(user, item)
    return nil if !@result.evaded || !opposite?(user)
    return nil if !FAI_CNT_EX::EVA_CNT_FOR_CERT && item.certain?
    return nil if !FAI_CNT_EX::EVA_CNT_FOR_MAG && item.magical?
    (evade_counter.find{|arr|
      arr[0].any?{|i|
        counterable?(:evade, user, item, i, arr[2])} && arr[1] + ecr >= rand
      } || [0]
    )[0]
  end
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ★ スキル/アイテムの効果を適用
  #--------------------------------------------------------------------------
  alias fai_cnt_ex_apply_item_effects apply_item_effects
  def apply_item_effects(target, item)
    process_counter_ex(target, target.item_bef_cnt(@subject, item))
    fai_cnt_ex_apply_item_effects(target, item)
    process_counter_ex(target, target.item_hit_cnt(@subject, item))
    process_counter_ex(target, target.item_eva_cnt(@subject, item))
  end
  #--------------------------------------------------------------------------
  # 〇 特殊反撃の共通処理
  #--------------------------------------------------------------------------
  def process_counter_ex(target, arr)
    return if !arr || arr == 0
    id = arr.find{|i|target.usable?(target.use_cnt_item(i))}
    return if !id || id == 0
    item = target.use_cnt_item(id)
    action = Game_Action.new(target)
    item.is_a?(RPG::Item) ? action.set_item(item.id) : action.set_skill(item.id)
    if item.need_selection?
      action.target_index = item.for_friend? ? target.index : @subject.index
    end
    ts = action.make_targets.compact
    if id == target.attack_skill_id
      @log_window.display_counter(target, item)
    else
      @log_window.display_use_item(target, item)
      subject, @subject = @subject, target
      show_animation(ts, item.animation_id)
      @subject = subject
    end
    target.use_item(item)
    refresh_status
    ts.each{|t|
      t.item_apply(target, item)
      refresh_status
      @log_window.display_action_results(t, item)
    }
  end
  #--------------------------------------------------------------------------
  # ● 反撃の発動
  #--------------------------------------------------------------------------
  def invoke_counter_attack(target, item)
    process_counter_ex(target, target.set_counter_skills)
  end
end
説明するのも面倒なくらい機能を詰め込んだので何か不明点があれば遠慮なくどうぞ。
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
ぐれん
記事: 3
登録日時: 2018年4月22日(日) 16:39

Re: 反撃スキル

投稿記事by ぐれん » 2018年5月02日(水) 01:35

faida様

ご確認ありがとうございます!
ありがたく使わせて頂きます。

“VX / Ace:スクリプト素材のリクエスト” へ戻る