# ▼▲▼ XBCS1. ElementEx. ver.0.9 ▼▲▼ # by 桜雅 在土 #============================================================================== # □ カスタマイズポイント #============================================================================== module Element # 属性の制限数 NUMBER_LIMIT = 16 # 属性修正の計算方法 # 0 最大, 1 乗算, 2 平均, 3 最小 CORRECT_METHOD = 1 # 武器属性追加属性の名前 SKILLS_PLUS = "武器属性追加" SKILLS_DERIVER = "属性譲渡" # 属性系統属性の名前 GUARD = "防御" POWER_UP = "強化" ATTACK = "攻撃" # 属性倍率の限界 MAX = 400 MIN = -400 # 属性防御率テーブル ELEMENT_TABLE = [0, 200, 150, 100, 50, 0, -100] # 「スキルの倍率の下限を 0% に設定する」(true/false) MIN_LIMITATION = true # 「◇全回復 で属性攻撃補正ステートを回復する」(true/false) RECOVER_STATE = false end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 属性補正値の取得 #-------------------------------------------------------------------------- def element_rate(element_id) # 属性有効度に対応する数値を取得 rank = $data_classes[@class_id].element_ranks[element_id] rate = Element::ELEMENT_TABLE[rank] element_name = $data_system.elements[element_id] # この属性が防御されている場合は軽減 set = self.multy_element_set rate -= XRXS.element_percent(set, "#{element_name}#{Element::GUARD}") rate -= XRXS.element_percent(set, "全#{Element::GUARD}") # メソッド終了 return [[rate, Element::MIN].max, Element::MAX].min end end #============================================================================== # ■ Game_Enemy #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● 属性補正値の取得 #-------------------------------------------------------------------------- def element_rate(element_id) # 属性有効度に対応する数値を取得 rank = $data_enemies[@enemy_id].element_ranks[element_id] rate = Element::ELEMENT_TABLE[rank] element_name = $data_system.elements[element_id] # この属性が防御されている場合は軽減 set = self.multy_element_set rate -= Element.percent(set, "#{element_name}#{Element::GUARD}") rate -= Element.percent(set, "全#{Element::GUARD}") # メソッド終了 return [[rate, Element::MIN].max, Element::MAX].min end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ○ スキルの属性取得 #-------------------------------------------------------------------------- def skill_element_set(skill) set = (skill.nil? ? [] : skill.element_set) if Element.include?(set, Element::SKILLS_PLUS) set += self.multy_element_set set.delete(Element::SKILLS_PLUS) else # 属性譲渡がかぶらないように処理 for a in self.armors if a > 0 eleset = $data_armors[a].guard_element_set if Element.include?(eleset, Element::SKILLS_DERIVER) set += eleset end end end for s in self.states eleset = $data_states[s].guard_element_set if Element.include?(eleset, Element:::SKILLS_DERIVER) set += eleset end end set.delete(Element::SKILLS_DERIVER) end return set end #-------------------------------------------------------------------------- # ● 通常攻撃の効果適用 #-------------------------------------------------------------------------- alias :element_attack_effect :attack_effect def attack_effect(attacker) last_hp = self.hp result = 100 if attacker.element_set.size > 0 for e in 1..Element::NUMBER_LIMIT elename = $data_system.elements[e] percent = Element.percent(attacker.multy_element_set, elename) percent = 100 if percent == 0 for state_id in attacker.states if $data_states[state_id] != nil if $data_states[state_id].name =~ /^#{elename}#{Element::POWER_UP}([+-]?\d[1-9]+?\.?\d+?)(%|%)$/ result += ($1.to_i * percent / 100) end end end end end bool = element_attack_effect(attacker) if percentage != 100 and self.damage.is_a?(Numeric) damage = self.damage * result / 100 self.hp = last_hp - damage self.damage = damage end return bool end #-------------------------------------------------------------------------- # ● スキルの効果適用 #-------------------------------------------------------------------------- alias :element_skill_effect :skill_effect def skill_effect(user, skill) last_hp = self.hp result = 100 if skill.element_set.size > 0 for e in 1..XBCS1::ELEMENTS_NUMBER_LIMIT elename = $data_system.elements[e] percent = Element.percent(user.skill_element_set(skill), elename) for state_id in user.states if $data_states[state_id] != nil if $data_states[state_id].name =~ /^#{elename}#{XBCS1::ELEMENT_POWER_UP}([+-]?\d[1-9]+?\.?\d+?)(%|%)/ percentage += ($1.to_i * percent / 100) end end end end end bool = element_skill_effect(user, skill) if percentage != 100 and self.damage.is_a?(Numeric) damage = self.damage * percentage / 100 self.hp = last_hp - damage self.damage = damage end return bool end #-------------------------------------------------------------------------- # ● 全回復 #-------------------------------------------------------------------------- unless Element::RECOVER_STATE alias :element_recover_all :recover_all def recover_all element_revise_states = [] for state_id in @states if $data_states[state_id] != nil if $data_states[state_id].name =~ /^(.+?)#{Element::POWER_UP}([+-]?\d[1-9]+?\.?\d+?)(%|%)/ element_revise_states.push(state_id) end end end element_recover_all for state_id in element_revise_states if $data_states[state_id] != nil add_state(state_id) end end end end #-------------------------------------------------------------------------- # ● 属性修正の計算 + 倍率計算式 #-------------------------------------------------------------------------- def elements_correct(element_set) return 100 if element_set.size == 0 case Element::CORRECT_METHOD when 0 # 最大 rate = Element::MIN when 1 # 乗算 rate = 100 when 2 # 平均 rate = 0 when 3 # 最大 rate = Element::MAX end # 計算 for i in 1..Element::NUMBER_LIMIT elename = $data_system.elements[i] if !defined?(XRXS19) or not elename =~ /(#{XRXS19::ATTACK}|#{XRXS19::MAGIC})/ returnar = XRXS.element_check(element_set, "#{elename}#{Element::ATTACK}") # 属性が定義されていない場合、次へ if !returnar[0] if element_set.include?(i) returnar[2] = 100 else next end end else returnar = [false, 0, 100] end percent = returnar[2] case Elements::CORRECT_METHOD when 0 # 最大 base_rate = (100 - percent + self.element_rate(i) * percent / 10000.0) rate = [rate, base_rate].max when 1 # 乗算 if rate > 0 rate *= ((100 - percent) / 100.0 + self.element_rate(i) * percent / 10000.0) else # 既にマイナスの場合、符号を逆転させない rate *= (((100 - percent) / 100.0 + self.element_rate(i) * percent / 10000.0).abs) end when 2 # 平均 rate += ((100 - percent) / 100.0 + self.element_rate(i) * percent / 10000.0) num += 1 when 3 # 最小 base_rate = ((100 - percent) / 100 + self.element_rate(i) * percent / 10000.0) rate = [rate, base_rate].min end end # 平均の場合、レートを属性数で割る rate /= num if Element::CORRECT_METHOD == 2 # 倍率規制中 element_max = Element::MAX element_min = Element::MIN return [[rate.round, element_max].min, element_min].max end end