#============================================================================== # ■ Numset #------------------------------------------------------------------------------ #  定数全般のモジュールです。 #============================================================================== module Numset STATE_PLUS = "ステート追加" # ステート追加の属性 STATE_MINUS = "ステート解除" # ステート解除の属性 # 属性補正テーブル。それぞれ属性有効度の(A, B, C, D, E, F)にあたる。 STATE_TABLE = [150, 125, 100, 50, 25, 0] end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● ステート変化 (+) の適用 # plus_state_set : ステート変化 (+) #-------------------------------------------------------------------------- def states_plus(attacker, skill = nil) # 有効フラグをクリア effective = false # ステートの種類と確率を調査 states = {} if skill.nil? if Game_Battler.method_defined?("multy_element_set") set = attacker.multy_element_set elsif Game_Battler.method_defined?("equip_element_set") set = attacker.equip_element_set else set = attacker.element_set end else if Game_Battler.method_defined?("multy_element_set") set = attacker.skill_element_set(skill) else set = skill.element_set end end for d in $data_states next if d.nil? returnar = XRXS.element_check(set, "#{d.name}追加") if returnar[0] states[d.id] = returnar[2] end if XRXS.element_include?(set, "#{d.name}追加強制") states[d.id] = true end end # ステート発生率補正 if XRXS.element_include?(set, Numset::STATE_PLUS) rate = (100 + XRXS.element_percent(set, Numset::STATE_PLUS)) else rate = 100 end # ループ (付加するステート) for i in states.keys # このステートがフルでなければ有効フラグをセット effective |= self.state_full?(i) == false # ステートが [抵抗しない] の場合 if $data_states[i].nonresistance if rand(100) < (states[i] * rate / 100) # ステート変化フラグをセット @state_changed = true # ステートを付加 add_state(i) end # このステートがフルではない場合 elsif self.state_full?(i) == false # 強制付加ステートならば if states[i] == true # ステート変化フラグをセット @state_changed = true # ステートを付加 add_state(i) # ステート有効度を確率に変換し、乱数と比較 else if rand(100) < (states[i] * rate * self.state_rate(i) / 10000) # ステート変化フラグをセット @state_changed = true # ステートを付加 add_state(i) end end end end # メソッド終了 return effective end #-------------------------------------------------------------------------- # ● ステート変化 (-) の適用 # minus_state_set : ステート変化 (-) #-------------------------------------------------------------------------- def states_minus(attacker, skill = nil) # 有効フラグをクリア effective = false # ステートの種類と確率を調査 states = {} if skill.nil? if Game_Battler.method_defined?("multy_element_set") set = attacker.multy_element_set elsif Game_Battler.method_defined?("equip_element_set") set = attacker.equip_element_set else set = attacker.element_set end else if Game_Battler.method_defined?("multy_element_set") set = attacker.skill_element_set(skill) else set = skill.element_set end end for d in $data_states next if d.nil? if XRXS.element_include?(set, "#{d.name}解除") states[d.id] = XRXS.element_percent(set, "#{d.name}解除") end end # ステート解除率の補正 if XRXS.element_include?(set, Numset::STATE_MINUS) rate = (100 + XRXS.element_percent(set, Numset::STATE_MINUS)) else rate = 100 end # ループ (解除するステート) for i in states.keys if rand(100) < (states[i] * rate / 100) # このステートが付加されていれば有効フラグをセット effective |= self.state?(i) # ステート変化フラグをセット @state_changed = true # ステートを解除 remove_state(i) end end # メソッド終了 return effective end #-------------------------------------------------------------------------- # ● 通常攻撃の効果適用 # attacker : 攻撃者 (バトラー) #-------------------------------------------------------------------------- def attack_effect(attacker) # クリティカルフラグをクリア self.critical = false # 命中計算 hit = (attacker.hp * 20 / attacker.maxhp) + 80 # 基本ダメージを計算 self.damage = ((attacker.str ** 3 * attacker.atk ** 2) ** 0.3).round # 属性修正 self.damage *= elements_correct(attacker.element_set) self.damage /= 100 # クリティカル修正 if rand(100) < attacker.dex self.critical = true self.damage *= 2 end # ダメージの符号が正の場合 if self.damage > 0 # 防御力修正 self.damage = self.damage * 120 / (self.pdef ** 1.5 + 119) # 防御修正 if self.guarding? self.damage /= 2 end end # 分散 if self.damage.abs > 0 and attacker.current_action.add_variance == 0 seed = rand(33) - 16 self.damage += (seed * self.damage / 256) end # 命中判定 hit = hit * attacker.hit * (100 - self.eva) / 10000 hit = self.cant_evade? ? 100 : hit hit_result = (rand(100) < hit) # 命中の場合 if hit_result self.damage = self.damage.round # ステート衝撃解除 if self.damage >= 0 remove_states_shock end # HP からダメージを減算 self.hp -= self.damage # ステート変化 @state_changed = false states_plus(attacker) states_minus(attacker) # ミスの場合 else # ダメージに "Miss" を設定 self.damage = "Miss" # クリティカルフラグをクリア self.critical = false end # メソッド終了 return true end #-------------------------------------------------------------------------- # ● スキルの効果適用 # user : スキルの使用者 (バトラー) # skill : スキル #-------------------------------------------------------------------------- def skill_effect(user, skill) # クリティカルフラグをクリア self.critical = false # スキルの効果範囲が HP 1 以上の味方で、自分の HP が 0 の場合 if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) # メソッド終了 return false end # 有効フラグをクリア effective = false # コモンイベント ID が有効の場合は有効フラグをセット effective |= skill.common_event_id > 0 # 第一命中判定 hit_ = (user.hp * 10 / user.maxhp) + 90 # 不確実なスキルの場合は有効フラグをセット effective |= hit < 100 # 基本ダメージを計算 if skill.atk_f > skill.int_f base = Math.sqrt(user.str ** 2 * skill.power.abs ** 3) * user.atk else base = Math.sqrt(user.int ** 2 * skill.power.abs ** 3) * user.int end self.damage = Math.sqrt(base) * 2 if skill.power < 0 self.damage = -1 end # クリティカル修正 if rand(100) < skill.dex_f self.damage *= 2 self.critical = true end # ダメージの符号が正の場合 if self.damage > 0 # 防御力修正 if XRXS.element_include?(user.skill_element_set(skill), XRXS19::ATTACK) self.damage = self.damage * 120 / (self.pdef ** 1.5 + 119) elsif XRXS.element_include?(user.skill_element_set(skill), XRXS19::MAGIC) self.damage = self.damage * 120 / (self.mdef ** 1.5 + 119) else self.damage = self.damage * 120 / ((self.mdef * self.pdef) ** 0.75 + 119) end # 防御修正 if self.guarding? self.damage /= 2 end end # 分散 if skill.variance > 0 and self.damage.abs > 0 amp = [self.damage.abs * skill.variance / XRXS19::VARY_BASE, 0].max self.damage += rand(amp * 2 + 1) - amp end # 命中判定 eva = 100 - self.eva hit1 = hit * skill.hit * eva / 10000 hit2 = self.cant_evade? ? 100 : hit1 hit_result = (rand(100) < hit2) # 不確実なスキルの場合は有効フラグをセット effective |= hit < 100 # 命中の場合 if hit_result self.damage = self.damage.round # ダメージ 0 以上の攻撃の場合 if self.damage > 0 # ステート衝撃解除 remove_states_shock # 有効フラグをセット effective = true end # HP からダメージを減算 last_hp = self.hp self.hp -= self.damage effective |= self.hp != last_hp # ステート変化 @state_changed = false effective |= states_plus(user, skill) effective |= states_minus(user, skill) # 威力が 0 の場合 if skill.power == 0 # ダメージに空文字列を設定 self.damage = "" # ステートに変化がない場合 unless @state_changed # ダメージに "Guard" を設定 self.damage = "Guard" end end # ミスの場合 else # ダメージに "Miss" を設定 self.damage = "Miss" end # 戦闘中でない場合 unless $game_temp.in_battle # ダメージに nil を設定 self.damage = nil end # メソッド終了 return effective end #-------------------------------------------------------------------------- # ● アイテムの効果適用 # item : アイテム #-------------------------------------------------------------------------- def item_effect(item) # クリティカルフラグをクリア self.critical = false # アイテムの効果範囲が HP 1 以上の味方で、自分の HP が 0の場合 if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or # メソッド終了 return false end # 有効フラグをクリア effective = false # コモンイベント ID が有効の場合は有効フラグをセット effective |= item.common_event_id > 0 # 命中判定 hit_result = (rand(100) < item.hit) # 不確実なスキルの場合は有効フラグをセット effective |= item.hit < 100 # 命中の場合 if hit_result == true # 回復量を計算 recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp if recover_hp < 0 recover_hp += self.pdef * item.pdef_f / 20 recover_hp += self.mdef * item.mdef_f / 20 recover_hp = [recover_hp, 0].min end # 属性修正 recover_hp *= elements_correct(item.element_set) recover_hp /= 100 recover_sp *= elements_correct(item.element_set) recover_sp /= 100 # 分散 if item.variance > 0 and recover_hp.abs > 0 seed = rand(item.variance * 2 + 1) - item.variance recover_hp += (recover_hp * seed / 256) end if item.variance > 0 and recover_sp.abs > 0 seed = rand(item.variance * 2 + 1) - item.variance recover_sp += (recover_sp * seed / 256) end # 回復量の符号が負の場合 if recover_hp < 0 # 防御修正 if self.guarding? recover_hp /= 2 end end # HP 回復量の符号を反転し、ダメージの値に設定 self.damage = -recover_hp # HP および SP を回復 last_hp = self.hp last_sp = self.sp self.hp += recover_hp self.sp += recover_sp effective |= self.hp != last_hp effective |= self.sp != last_sp # ステート変化 @state_changed = false effective |= states_plus(item) effective |= states_minus(item) # パラメータ上昇値が有効の場合 if item.parameter_type > 0 and item.parameter_points != 0 # パラメータで分岐 case item.parameter_type when 1 # MaxHP @maxhp_plus += item.parameter_points when 2 # MaxSP @maxsp_plus += item.parameter_points when 3 # 腕力 @str_plus += item.parameter_points when 4 # 器用さ @dex_plus += item.parameter_points when 5 # 素早さ @agi_plus += item.parameter_points when 6 # 魔力 @int_plus += item.parameter_points end # 有効フラグをセット effective = true end # HP 回復率と回復量が 0 の場合 if item.recover_hp_rate == 0 and item.recover_hp == 0 # ダメージに空文字列を設定 self.damage = "" # SP 回復率と回復量が 0、パラメータ上昇値が無効の場合 if item.recover_sp_rate == 0 and item.recover_sp == 0 and (item.parameter_type == 0 or item.parameter_points == 0) # ステートに変化がない場合 unless @state_changed # ダメージに "Miss" を設定 self.damage = "Miss" end end end # ミスの場合 else # ダメージに "Miss" を設定 self.damage = "Miss" end # 戦闘中でない場合 unless $game_temp.in_battle # ダメージに nil を設定 self.damage = nil end # メソッド終了 return effective end #-------------------------------------------------------------------------- # ● ステート有効率の設定 #-------------------------------------------------------------------------- def state_rate(state_id) state = $data_states[state_id] # テーブルからレートを抜き出す rate = Numset::STATE_TABLE[self.state_ranks[state_id] - 1] # 相手の耐性を確認 result = XRXS.element_check(self.multy_element_set, "#{state.name}防御") if result[0] rate = rate * (100 - result[2]) / 100 end return rate end end