【脚本】吸血效果
RUBY 代码#==============================================================================
# $SDrop$
# 吸血效果By猫易箱
#------------------------------------------------------------------------------
# 在 角色、职业、技能、武器、护甲、敌人、状态 备注使用:
#
# - 通用吸血:让持有者造成伤害时,产生吸血效果
# - 技能吸血:技能专用!让技能自带吸血效果
# - 暴击吸血:A的变种,暴击时产生吸血效果
#
# - 攻击方的吸血修正(大于100%增加,小于100%减少)
# - 受击方的吸血修正(大于100%增加,小于100%减少)
#
# 吸血公式:伤害 × 吸血率 × 吸血加成 × 吸血抗性
# 战斗消息显示:XXX受到了100点的伤害!被偷取了50HP!
#
#==============================================================================
$imported = {}if$imported.nil?
$imported["SDrop_LifeSteal"] = true
#==============================================================================
# ■ RPG::BaseItem
#==============================================================================
classRPG::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 =~ //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 =~ //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 =~ //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 =~ //i ? $1.to_i / 100.0 : 1.0
end
end
#==============================================================================
# ■ RPG::Skill
#==============================================================================
classRPG::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 =~ //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.eachdo |obj|
result += obj.life_steal_a_rateif obj.respond_to?(:life_steal_a_rate)
end
[.min, 0.0].max
end
#--------------------------------------------------------------------------
# ● 获取总吸血C比率(从所有特性中累计)
#--------------------------------------------------------------------------
def life_steal_c_total
result = 0.0
feature_objects.eachdo |obj|
result += obj.life_steal_c_rateif obj.respond_to?(:life_steal_c_rate)
end
[.min, 0.0].max
end
#--------------------------------------------------------------------------
# ● 获取总吸血加成倍率(所有修正倍率的乘积)
#--------------------------------------------------------------------------
def life_steal_mod_total
result = 1.0
feature_objects.eachdo |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.eachdo |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_damageif@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
[.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
if user.current_action
action = user.current_action
@life_steal_rate = action.total_life_steal_rate
@life_steal_c_rate = action.life_steal_c_rate
end
# 记录使用者的吸血加成倍率
@life_steal_mod = user.life_steal_mod_totalif user.respond_to?(:life_steal_mod_total)
# 执行原处理
life_steal_item_apply(user, item)
# 处理吸血效果
if@result.hp_damage > 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 = (@result.hp_damage * @life_steal_rate).to_i
end
# 处理暴击吸血(如果本次攻击是暴击)
if@result.critical && @life_steal_c_rate > 0
c_steal = (@result.hp_damage * @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_recoveryif 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)
returnif 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_recoveryif target.result.hp_damage < 0
add_text(target.result.hp_damage_text)
wait
end
end
在 角色、职业、技能、武器、护甲、敌人、状态 备注栏添加使用:
通用吸血:持有者造成伤害时,回复20%HP。
技能吸血:仅技能备注生效,使该技能造成伤害时回复20%HP。
暴击吸血:仅暴击时,触发吸血效果。
吸血A 吸血B 吸血C 可组合生效!
如:
吸血A × 吸血B × 吸血C
吸血A × 吸血A × 吸血B
吸血C × 吸血C × 吸血C
注意!吸血ABC最大的组合限制为100%
如果想“造成100的伤害,吸200的血”可以通过“吸血加成”和“吸血抗性”来实现
吸血时的效果修正
被吸血时的效果修正
110%等于+10%,90%等于-10%
战斗日志会显示吸了多少血
XXX受到了100点的伤害!被偷取了50HP!
本帖来自P1论坛作者SmallDrop,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=498671若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]