#============================================================================== # ■ RGSS2 カウンター特徴 Ver1.01a by 星潟 #------------------------------------------------------------------------------ # 通常攻撃/スキル/アイテムを受けた際にカウンターを行う機能を追加します。 # この効果は、エネミー/武器/防具/ステートに持たせる事が出来ます。 # また、スキルにカウンター効果を持たせ # 習得する事でカウンターを可能にする事も可能になります。 # 敵に味方用スキルでカウンターする事は出来ませんのでご注意下さい。 # (この場合、味方が対象となります) #============================================================================== # エネミー/武器/防具/ステートのメモ欄に指定します。 # 確率を省略して<カウンター特徴:1,0>と設定した場合は100%の扱いになります。 #============================================================================== # <カウンター特徴:1,0,25> # # カウンタータイプ1(基本ダメージ0以上かつ物理影響度1以上)のスキル/アイテム、 # もしくは通常攻撃に対し、25%の確率で通常攻撃で反撃します。 #------------------------------------------------------------------------------ # <カウンター特徴:2,0,75> # # カウンタータイプ2(基本ダメージ0以上かつ精神影響度1以上)のスキル/アイテムに対し # 75%の確率で通常攻撃で反撃します。 #------------------------------------------------------------------------------ # <カウンター特徴:1,70,50> # # カウンタータイプ1(基本ダメージ0以上かつ精神影響度1以上)のスキル/アイテム、 # もしくは通常攻撃に対し、50%の確率でスキルID70で反撃します。 # スキルID70が使用できない状況では発動出来ません。 #------------------------------------------------------------------------------ # <カウンター特徴:3,75,100> # # カウンタータイプ3(カウンタータイプ3に設定した物)のスキル/アイテムに対し # 100%の確率でスキルID75で反撃します。 # スキルID75が使用できない状況では発動出来ません。 #============================================================================== # スキル/アイテムのメモ欄に指定します。 #============================================================================== # <カウンタータイプ:3> # # このスキル/アイテムのカウンタータイプを3に設定します。 # 本来カウンタータイプ1や2に割り振られるべきスキルであってもこちらが優先されます。 #============================================================================== module CounterFeature #カウンター特徴設定用キーワードを指定。 Word1 = "カウンター特徴" #カウンタータイプ強制用キーワードを指定。 Word2 = "カウンタータイプ" #パッシブスキルとしてのカウンターを作成するかを指定。 #trueの場合、スキルに対してカウンター特徴を持たせる事が可能。 #(スキルに対する設定方法もエネミー/武器/防具/ステートと同じ) PAS_S = true end class Game_Battler #-------------------------------------------------------------------------- # 行動を呼び戻す #-------------------------------------------------------------------------- def action_recall(a) a.battler = self @action = a end #-------------------------------------------------------------------------- # カウンター特徴 #-------------------------------------------------------------------------- def counter_features states end #-------------------------------------------------------------------------- # カウンターチェック #-------------------------------------------------------------------------- def counter_check(user,obj) return unless $game_temp.in_battle return if self.actor? == user.actor? if obj && obj.is_a?(RPG::UsableItem) t1 = obj.force_counter_type case t1 when 0;t2 = (obj.base_damage >= 0) ? (obj.atk_f > 0 ? 1 : (obj.spi_f > 0 ? 2 : 3)) : 3 else;t2 = t1 end else t2 = 1 end for f in counter_features next unless f for v in f.counter_data.values next unless eval(v[0]) == t2 next unless eval(v[2]) > rand(100) si = eval(v[1]) next if si < 0 or si > $data_skills.size - 1 $scene.counter_action_set(self,si,user.index) return unless movable? end end end end class Scene_Battle < Scene_Base attr_accessor :counter_hash #-------------------------------------------------------------------------- # 開始処理 #-------------------------------------------------------------------------- alias start_counter_features start def start @counter_hash = {} start_counter_features end #-------------------------------------------------------------------------- # 戦闘行動の実行 #-------------------------------------------------------------------------- alias execute_action_counter_features execute_action def execute_action @last_action_battler_for_counter = @active_battler execute_action_counter_features @counter_hash.each_value {|a| next unless a[0].movable? next if a[1] > 0 && !a[0].skill_can_use?($data_skills[a[1]]) @active_battler = a[0] la = Marshal.load(Marshal.dump(@active_battler.action)) case a[1] when 0 ;@active_battler.action.set_attack else ;@active_battler.action.set_skill(a[1]) end @active_battler.action.target_index = a[2] @active_battler.action.make_targets @message_window.clear execute_action_counter_features @active_battler.action_recall(la)} @active_battler = @last_action_battler_for_counter @counter_hash = {} end #-------------------------------------------------------------------------- # カウンターセット #-------------------------------------------------------------------------- def counter_action_set(battler,skill_id,target) @counter_hash[@counter_hash.size] = [battler,skill_id,target] end #-------------------------------------------------------------------------- # 行動結果の表示 #-------------------------------------------------------------------------- alias display_action_effects_counter_features display_action_effects def display_action_effects(target, obj = nil) display_action_effects_counter_features(target, obj) target.counter_check(@last_action_battler_for_counter,obj) end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # カウンター特徴 #-------------------------------------------------------------------------- def counter_features super + equips + (CounterFeature::PAS_S ? skills : []) end end class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # カウンター特徴 #-------------------------------------------------------------------------- def counter_features states + [enemy] end end module CounterSet #-------------------------------------------------------------------------- # カウンター特徴データを取得 #-------------------------------------------------------------------------- def counter_data @counter_data ||= create_counter_data end #-------------------------------------------------------------------------- # カウンター特徴データを作成 #-------------------------------------------------------------------------- def create_counter_data h = {} self.note.each_line {|l| a = /<#{CounterFeature::Word1}[::](\S+)>/ =~ l ? $1.to_s : "" next if a.empty? a = a.split(/\s*,\s*/) case a.size when 2;a.push("100") when 3 else;next end h[h.size] = a} h end end class RPG::Enemy include CounterSet end class RPG::BaseItem include CounterSet end class RPG::State include CounterSet end class RPG::UsableItem < RPG::BaseItem #-------------------------------------------------------------------------- # カウンタータイプ強制 #-------------------------------------------------------------------------- def force_counter_type @force_counter_type ||= /<#{CounterFeature::Word2}[::](\d+)>/ =~ note ? $1.to_i : 0 end end