#============================================================================== # ○ディフェンダー(敵ディフェンダー拡張) # for RGSS2 # 西瓜 / Space not far # http://muspell.raindrop.jp/ # 一定の確率で物理攻撃をガードしてダメージを減らす装備を設定できます。 #============================================================================== # ■更新履歴 # Ver1.02 # ・物理攻撃スキルの判定をデータベースのチェックの有無に変更。 # Ver1.01 # ・メモ欄に他のスクリプトの設定項目があった場合動作しなくなる不具合を修正。 #============================================================================== # 装備(武器防具問わず)のメモ欄に # <ディフェンダー:n%>という形式で書き込んでください。 # その装備をしているとn%の確率で物理攻撃のダメージを減らします。 =begin ●設定例 <ディフェンダー:15%> =end module SNF DEFENDER_DAMAGE = 25 # ディフェンダー発動時のダメージ量を百分率で設定します。 # たとえばDEFENDER_DAMAGE = 25なら、物理攻撃のダメージが25%になります。 DEFENDER_OVERLAP = 0 # ディフェンダー効果を持つ装備を複数装備した時の発動確率の仕様を決めます。 # 0 => 合計値 1 => 最大値 DEFENDER_SKILL = true # スキルにはディフェンダーを適用するか?(true/false) DEFENDER_DISPLAY = true # 発動時にメッセージウィンドウに文章を表示するか?(true/false) DEFENDER_WORD = "装備でガードした!" E_DEFENDER_WORD = "装備でガードされた!" # 発動時に表示される文章です。 DEFENDER_MEMO = "ディフェンダー" # メモ欄のアレです。 DEFENDER_SE = RPG::SE.new("Open3", 100, 135) end class Game_Battler attr_reader :defender # 行動結果: ディフェンダーフラグ attr_reader :enemy_defender #-------------------------------------------------------------------------- # ● 行動効果の保持用変数をクリア #-------------------------------------------------------------------------- alias snf_defender_clear_action_results clear_action_results def clear_action_results snf_defender_clear_action_results @defender = false @enemy_defender = false end alias snf_defender_make_attack_damage_value make_attack_damage_value def make_attack_damage_value(attacker) snf_defender_make_attack_damage_value(attacker) if self.is_a?(Game_Actor) # アクターですか? defender_rate = 0 # print actor.id for i in self.equips.compact equipnote = i.note.scan(/<#{SNF::DEFENDER_MEMO}[::](S+)[%%]>/) equipnote = equipnote.flatten if equipnote != nil and not equipnote.empty? # ディフェンダー率取得 if SNF::DEFENDER_OVERLAP == 0 defender_rate += equipnote[0].to_i elsif SNF::DEFENDER_OVERLAP == 1 defender_rate = equipnote[0].to_i if defender_rate < equipnote[place + 1].to_i end end @defender = (rand(100) < defender_rate) if @defender @hp_damage *= SNF::DEFENDER_DAMAGE @hp_damage /= 100 end end elsif self.is_a?(Game_Enemy) #return if $game_troop.turn_count == 0 # print "エネミー行動" enemy_defender_rate = 0 enemy_note = enemy.note.scan(/<#{SNF::DEFENDER_MEMO}[::](S+)[%%]>/) enemy_note = enemy_note.flatten if enemy_note != nil and not enemy_note.empty? if SNF::DEFENDER_OVERLAP == 0 enemy_defender_rate += enemy_note[0].to_i elsif SNF::DEFENDER_OVERLAP == 1 enemy_defender_rate = enemy_note[0].to_i if enemy_defender_rate < enemy_note[place + 1].to_i end @enemy_defender = (rand(100) < enemy_defender_rate) if @enemy_defender @hp_damage *= SNF::DEFENDER_DAMAGE @hp_damage /= 100 end end end # if self.is_a(Game_Actor)全体のend らしい end if SNF::DEFENDER_SKILL alias snf_defender_make_obj_damage_value make_obj_damage_value def make_obj_damage_value(user, obj) snf_defender_make_obj_damage_value(user, obj) if self.is_a?(Game_Actor) and obj.physical_attack # アクターですか? defender_rate = 0 for i in self.equips.compact equipnote = i.note.scan(/<#{SNF::DEFENDER_MEMO}[::](S+)[%%]>/) equipnote = equipnote.flatten if equipnote != nil and not equipnote.empty? # ディフェンダー率取得 if SNF::DEFENDER_OVERLAP == 0 defender_rate += equipnote[0].to_i elsif SNF::DEFENDER_OVERLAP == 1 defender_rate = equipnote[0].to_i if defender_rate < equipnote[0].to_i end end end @defender = (rand(100) < defender_rate) if @defender @hp_damage *= SNF::DEFENDER_DAMAGE @hp_damage /= 100 end elsif self.is_a?(Game_Enemy) and obj.physical_attack enemy_defender_rate = 0 enemy_note = enemy.note.scan(/<#{SNF::DEFENDER_MEMO}[::](S+)[%%]>/) enemy_note = enemy_note.flatten if enemy_note != nil and not enemy_note.empty? if SNF::DEFENDER_OVERLAP == 0 enemy_defender_rate += enemy_note[0].to_i elsif SNF::DEFENDER_OVERLAP == 1 enemy_defender_rate = enemy_note[0].to_i if enemy_defender_rate < enemy_note[place + 1].to_i end @enemy_defender = (rand(100) < enemy_defender_rate) if @enemy_defender @hp_damage *= SNF::DEFENDER_DAMAGE @hp_damage /= 100 end end end end # if self.is_a?(Game_Actor) and obj.atk_f > 0 # アクターですか? end end if SNF::DEFENDER_DISPLAY class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● クリティカルヒットの表示 # target : 対象者 # obj : スキルまたはアイテム #-------------------------------------------------------------------------- alias snf_defender_display_critical display_critical def display_critical(target, obj = nil) snf_defender_display_critical(target, obj) # 間借り if target.defender if target.actor? text = SNF::DEFENDER_WORD else text = SNF::E_DEFENDER_WORD end SNF::DEFENDER_SE.play #display_animation([target], 139) wait(15) #@message_window.add_instant_text(text) #wait(15) elsif target.enemy_defender SNF::DEFENDER_SE.play #display_animation([target], 139) wait(15) #@message_window.add_instant_text(text) #wait(15) end end end end