#============================================================================== # ■ RGSS3 属性耐性貫通 Ver1.02b by 星潟 #============================================================================== # アイテム・スキル使用時に対象の属性有効度が100%未満の場合 # 一定値分属性有効度を無視する特徴・アイテム・スキルを作成します。 # 貫通を無効化する設定も行う事が出来ます。 #============================================================================== # 特徴を有する項目・アイテム・スキルのスキルのメモ欄に設定。 #------------------------------------------------------------------------------ # <属性耐性貫通:1> # # 対象の属性ID1有効度が100未満(耐性持ち)の時、属性有効度を100%として扱う。 #------------------------------------------------------------------------------ # <属性耐性貫通:1,50> # # 対象の属性ID1有効度が100未満(耐性持ち)の時、 # 属性有効度で軽減されるダメージ量を50%減少する。 # (属性有効度50%の場合、属性有効度75%になる) #------------------------------------------------------------------------------ # <属性耐性貫通:1,90,25> # # 対象の属性ID1有効度が100未満(耐性持ち)の時、 # 25%の確率で属性有効度で軽減されるダメージ量を90%減少する。 # (属性有効度10%の場合、属性有効度91%になる) #------------------------------------------------------------------------------ # <属性耐性貫通禁止:50> # # 「この特性を持つ者orこのアイテム・スキルを使用する者の持つ」属性耐性貫通効果を # 50%の確率で無効化します。 #============================================================================== # 特徴を有する項目のメモ欄に設定。 #------------------------------------------------------------------------------ # <被属性耐性貫通禁止:100> # # アイテム・スキルを受ける時の属性耐性貫通効果を100%の確率で無効化します。 #------------------------------------------------------------------------------ # <属性耐性貫通耐性:1,50> # # アイテム・スキルを受ける時の属性耐性貫通効果を50%軽減します。 #============================================================================== module ElementPenetrate #属性耐性貫通の設定用キーワードを指定。 Word1 = "属性耐性貫通" #属性耐性貫通禁止の設定用キーワードを指定。 Word2 = "属性耐性貫通禁止" #被属性耐性貫通禁止の設定用キーワードを指定。 Word3 = "被属性耐性貫通禁止" #属性耐性貫通耐性の設定用キーワードを指定。 Word4 = "属性耐性貫通耐性" #被属性耐性貫通禁止そのものの可否を設定します。 #機能を犠牲に少しでも動作を軽くしたい場合はfalseにして下さい。 SPS = true #属性耐性貫通や耐性の合計の処理を乗算にするか加算にするかを指定。 #trueで乗算。falseで加算。 EVAL = true end class Game_BattlerBase #-------------------------------------------------------------------------- # 属性有効度 #-------------------------------------------------------------------------- alias element_rate_penetrate_is element_rate def element_rate(element_id) r1 = element_rate_penetrate_is(element_id) elpn = @element_penetrate return r1 unless (r1 < 1 && elpn && elpn[element_id]) r2 = 1 - r1 n = elpn[element_id] n = 0 if n < 0 n = 100 if n > 100 r2 *= n.to_f / 100 1.0 - r2 end end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # スキル/アイテムの属性修正値を取得 #-------------------------------------------------------------------------- alias item_element_rate_penetrate_is item_element_rate def item_element_rate(user, item) @element_penetrate = prepare_element_penetrate(user, item) r = item_element_rate_penetrate_is(user, item) @element_penetrate = nil r end #-------------------------------------------------------------------------- # 属性耐性貫通データ準備 #-------------------------------------------------------------------------- def prepare_element_penetrate(user,item) a = user b = self v = $game_variables h = {} return h if ElementPenetrate::SPS && (feature_objects.inject(0) {|r,f| r += eval(f.self_element_penetrate_seal)} > rand(100)) (user.feature_objects + [item]).each {|f| s = f.element_penetrate_seal return {} if !s.empty? && eval(s) > rand(100) f.element_penetrate.each {|k,v| next unless eval(v[1]) > rand(100) h[k] ||= 100 if ElementPenetrate::EVAL h[k] *= (100 - eval(v[0]).to_f) h[k] /= 100 else h[k] -= eval(v[0]) end }} feature_objects.each {|f| f.self_element_penetrate_resist.each {|k,v| next unless h[k] if ElementPenetrate::EVAL h[k] = 100 - (100 - h[k]) * (100 - eval(v)).to_f / 100 else h[k] += eval(v) end }} h end end class RPG::BaseItem #-------------------------------------------------------------------------- # 属性耐性貫通 #-------------------------------------------------------------------------- def element_penetrate @element_penetrate ||= create_element_penetrate end #-------------------------------------------------------------------------- # 属性耐性貫通データ作成 #-------------------------------------------------------------------------- def create_element_penetrate h = {} self.note.each_line {|l| a = (/<#{ElementPenetrate::Word1}[::](\S+)>/ =~ l ? $1.to_s : "").split(/\s*,\s*/) s = a.size next if s == 0 (3 - s).times {a.push("100")} if s < 3 h[a[0].to_i] = [a[1],a[2]]} h end #-------------------------------------------------------------------------- # 属性耐性貫通禁止 #-------------------------------------------------------------------------- def element_penetrate_seal @element_penetrate_seal ||= /<#{ElementPenetrate::Word2}[::](\S+)>/ =~ note ? $1.to_s : "" end #-------------------------------------------------------------------------- # 被属性耐性貫通禁止 #-------------------------------------------------------------------------- def self_element_penetrate_seal @self_element_penetrate_seal ||= /<#{ElementPenetrate::Word3}[::](\S+)>/ =~ note ? $1.to_s : "0" end #-------------------------------------------------------------------------- # 被属性耐性貫通耐性 #-------------------------------------------------------------------------- def self_element_penetrate_resist @self_element_penetrate_resist ||= create_element_penetrate_resist end #-------------------------------------------------------------------------- # 被属性耐性貫通耐性作成 #-------------------------------------------------------------------------- def create_element_penetrate_resist h = {} self.note.each_line {|l| a = (/<#{ElementPenetrate::Word4}[::](\S+)>/ =~ l ? $1.to_s : "").split(/\s*,\s*/) s = a.size next if s == 0 (2 - s).times {a.push("100")} if s < 2 h[a[0].to_i] = a[1]} h end end