#==============================================================================
# ■ RGSS3 吸収通常攻撃特徴 Ver1.00 by 星潟
#------------------------------------------------------------------------------
# ステート付加:通常攻撃の攻撃を行った際
# 一定確率でダメージのうち一定割合分のHPを吸収するか
# 自らのMPとして変換する特徴を作成できるようになります。
# HP吸収の場合はHP吸収発動率とHP吸収割合の設定が必要となります。
# 同様に、MP変換の場合はMP変換発動率とMP変換割合の設定が必要となります。
#
# 例1 特徴に下記のように書き込んだ場合
# <HP吸収発動率:50>
# <HP吸収割合:50>
#
# 50%の確率でHPダメージのうち50%を自らのHPとして吸収する。
#
# 例2 特徴に下記のように書き込んだ場合
# <MP変換発動率:25>
# <MP変換割合:100>
#
# 25%の確率でHPダメージのうち100%を自らのMPとして回復する。
#==============================================================================
module DRAIN_ATTACK
#HP吸収時のメッセージ表示方法をデフォルトから変更するか?
M_C = true
#HP吸収攻撃発動率設定用キーワード(変更不要)
HPD = "HP吸収発動率"
#MP変換攻撃発動率設定用キーワード(変更不要)
MPD = "MP変換発動率"
#HP吸収割合設定用キーワード(変更不要)
HPDR = "HP吸収割合"
#MP変換割合設定用キーワード(変更不要)
MPDR = "MP変換割合"
#アクターMP吸収時メッセージ
MESS1 = "%s 吸收了 %s 点生命值!"
#エネミーMP吸収時メッセージ
MESS2 = "%sを %s 回復した!"
end
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 使用効果[ステート付加]:通常攻撃
#--------------------------------------------------------------------------
alias item_effect_add_state_attack_drain item_effect_add_state_attack
def item_effect_add_state_attack(user, item, effect)
item_effect_add_state_attack_drain(user, item, effect)
return if user == nil or item == nil
if rand(100) < user.at_h_drain_execute_rate
if !DRAIN_ATTACK::M_C
@result.hp_drain = @result.hp_damage * user.h_drain_rate / 100
@result.hp_drain = [@result.hp_drain, @result.pre_hp].min
user.hp += @result.hp_drain if !user.dead?
else
@result.exhp_drain = @result.hp_damage * user.h_drain_rate / 100
@result.exhp_drain = [@result.exhp_drain, @result.pre_hp].min
user.hp += @result.exhp_drain if !user.dead?
end
end
if rand(100) < user.at_m_drain_execute_rate
if !DRAIN_ATTACK::M_C
@result.mp_drain = @result.hp_damage * user.m_drain_rate / 100
@result.mp_drain = [@result.mp_drain, @result.pre_hp].min
user.mp += @result.mp_drain if !user.dead?
else
@result.exmp_drain = @result.hp_damage * user.m_drain_rate / 100
@result.exmp_drain = [@result.exmp_drain, @result.pre_hp].min
user.mp += @result.exmp_drain if !user.dead?
end
end
end
def at_h_drain_execute_rate
rate = 0
feature_objects.each do |object|
data = object.note
data.each_line { |line|
memo = line.scan(/<#{DRAIN_ATTACK::HPD}[::](\S+)>/)
memo = memo.flatten
rate += memo[0].to_i if memo != nil && !memo.empty?
}
end
return rate
end
def at_m_drain_execute_rate
rate = 0
feature_objects.each do |object|
data = object.note
data.each_line { |line|
memo = line.scan(/<#{DRAIN_ATTACK::MPD}[::](\S+)>/)
memo = memo.flatten
rate += memo[0].to_i if memo != nil && !memo.empty?
}
end
return rate
end
def h_drain_rate
rate = 0
feature_objects.each do |object|
data = object.note
data.each_line { |line|
memo = line.scan(/<#{DRAIN_ATTACK::HPDR}[::](\S+)>/)
memo = memo.flatten
rate += memo[0].to_i if memo != nil && !memo.empty?
}
end
return rate
end
def m_drain_rate
rate = 0
feature_objects.each do |object|
data = object.note
data.each_line { |line|
memo = line.scan(/<#{DRAIN_ATTACK::MPDR}[::](\S+)>/)
memo = memo.flatten
rate += memo[0].to_i if memo != nil && !memo.empty?
}
end
return rate
end
end
class Game_ActionResult
attr_accessor :exhp_drain
attr_accessor :exmp_drain
attr_accessor :pre_hp
#--------------------------------------------------------------------------
# ● ダメージ値のクリア
#--------------------------------------------------------------------------
alias clear_damage_values_drain clear_damage_values
def clear_damage_values
clear_damage_values_drain
@exhp_drain = 0
@exmp_drain = 0
@pre_hp = 0
end
#--------------------------------------------------------------------------
# ● ダメージの作成
#--------------------------------------------------------------------------
alias make_damage_drain make_damage
def make_damage(value, item)
@pre_hp = @battler.hp
make_damage_drain(value, item)
end
#--------------------------------------------------------------------------
# ● HP 吸収の文章を取得
#--------------------------------------------------------------------------
def hp_damage_exdrain_text
fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
sprintf(fmt, @battler.name, Vocab::hp, @exhp_drain)
end
#--------------------------------------------------------------------------
# ● MP 吸収の文章を取得
#--------------------------------------------------------------------------
def mp_damage_exdrain_text
fmt = @battler.actor? ? DRAIN_ATTACK::MESS1 : DRAIN_ATTACK::MESS2
if !DRAIN_ATTACK::M_C
mpd = @mp_drain
else
mpd = @exmp_drain
end
sprintf(fmt, Vocab::mp, mpd, "")
end
end
class Window_BattleLog < Window_Selectable
#--------------------------------------------------------------------------
# ● HP ダメージ表示
#--------------------------------------------------------------------------
alias display_hp_damage_drain display_hp_damage
def display_hp_damage(target, item)
display_hp_damage_drain(target, item)
if target.result.exhp_drain > 0 && DRAIN_ATTACK::M_C
add_text(target.result.hp_damage_exdrain_text)
wait
end
if (target.result.mp_drain > 0 && !DRAIN_ATTACK::M_C) or
(target.result.exmp_drain > 0 && DRAIN_ATTACK::M_C)
add_text(target.result.mp_damage_exdrain_text)
wait
end
end
end