193 lines
No EOL
6.8 KiB
Ruby
193 lines
No EOL
6.8 KiB
Ruby
#==============================================================================
|
||
# ■ 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 |