#==============================================================================
# ■ 生死問わず回復 By 貪藻矢射妥←
#
# その名の通り、生死を問わず回復を行います。
#
#==============================================================================
# 更新っぽいもの
#
# 2009:09:14
# ・生死問わず回復どころか生死問わず攻撃(死体に鞭打つこと)までも可能だったのを
# やめることに。
# ・他スクリプトとの競合でエラー落ちするかもしれないことを回避
#
# 2016:03:01
# ・武器による命中精度対応
module RDOA
# 超回復属性
RECV_HYPER = 22
end
class Game_Battler
include RDOA
include BM
#--------------------------------------------------------------------------
# ● スキルの効果適用
# user : スキルの使用者 (バトラー)
# skill : スキル
#--------------------------------------------------------------------------
def skill_effect(user, skill)
# クリティカルフラグをクリア
self.critical = false
# スキルの効果範囲が HP 1 以上の味方で、自分の HP が 0、
# またはスキルの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
# 上記の状態で生死問わず回復スキルでない場合
if !skill.element_set.include?(RECV_HYPER)
# メソッド終了
return false
end
end
# 有効フラグをクリア
effective = false
# コモンイベント ID が有効の場合は有効フラグをセット
effective |= skill.common_event_id > 0
# 第一命中判定
hit = skill.hit
if skill.atk_f > 0
hit *= user.hit / 100
end
if $OuterFlgs["Weapon_HitRate"]
base_hitrate = get_hitrate_base(user)
else
base_hitrate = 100
end
hit_result = (rand(base_hitrate) < hit)
# 不確実なスキルの場合は有効フラグをセット
effective |= hit < 100
# 命中の場合
if hit_result == true
# 威力を計算
power = skill.power + user.atk * skill.atk_f / 100
if power > 0
power -= self.pdef * skill.pdef_f / 200
power -= self.mdef * skill.mdef_f / 200
power = [power, 0].max
end
# 倍率を計算
rate = 20
rate += (user.str * skill.str_f / 100)
rate += (user.dex * skill.dex_f / 100)
rate += (user.agi * skill.agi_f / 100)
rate += (user.int * skill.int_f / 100)
# 基本ダメージを計算
self.damage = power * rate / 20
# 属性修正
self.damage *= elements_correct(skill.element_set)
self.damage /= 100
# ダメージの符号が正の場合
if self.damage > 0
# 防御修正
if self.guarding?
self.damage /= 2
end
end
# 分散
if skill.variance > 0 and self.damage.abs > 0
amp = [self.damage.abs * skill.variance / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# 第二命中判定
#eva = 8 * self.agi / user.dex + self.eva
eva = 8 * self.agi / user.dex + self.eva / 80.0
hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
# Luk補正
if MINTO::RGSS["parameter_addition"] and user.is_a?(Game_Enemy)
#hit = [hit - Math.log(self.luk), 5].max
hit = [hit - self.luk / 40.0, 5].max
end
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(base_hitrate) < hit)
# 不確実なスキルの場合は有効フラグをセット
effective |= hit < 100
end
# 命中の場合
if hit_result == true
# 威力 0 以外の物理攻撃の場合
if skill.power != 0 and skill.atk_f > 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(skill.plus_state_set)
effective |= states_minus(skill.minus_state_set)
# 生死問わず回復の場合、強制的に戦闘不能を解除する
if skill.element_set.include?(RECV_HYPER)
effective |= states_minus([1])
end
# 威力が 0 の場合
if skill.power == 0
# ダメージに空文字列を設定
self.damage = ""
# ステートに変化がない場合
unless @state_changed
# ダメージに "Miss" を設定
self.damage = MISS_WORD
end
end
# ミスの場合
else
# ダメージに "Miss" を設定
self.damage = MISS_WORD
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、
# またはアイテムの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合
if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
((item.scope == 5 or item.scope == 6) and self.hp >= 1)
# 上記の状態で生死問わず回復スキルでない場合
if !skill.element_set.include?(RECV_HYPER)
# メソッド終了
return false
end
end
# 有効フラグをクリア
effective = false
# コモンイベント ID が有効の場合は有効フラグをセット
effective |= item.common_event_id > 0
# 命中判定
if $OuterFlgs["Weapon_HitRate"]
base_hitrate = get_hitrate_base(self, false)
else
base_hitrate = 100
end
hit_result = (rand(base_hitrate) < 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
amp = [recover_hp.abs * item.variance / 100, 1].max
recover_hp += rand(amp+1) + rand(amp+1) - amp
end
if item.variance > 0 and recover_sp.abs > 0
amp = [recover_sp.abs * item.variance / 100, 1].max
recover_sp += rand(amp+1) + rand(amp+1) - amp
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.plus_state_set)
effective |= states_minus(item.minus_state_set)
# 生死問わず回復の場合、強制的に戦闘不能を解除する
if skill.element_set.include?(RECV_HYPER)
effective |= states_minus([1])
end
# パラメータ上昇値が有効の場合
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_WORD
end
end
end
# ミスの場合
else
# ダメージに "Miss" を設定
self.damage = MISS_WORD
end
# 戦闘中でない場合
unless $game_temp.in_battle
# ダメージに nil を設定
self.damage = nil
end
# メソッド終了
return effective
end
end
class Scene_Battle
include RDOA
#--------------------------------------------------------------------------
# ● スキルまたはアイテムの対象側バトラー設定
# scope : スキルまたはアイテムの効果範囲
#--------------------------------------------------------------------------
alias diamond_set_target_battlers set_target_battlers
def set_target_battlers(scope)
#呼び戻す
diamond_set_target_battlers(scope)
@recover_flg = false
# 他サイトのスクリプトとの競合を考えて(武器の全体攻撃とか)
# スキルがnilの場合は処理を行わない
if @skill != nil && @skill.element_set.include?(RECV_HYPER)
@recover_flg = true
end
# 行動側バトラーがエネミーの場合
if @active_battler.is_a?(Game_Enemy)
change_enemy = $game_party.actors
change_friend = $game_troop.enemies
# 行動側バトラーがアクターの場合
elsif @active_battler.is_a?(Game_Actor)
change_enemy = $game_troop.enemies
change_friend = $game_party.actors
end
# 生死問わず回復スキルが設定される場合で除外されていたターゲットを追加
case scope
when 4 # 味方全体
for obj in change_friend
if !obj.exist? && @recover_flg
@target_battlers.push(obj)
end
end
when 5 # 味方単体 (HP 0)
index = @active_battler.current_action.target_index
obj = change_friend[index]
if obj != nil && !obj.hp0? && @recover_flg
@target_battlers.push(obj)
end
when 6 # 味方全体 (HP 0)
for obj in change_friend
if obj != nil && !obj.hp0? && @recover_flg
@target_battlers.push(obj)
end
end
end
end
end
|