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
- [[result, 1.0].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
- [[result, 1.0].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
- [[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
- 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[10%] × 吸血B[20%] × 吸血C[30%]
吸血A[15%] × 吸血A[15%] × 吸血B[20%]
吸血C[10%] × 吸血C[10%] × 吸血C[10%]
注意!吸血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在线咨询功能删除,谢谢。 |