=begin 属性攻撃力システム ◆概要 属性の仕様を大幅に変更し、割合を素としたダメージとします。 ◆機能 ・ぶっちゃけた話「格闘30%、炎70%」みたいにダメージ計算をする、と言うだけ。 ・武具のメモ欄に<攻撃属性 m n%>と書くことで、通常攻撃時のIDmの属性が n%ダメージになります。 ・武具のメモ欄に<スキル属性 m n%>と書くことで、スキル攻撃時、IDmの属性が n%ダメージになります。 ・スキルのメモ欄に<属性割合 m n%>と書くことで、そのスキルで攻撃するとき IDmの属性がn%ダメージになります。 ◆仕様 ・通常攻撃のダメージ計算は武器のほうで属性攻撃力合計100%にしないと ダメージが大きくなります。(誤設定:格闘50%&炎70%など) ・スキルもまた然り。 ◆使用上の注意 ・ダメージ計算を再定義。改造する場合は属性計算のところだけコピペすればOK。 =end # 設定項目:デフォルトでのアクター・エネミーの通常属性攻撃力% DEFORLT_ATTACK_ELEMENT_RATE = 100 # 設定項目:デフォルトでのアクター・エネミーのスキル属性攻撃力% DEFORLT_SKILL_ELEMENT_RATE = 100 # 設定項目:アクターごとの通常属性攻撃力% # 書式は一番外側の{}の中に、アクターID => {属性ID => パーセンテージ} # という形で設定。詳しくは凡例↓を参照。 ACTOR_ATTACK_ELEMENT_RATE = { #~ # ID1 の設定 #~ 1 => { #~ 1 => 500, 2 => 50, #~ #~ } # アクターID1 終了 } # 設定項目終了 # 設定項目:アクターごとのスキル属性攻撃力% ACTOR_SKILL_ELEMENT_RATE = { #~ # ID1 の設定 #~ 1 => { #~ 1 => 500, 2 => 50, #~ #~ } # アクターID1 終了 } # 設定項目終了 # 設定項目:武器の数だけ割合を減らすか? # 二刀流だと、デフォルト設定では卑怯くさいのでtrueにしておくことをお勧めします。 # ちなみに三刀流できるように改造した場合も使用可能。 WEAPON_REDUCE_ELEMENT = true module Element_rate module Base_Item # 通常属性攻撃力 ATTACK_ELEMENT_RATE = /<攻撃属性\s*(\d+)\s*(\d+)[%%]>/i # スキル属性攻撃力倍加 SKILL_ELEMENT_RATE = /<スキル属性\s*(\d+)\s*(\d+)[%%]>/ end module Skill # スキル属性攻撃力 ELEMENT_RATE = /<属性割合\s*(\d+)\s*(\d+)[%%]>/ end end class RPG::Weapon < RPG::BaseItem #-------------------------------------------------------------------------- # ○ メモ判定 #-------------------------------------------------------------------------- def element_rate @attack_element_rate = {} @skill_element_rate = {} for i in 1..$data_system.elements.size if element_set.include?(i) @attack_element_rate[i] = 100 / element_set.size else @attack_element_rate[i] = 100 end end self.note.each_line { |line| case line when Element_rate::Base_Item::ATTACK_ELEMENT_RATE @attack_element_rate[$1.to_i] = $2.to_i when Element_rate::Base_Item::SKILL_ELEMENT_RATE @skill_element_rate[$1.to_i] = $2.to_i end } end #-------------------------------------------------------------------------- # ○ 通常属性攻撃力 #-------------------------------------------------------------------------- def attack_element_rate element_rate if !@attack_element_rate return @attack_element_rate end #-------------------------------------------------------------------------- # ○ スキル属性攻撃力倍加 #-------------------------------------------------------------------------- def skill_element_rate element_rate if !@skill_element_rate return @skill_element_rate end end class RPG::Armor < RPG::BaseItem #-------------------------------------------------------------------------- # ○ メモ判定 #-------------------------------------------------------------------------- def element_rate @attack_element_rate = {} @skill_element_rate = {} self.note.each_line { |line| case line when Element_rate::Base_Item::ATTACK_ELEMENT_RATE @attack_element_rate[$1.to_i] = $2.to_i when Element_rate::Base_Item::SKILL_ELEMENT_RATE @skill_element_rate[$1.to_i] = $2.to_i end } end #-------------------------------------------------------------------------- # ○ 通常属性攻撃力 #-------------------------------------------------------------------------- def attack_element_rate element_rate if !@attack_element_rate return @attack_element_rate end #-------------------------------------------------------------------------- # ○ スキル属性攻撃力倍加 #-------------------------------------------------------------------------- def skill_element_rate element_rate if !@skill_element_rate return @skill_element_rate end end class RPG::Skill < RPG::UsableItem #-------------------------------------------------------------------------- # ○ メモ判定・スキル属性攻撃力 #-------------------------------------------------------------------------- def element_rate if !@element_rate @element_rate = {} for i in 1..$data_system.elements.size if element_set.include?(i) @element_rate[i] = 100 / element_set.size else @element_rate[i] = 0 end end self.note.each_line { |line| case line when Element_rate::Skill::ELEMENT_RATE @element_rate[$1.to_i] = $2.to_i end } end return @element_rate end end class Game_Battler #-------------------------------------------------------------------------- # ○ エネミーのデフォルト属性攻撃力 #-------------------------------------------------------------------------- def element_rate_set_def(tag,i) unless tag == "skill" return DEFORLT_ATTACK_ELEMENT_RATE else return DEFORLT_SKILL_ELEMENT_RATE end end #-------------------------------------------------------------------------- # ○ エネミーの属性攻撃力 #-------------------------------------------------------------------------- def element_rate_set return if @attack_element_rate and @skill_element_rate @attack_element_rate = {} @skill_element_rate = {} for i in 1..$data_system.elements.size @attack_element_rate[i] = DEFORLT_ATTACK_ELEMENT_RATE @skill_element_rate[i] = DEFORLT_SKILL_ELEMENT_RATE end end #-------------------------------------------------------------------------- # ○ 通常属性攻撃力 #-------------------------------------------------------------------------- def attack_element_rate element_rate_set return @attack_element_rate end #-------------------------------------------------------------------------- # ○ スキル属性攻撃力レート #-------------------------------------------------------------------------- def skill_element_rate element_rate_set return @skill_element_rate end #-------------------------------------------------------------------------- # ● 通常攻撃によるダメージ計算 # attacker : 攻撃者 # 結果は @hp_damage に代入する。 #-------------------------------------------------------------------------- def make_attack_damage_value(attacker) damage = attacker.atk * 4 - self.def * 2 # 基本計算 damage = 0 if damage < 0 # マイナスなら 0 に damage = attack_elements_rate(attacker,damage) # 属性修正 if damage == 0 # ダメージが 0 damage = rand(2) # 1/2 の確率で 1 ダメージ elsif damage > 0 # ダメージが正の数 @critical = (rand(100) < attacker.cri) # クリティカル判定 @critical = false if prevent_critical # クリティカル防止? damage *= 3 if @critical # クリティカル修正 end damage = apply_variance(damage, 20) # 分散 damage = apply_guard(damage) # 防御修正 @hp_damage = damage # HP にダメージ end #-------------------------------------------------------------------------- # ● スキルまたはアイテムによるダメージ計算 # user : スキルまたはアイテムの使用者 # obj : スキルまたはアイテム # 結果は @hp_damage または @mp_damage に代入する。 #-------------------------------------------------------------------------- def make_obj_damage_value(user, obj) damage = obj.base_damage # 基本ダメージを取得 if damage > 0 # ダメージが正の数 damage += user.atk * 4 * obj.atk_f / 100 # 打撃関係度: 使用者 damage += user.spi * 2 * obj.spi_f / 100 # 精神関係度: 使用者 unless obj.ignore_defense # 防御力無視以外 damage -= self.def * 2 * obj.atk_f / 100 # 打撃関係度: 対象者 damage -= self.spi * 1 * obj.spi_f / 100 # 精神関係度: 対象者 end damage = 0 if damage < 0 # マイナスなら 0 に elsif damage < 0 # ダメージが負の数 damage -= user.atk * 4 * obj.atk_f / 100 # 打撃関係度: 使用者 damage -= user.spi * 2 * obj.spi_f / 100 # 精神関係度: 使用者 end damage = skill_elements_rate(user,obj,damage) # 属性修正 damage = apply_variance(damage, obj.variance) # 分散 damage = apply_guard(damage) # 防御修正 if obj.damage_to_mp @mp_damage = damage # MP にダメージ else @hp_damage = damage # HP にダメージ end end #-------------------------------------------------------------------------- # ○ 通常攻撃属性修正値の取得 # attacker : 攻撃者 #-------------------------------------------------------------------------- def attack_elements_rate(attacker,damage) return damage if attacker.element_set.empty? # 無属性の場合 sum_damage = 0 for i in attacker.element_set sum_damage += damage * attacker.attack_element_rate[i] * element_rate_set_def("",i) * element_rate(i) / 1000000 end return sum_damage end #-------------------------------------------------------------------------- # ○ スキル属性修正値の取得 # user : 使用者 # obj : スキル又はアイテム #-------------------------------------------------------------------------- def skill_elements_rate(user, obj, damage) return damage if obj.element_set.empty? # 無属性の場合 sum_damage = 0 for i in obj.element_set sum_damage += damage * obj.element_rate[i] * user.skill_element_rate[i] * element_rate_set_def("skill",i) * element_rate(i) / 100000000 end return sum_damage end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ○ アクターのデフォルト属性攻撃力 #-------------------------------------------------------------------------- def element_rate_set_def(tag,i) unless tag == "skill" # アクター固有のデフォルト通常属性攻撃力か? if ACTOR_ATTACK_ELEMENT_RATE.include?(self.id) if ACTOR_ATTACK_ELEMENT_RATE[self.id].include?(i) return ACTOR_ATTACK_ELEMENT_RATE[self.id][i] end end return DEFORLT_ATTACK_ELEMENT_RATE else # アクター固有のデフォルトスキル属性攻撃力か? if ACTOR_SKILL_ELEMENT_RATE.include?(self.id) if ACTOR_SKILL_ELEMENT_RATE[self.id].include?(i) return ACTOR_SKILL_ELEMENT_RATE[self.id][i] end end return DEFORLT_SKILL_ELEMENT_RATE end end #-------------------------------------------------------------------------- # ○ アクターの属性攻撃力 #-------------------------------------------------------------------------- def element_rate_set @attack_element_rate = {} @skill_element_rate = {} for i in 1..$data_system.elements.size @attack_element_rate[i] = 100 @skill_element_rate[i] = 100 for equip in equips.compact next if !equip.attack_element_rate.include?(i) @attack_element_rate[i] = @attack_element_rate[i] * equip.attack_element_rate[i] / 100 end for equip in equips.compact next if !equip.skill_element_rate.include?(i) @skill_element_rate[i] = @skill_element_rate[i] * equip.skill_element_rate[i] / 100 end if WEAPON_REDUCE_ELEMENT && self.weapons.compact.size > 0 @attack_element_rate[i] /= self.weapons.compact.size end end end end