#==============================================================================
# $SDrop$
# 吸血效果 By猫易箱
#------------------------------------------------------------------------------
# 更新日志:
# 支持 物理反击 和 魔法反射
#------------------------------------------------------------------------------
# 在 角色、职业、技能、武器、护甲、敌人、状态 备注使用:
#
# <吸血A 20%> - 通用吸血:让持有者造成伤害时,产生吸血效果
# <吸血B 20%> - 技能吸血:技能专用!让技能自带吸血效果
# <吸血C 20%> - 暴击吸血:A的变种,暴击时产生吸血效果
#
# <吸血加成 100%> - 攻击方的吸血修正(大于100%增加,小于100%减少)
# <吸血抗性 100%> - 受击方的吸血修正(大于100%增加,小于100%减少)
#
# 吸血公式:伤害 × 吸血率 × 吸血加成 × 吸血抗性
# 战斗消息显示:XXX受到了100点的伤害!被偷取了50HP!
#
#==============================================================================
$imported = {} if $imported.nil?
$imported["SDrop_LifeSteal"] = true
#==============================================================================
# ■ RPG::BaseItem
#==============================================================================
class RPG::BaseItem
#--------------------------------------------------------------------------
# ● 获取吸血A比率
#--------------------------------------------------------------------------
def life_steal_a_rate
@life_steal_a_rate ||= load_life_steal_a_rate
end
#--------------------------------------------------------------------------
# ● 加载吸血A比率
#--------------------------------------------------------------------------
def load_life_steal_a_rate
self.note =~ /<吸血A\s*(\d+)%>/i ? $1.to_i / 100.0 : 0.0
end
#--------------------------------------------------------------------------
# ● 获取吸血C比率(暴击时触发)
#--------------------------------------------------------------------------
def life_steal_c_rate
@life_steal_c_rate ||= load_life_steal_c_rate
end
#--------------------------------------------------------------------------
# ● 加载吸血C比率
#--------------------------------------------------------------------------
def load_life_steal_c_rate
self.note =~ /<吸血C\s*(\d+)%>/i ? $1.to_i / 100.0 : 0.0
end
#--------------------------------------------------------------------------
# ● 获取吸血修正倍率
#--------------------------------------------------------------------------
def life_steal_mod_rate
@life_steal_mod_rate ||= load_life_steal_mod_rate
end
#--------------------------------------------------------------------------
# ● 加载吸血修正倍率
#--------------------------------------------------------------------------
def load_life_steal_mod_rate
self.note =~ /<吸血加成\s*(\d+)%>/i ? $1.to_i / 100.0 : 1.0
end
#--------------------------------------------------------------------------
# ● 获取吸血抗性倍率
#--------------------------------------------------------------------------
def life_steal_resist_rate
@life_steal_resist_rate ||= load_life_steal_resist_rate
end
#--------------------------------------------------------------------------
# ● 加载吸血抗性
#--------------------------------------------------------------------------
def load_life_steal_resist_rate
self.note =~ /<吸血抗性\s*(\d+)%>/i ? $1.to_i / 100.0 : 1.0
end
end
#==============================================================================
# ■ RPG::Skill
#==============================================================================
class RPG::Skill
#--------------------------------------------------------------------------
# ● 获取吸血B比率(技能单独使用)
#--------------------------------------------------------------------------
def life_steal_b_rate
@life_steal_b_rate ||= load_life_steal_b_rate
end
#--------------------------------------------------------------------------
# ● 加载吸血B比率
#--------------------------------------------------------------------------
def load_life_steal_b_rate
self.note =~ /<吸血B\s*(\d+)%>/i ? $1.to_i / 100.0 : 0.0
end
end
#==============================================================================
# ■ Game_BattlerBase
#==============================================================================
class Game_BattlerBase
#--------------------------------------------------------------------------
# ● 获取总吸血A比率(从所有特性中累计)
#--------------------------------------------------------------------------
def life_steal_a_total
result = 0.0
feature_objects.each do |obj|
result += obj.life_steal_a_rate if obj.respond_to?(:life_steal_a_rate)
end
[[result, 1.0].min, 0.0].max
end
#--------------------------------------------------------------------------
# ● 获取总吸血C比率(从所有特性中累计)
#--------------------------------------------------------------------------
def life_steal_c_total
result = 0.0
feature_objects.each do |obj|
result += obj.life_steal_c_rate if obj.respond_to?(:life_steal_c_rate)
end
[[result, 1.0].min, 0.0].max
end
#--------------------------------------------------------------------------
# ● 获取总吸血加成倍率(所有修正倍率的乘积)
#--------------------------------------------------------------------------
def life_steal_mod_total
result = 1.0
feature_objects.each do |obj|
if obj.respond_to?(:life_steal_mod_rate)
result *= obj.life_steal_mod_rate
end
end
result
end
#--------------------------------------------------------------------------
# ● 获取总吸血抗性倍率(所有抗性倍率的乘积)
#--------------------------------------------------------------------------
def life_steal_resist_total
result = 1.0
feature_objects.each do |obj|
if obj.respond_to?(:life_steal_resist_rate)
result *= obj.life_steal_resist_rate
end
end
result
end
end
#==============================================================================
# ■ Game_ActionResult
#==============================================================================
class Game_ActionResult
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_accessor :life_steal # 吸血量
attr_accessor :life_steal_active # 是否触发吸血
attr_accessor :life_steal_c_trigger # 是否由暴击触发
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
alias life_steal_initialize initialize
def initialize(battler)
life_steal_initialize(battler)
@life_steal = 0
@life_steal_active = false
@life_steal_c_trigger = false
end
#--------------------------------------------------------------------------
# ● 清除
#--------------------------------------------------------------------------
alias life_steal_clear clear
def clear
life_steal_clear
@life_steal = 0
@life_steal_active = false
@life_steal_c_trigger = false
end
#--------------------------------------------------------------------------
# ● 生成伤害
#--------------------------------------------------------------------------
alias life_steal_make_damage make_damage
def make_damage(value, item)
life_steal_make_damage(value, item)
@life_steal = @hp_damage if @hp_damage > 0 && @hp_drain == 0
end
#--------------------------------------------------------------------------
# ● 获取HP伤害的文字(包含吸血信息)
#--------------------------------------------------------------------------
def hp_damage_text
if @life_steal_active && @hp_damage > 0
if @life_steal_c_trigger
# 暴击触发的吸血特殊显示
fmt = @battler.actor? ? "%s受到了%s点的伤害!被偷取了%sHP!" : "%s受到了%s点的伤害!被偷取了%sHP!"
else
fmt = @battler.actor? ? "%s受到了%s点的伤害!被偷取了%sHP!" : "%s受到了%s点的伤害!被偷取了%sHP!"
end
sprintf(fmt, @battler.name, @hp_damage, @life_steal)
elsif @hp_drain > 0
fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
elsif @hp_damage > 0
fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
sprintf(fmt, @battler.name, @hp_damage)
elsif @hp_damage < 0
fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
else
fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
sprintf(fmt, @battler.name)
end
end
end
#==============================================================================
# ■ Game_Action
#==============================================================================
class Game_Action
#--------------------------------------------------------------------------
# ● 获取技能/物品的总吸血率
#--------------------------------------------------------------------------
def total_life_steal_rate
rate = 0.0
# 类型A:从所有特性中累计
rate += subject.life_steal_a_total
# 类型B:从当前技能中获取(如果存在)
if item && item.respond_to?(:life_steal_b_rate)
rate += item.life_steal_b_rate
end
# 类型C:暴击时触发,这里先记录,实际触发在item_apply中判断
@life_steal_c_rate = subject.life_steal_c_total
[[rate, 1.0].min, 0.0].max
end
#--------------------------------------------------------------------------
# ● 获取技能/物品的暴击吸血率
#--------------------------------------------------------------------------
def life_steal_c_rate
@life_steal_c_rate || 0.0
end
#--------------------------------------------------------------------------
# ● 判定是否有吸血效果(普通吸血)
#--------------------------------------------------------------------------
def life_steal?
total_life_steal_rate > 0
end
#--------------------------------------------------------------------------
# ● 判定是否有暴击吸血效果
#--------------------------------------------------------------------------
def life_steal_c?
life_steal_c_rate > 0
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 应用技能/物品的效果
#--------------------------------------------------------------------------
alias life_steal_item_apply item_apply
def item_apply(user, item)
# 记录吸血率
@life_steal_rate = 0
@life_steal_c_rate = 0
@life_steal_mod = 1.0
@life_steal_resist = 1.0
# 获取吸血率 - 直接从user身上获取,不依赖于current_action
if user.respond_to?(:life_steal_a_total)
@life_steal_rate = user.life_steal_a_total
end
# 技能吸血B(从技能本身获取)
if item && item.respond_to?(:life_steal_b_rate)
@life_steal_rate += item.life_steal_b_rate
end
# 暴击吸血C
if user.respond_to?(:life_steal_c_total)
@life_steal_c_rate = user.life_steal_c_total
end
# 吸血加成
if user.respond_to?(:life_steal_mod_total)
@life_steal_mod = user.life_steal_mod_total
end
# 执行原处理(会调用make_damage_value)
life_steal_item_apply(user, item)
# 处理吸血效果 - 使用最终伤害
damage_for_steal = @result.hp_damage
if damage_for_steal > 0 && @result.hp_drain == 0
@life_steal_resist = self.life_steal_resist_total
base_steal = 0
is_critical_steal = false
if @life_steal_rate > 0
base_steal = (damage_for_steal * @life_steal_rate).to_i
end
if @result.critical && @life_steal_c_rate > 0
c_steal = (damage_for_steal * @life_steal_c_rate).to_i
base_steal += c_steal
is_critical_steal = true
end
if base_steal > 0
if @life_steal_mod != 1.0
base_steal = (base_steal * @life_steal_mod).to_i
end
if @life_steal_resist != 1.0
base_steal = (base_steal * @life_steal_resist).to_i
end
if base_steal > 0
@result.life_steal = base_steal
@result.life_steal_active = true
@result.life_steal_c_trigger = is_critical_steal
user.hp += base_steal
# 播放恢复音效(不喜欢的可自行修改或删除)
Sound.play_recovery if user.actor?
end
end
end
@life_steal_rate = 0
@life_steal_c_rate = 0
@life_steal_mod = 1.0
@life_steal_resist = 1.0
end
end
#==============================================================================
# ■ Window_BattleLog
#==============================================================================
class Window_BattleLog
#--------------------------------------------------------------------------
# ● 显示HP伤害
#--------------------------------------------------------------------------
def display_hp_damage(target, item)
return if target.result.hp_damage == 0 && item && !item.damage.to_hp?
if target.result.hp_damage > 0 && target.result.hp_drain == 0 && !target.result.life_steal_active
target.perform_damage_effect
end
Sound.play_recovery if target.result.hp_damage < 0
add_text(target.result.hp_damage_text)
wait
end
end