暴击命中属性修正脚本分享(主要为ai制作!)
rpgmakervxace吧
全部回复
仅看楼主
level 2
召唤魔龙 楼主
在vx ace中,它的原生战斗系统中,暴击(必杀几率)和韧性(必杀闪避几率,也就是防爆)并不是按照1:1的方式抵消,而是用的其他的计算方法。例如:角色20%暴击,敌人20%韧性,实际暴击率为20%*(1-20%)=16%,而不是0%。也就是说,韧性是降低敌方暴击百分比的属性效果;而命中与闪避属性的计算就相对来说更加复杂了,是先计算一个基础命中(受物品成功率影响),然后与攻击者的命中率相乘,再与目标的闪避率进行比较(通过两个随机数分别判断miss和evade),这样就会出现哪怕我方角色有着 50%的额外命中,敌人有着50%的物理闪避几率,敌人也依旧存在闪避的可能性。这对于rpg maker的原生系统而言,是一种相当聪明的抑制某项属性过于强大的机制,这使得概率博弈变得更加有趣。
但是,如果你不喜欢这种原生的计算方法,更喜欢简单一些的数值计算,让命中(物理命中几率),闪避(物理闪避几率),暴击(必杀几率),韧性(必杀闪避几率)按照1:1抵消的方式来计算,可以使用这个脚本。
需要注意的是,我更推荐原生的计算方法,更具备概率博弈和乐趣,加入此脚本之后,可能会让数值膨胀或者让某些属性过于变态,请考虑清楚之后在选择使用。
声明,本脚本为ai制作,并非我本人制作!如果担心ai脚本存在某些问题,使用前建议备份项目文件!若因此脚本导致项目出现不可逆的损失,本人概不负责(说是这么说,但其实只是免责声明罢了,一般来讲不会出现什么问题的233)
暴击命中属性修正脚本如下:
#==============================================================================
# ■ 暴击命中属性修正系统 (ABE引擎兼容版)
# 作者:召唤魔龙,ai制作
# 版本:1.2
# 最后更新:2026-01-21
#------------------------------------------------------------------------------
# - 修正暴击与韧性、命中与闪避的计算方式为1:1抵消
# - 支持属性值超过100%和低于0%
# - 兼容ABE引擎的暴击popup系统
# - 修复命中闪避计算逻辑
#==============================================================================
module BattleLunar
module CriticalHitFix
# 使用类变量替代常量,以便在运行时修改
@@enable_critical_fix = true # 是否启用暴击修正
@@enable_hit_fix = true # 是否启用命中修正
@@debug_mode = true # 是否显示调试信息
# 类方法访问器
def self.enable_critical_fix
@@enable_critical_fix
end
def self.enable_critical_fix=(value)
@@enable_critical_fix = value
end
def self.enable_hit_fix
@@enable_hit_fix
end
def self.enable_hit_fix=(value)
@@enable_hit_fix = value
end
def self.debug_mode
@@debug_mode
end
def self.debug_mode=(value)
@@debug_mode = value
end
end
end
#==============================================================================
# ■ Game_BattlerBase
#==============================================================================
class Game_BattlerBase
#--------------------------------------------------------------------------
# ● 计算实际暴击率(修正版)
#--------------------------------------------------------------------------
def calc_critical_rate(user)
return 0.0 if user.nil?
# 原始暴击率
base_crit = user.cri
# 如果启用了暴击修正
if BattleLunar::CriticalHitFix.enable_critical_fix
# 获取目标暴击回避率(韧性) - 使用VX Ace标准的cev属性
target_cri_evasion = self.cev
# 1:1抵消计算
actual_crit = base_crit - target_cri_evasion
# 调试信息
if BattleLunar::CriticalHitFix.debug_mode && $TEST
puts "[暴击修正] #{user.name} 暴击率: #{base_crit*100}%"
puts "[暴击修正] #{self.name} 韧性(cev): #{target_cri_evasion*100}%"
puts "[暴击修正] 实际暴击率: #{actual_crit*100}%"
end
# 处理边界情况
if actual_crit >= 1.0
# 必定暴击
return 1.0
elsif actual_crit <= 0.0
# 必定不暴击
return 0.0
else
# 正常暴击率
return actual_crit
end
else
# 原始计算方法
return base_crit * (1.0 - self.cev)
end
end
#--------------------------------------------------------------------------
# ● 计算实际命中率(修正版)
#--------------------------------------------------------------------------
def calc_hit_rate(user, item)
return 1.0 if user.nil? || item.nil?
# 原始命中率
if item.physical?
base_hit = user.hit
else
base_hit = 1.0
end
# 如果启用了命中修正
if BattleLunar::CriticalHitFix.enable_hit_fix
# 获取目标回避率
target_evasion = self.eva
# 1:1抵消计算
actual_hit = base_hit - target_evasion
# 调试信息
if BattleLunar::CriticalHitFix.debug_mode && $TEST
puts "[命中修正] #{user.name} 命中率: #{base_hit*100}%"
puts "[命中修正] #{self.name} 闪避率: #{target_evasion*100}%"
puts "[命中修正] 实际命中率: #{actual_hit*100}%"
end
# 处理边界情况
if actual_hit >= 1.0
# 必定命中
return 1.0
elsif actual_hit <= 0.0
# 必定不命中
return 0.0
else
# 正常命中率
return actual_hit
end
else
# 原始计算方法
return base_hit * (1.0 - self.eva)
end
end
#--------------------------------------------------------------------------
# ● 检查是否命中(修正版)
#--------------------------------------------------------------------------
def calc_hit_result(user, item)
return true if item.nil? || user.nil?
# 检查命中
hit_result = rand < calc_hit_rate(user, item)
# 调试信息
if BattleLunar::CriticalHitFix.debug_mode && $TEST
puts "[命中检查]
#{user.name} 对 #
{self.name} 使用 #{item.name}"
puts "[命中检查] 命中结果: #{hit_result ? '命中' : '未命中'}"
end
return hit_result
end
#--------------------------------------------------------------------------
# ● 检查是否暴击(修正版)
#--------------------------------------------------------------------------
def calc_critical_result(user)
return false if user.nil?
# 先检查特殊状态(兼容暴击伤害脚本)
if defined?(certain_crit?) && user.respond_to?(:certain_crit?) && user.certain_crit?
return true unless defined?(resist_crit?) && self.respond_to?(:resist_crit?) && self.resist_crit?
end
if defined?(certain_be_crited?) && self.respond_to?(:certain_be_crited?) && self.certain_be_crited?
return true
end
# 计算实际暴击率
crit_rate = calc_critical_rate(user)
# 随机判断
crit_result = rand < crit_rate
# 调试信息
if BattleLunar::CriticalHitFix.debug_mode && $TEST
puts "[暴击检查]
#{user.name} 对 #
{self.name} 暴击结果: #{crit_result ? '暴击' : '未暴击'}"
end
return crit_result
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 计算技能/物品的成功几率(修正版)- 关键修复!
#--------------------------------------------------------------------------
alias eagle_critical_hit_fix_item_hit item_hit
def item_hit(user, item)
if BattleLunar::CriticalHitFix.enable_hit_fix
# 使用修正后的命中率
# 注意:这里要确保使用修正后的命中率,但还要考虑物品本身的成功率
base_rate = item.success_rate * 0.01
if item.physical?
# 计算修正后的命中率
actual_hit = calc_hit_rate(user, item)
# 应用物品基础成功率
rate = base_rate * actual_hit
else
# 魔法攻击通常没有命中率概念(默认100%命中)
rate = base_rate
end
# 调试信息
if BattleLunar::CriticalHitFix.debug_mode && $TEST
puts "[命中计算]
#{user.name} 使用 #
{item.name}"
puts "[命中计算] 物品基础成功率: #{base_rate*100}%"
puts "[命中计算] 修正后命中率: #{actual_hit*100}%" if item.physical?
puts "[命中计算] 最终命中率: #{rate*100}%"
end
return rate
else
# 原始计算方法
return eagle_critical_hit_fix_item_hit(user, item)
end
end
#--------------------------------------------------------------------------
# ● 计算技能/物品的闪避几率(修正版)- 关键修复!
#--------------------------------------------------------------------------
alias eagle_critical_hit_fix_item_eva item_eva
def item_eva(user, item)
if BattleLunar::CriticalHitFix.enable_hit_fix
# 如果启用了命中修正,闪避率已经被包含在命中率计算中
# 这里返回0,避免二次计算
return 0
else
# 原始计算方法
return eagle_critical_hit_fix_item_eva(user, item)
end
end
#--------------------------------------------------------------------------
# ● 计算技能/物品的必杀几率(修正版)
#--------------------------------------------------------------------------
alias eagle_critical_hit_fix_item_cri item_cri
def item_cri(user, item)
if BattleLunar::CriticalHitFix.enable_critical_fix
# 使用修正后的暴击率计算
actual_crit = calc_critical_rate(user)
return item.damage.critical ? actual_crit : 0
else
# 原始计算方法
return eagle_critical_hit_fix_item_cri(user, item)
end
end
#--------------------------------------------------------------------------
# ● 应用技能/物品的效果(关键修复:命中判断)
#--------------------------------------------------------------------------
alias eagle_critical_hit_fix_item_apply item_apply
def item_apply(user, item)
# 关键:在应用物品效果前,先进行命中判断
# 但不要直接修改@result,让原始方法处理
# 调用原始方法
eagle_critical_hit_fix_item_apply(user, item)
# 调试信息
if BattleLunar::CriticalHitFix.debug_mode && $TEST
puts "[命中结果]
#{user.name} 对 #
{self.name} 使用 #{item.name}"
puts "[命中结果] Missed: #{@result.missed}"
puts "[命中结果] Evaded: #{@result.evaded}"
puts "[命中结果] Hit: #{@result.hit?}"
end
end
#--------------------------------------------------------------------------
# ● 计算伤害(关键修复)- 确保与ABE引擎的暴击popup兼容
#--------------------------------------------------------------------------
alias eagle_critical_hit_fix_make_damage_value make_damage_value
def make_damage_value(user, item)
# 保存原始用户引用(用于暴击伤害脚本)
@skill_user = user if defined?(@skill_user)
# 关键:如果暴击标志还没有被设置,先设置它
# 这样ABE引擎的apply_critical方法才能正确应用暴击伤害
if @result.critical.nil?
# 如果启用了暴击修正,使用修正后的暴击率计算
if BattleLunar::CriticalHitFix.enable_critical_fix
@result.critical = calc_critical_result(user)
else
# 使用原始计算方法
@result.critical = (rand < item_cri(user, item))
end
end
# 调试信息
if BattleLunar::CriticalHitFix.debug_mode && $TEST
puts "[伤害计算] 暴击标志设置: #{@result.critical}"
end
# 调用原始方法
eagle_critical_hit_fix_make_damage_value(user, item)
end
#--------------------------------------------------------------------------
# ● 扩展make_damage_popups方法 - 确保暴击标志正确
#--------------------------------------------------------------------------
if method_defined?(:make_damage_popups)
alias eagle_critical_hit_fix_make_damage_popups make_damage_popups
def make_damage_popups(user)
# 调试信息
if BattleLunar::CriticalHitFix.debug_mode && $TEST
puts "[ABE Popup] 暴击标志: #{@result.critical}"
puts "[ABE Popup] HP伤害: #{@result.hp_damage}"
end
# 调用原始方法(ABE引擎的方法)
eagle_critical_hit_fix_make_damage_popups(user)
end
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● 显示调试信息
#--------------------------------------------------------------------------
alias eagle_critical_hit_fix_update update
def update
eagle_critical_hit_fix_update
# 按F11显示属性信息(调试用)
if Input.trigger?(:F11) && ($TEST || $BTEST) && BattleLunar::CriticalHitFix.debug_mode
puts "=== 暴击命中属性修正系统调试 ==="
puts "暴击修正启用: #{BattleLunar::CriticalHitFix.enable_critical_fix}"
puts "命中修正启用: #{BattleLunar::CriticalHitFix.enable_hit_fix}"
puts "队伍成员属性:"
$game_party.battle_members.each do |actor|
puts " #{actor.name}:"
puts " 暴击率(cri): #{(actor.cri * 100).round}%"
puts " 韧性(cev): #{(actor.cev * 100).round}%"
puts " 命中率(hit): #{(actor.hit * 100).round}%"
puts " 闪避率(eva): #{(actor.eva * 100).round}%"
end
puts "敌人属性:"
$game_troop.alive_members.each do |enemy|
puts " #{enemy.name}:"
puts " 暴击率(cri): #{(enemy.cri * 100).round}%"
puts " 韧性(cev): #{(enemy.cev * 100).round}%"
puts " 命中率(hit): #{(enemy.hit * 100).round}%"
puts " 闪避率(eva): #{(enemy.eva * 100).round}%"
end
puts "========================"
end
# 按F12切换暴击修正
if Input.trigger?(:F12) && ($TEST || $BTEST)
BattleLunar::CriticalHitFix.enable_critical_fix = !BattleLunar::CriticalHitFix.enable_critical_fix
puts "暴击修正: #{BattleLunar::CriticalHitFix.enable_critical_fix ? '启用' : '禁用'}"
end
# 按F9切换命中修正
if Input.trigger?(:F9) && ($TEST || $BTEST)
BattleLunar::CriticalHitFix.enable_hit_fix = !BattleLunar::CriticalHitFix.enable_hit_fix
puts "命中修正: #{BattleLunar::CriticalHitFix.enable_hit_fix ? '启用' : '禁用'}"
end
end
#--------------------------------------------------------------------------
# ● 应用物品效果时显示调试信息
#--------------------------------------------------------------------------
alias eagle_critical_hit_fix_apply_item_effects apply_item_effects
def apply_item_effects(target, item)
# 调试信息
if BattleLunar::CriticalHitFix.debug_mode && $TEST && @subject
puts "=== 命中计算调试 ==="
puts "行动者: #{@subject.name}"
puts "目标: #{target.name}"
puts "行动者命中率: #{@subject.hit * 100}%"
puts "目标闪避率: #{target.eva * 100}%"
# 计算修正后的命中率
if BattleLunar::CriticalHitFix.enable_hit_fix
actual_hit = @subject.hit - target.eva
puts "修正后命中率: #{actual_hit * 100}%"
puts "是否必定命中: #{actual_hit >= 1.0}"
end
end
# 调用原始方法
eagle_critical_hit_fix_apply_item_effects(target, item)
end
end
#==============================================================================
# ■ 初始化
#==============================================================================
# 确保脚本正确加载
puts "暴击命中属性修正系统 v1.8 (ABE引擎兼容版) 已加载" if $TEST
#==============================================================================
# 使用说明:
#
# 修复的问题:
# 1. 暴击popup颜色显示错误的问题已经修复
# 2. 命中闪避计算逻辑已经修复
# 3. 暴击标志现在在
正确的
时间设置
#
# 关键修复点:
# 1. 重写了item_hit方法,使用修正后的命中率计算
# 2. 重写了item_eva方法,当启用命中修正时返回0(闪避率已在命中率中扣除)
# 3. 保持了原生VX Ace的两次判断逻辑(先miss后evade)
#
# 计算规则:
# 实际暴击率 = 攻击者暴击率(cri) - 目标韧性(cev)
# 实际命中率 = 攻击者命中率(hit) - 目标闪避率(eva)
#
# 如果实际命中率 ≥ 100%:必定命中(在item_hit中返回1.0)
# 如果实际命中率 ≤ 0%:必定不命中(在item_hit中返回0.0)
#
# 注意:VX Ace原生系统有两次判断:
# 1. 先判断是否miss:rand >= item_hit(user, item)
# 2. 如果不miss,再判断是否被闪避:rand < item_eva(user, item)
#
# 我们的修正将闪避率合并到命中率中,所以在启用命中修正时,item_eva返回0
#==============================================================================
2026年02月17日 09点02分 1
level 2
召唤魔龙 楼主
一些非必要的说明:
1、可以在脚本的配置界面修改true或者false来决定要不要启用命中/暴击属性修正;
2、经过测试,在我的项目中里可以正常运行该脚本,并且属性计算(1:1抵消)也是正常的,但是我所用的vx ace版本相对较老,不排斥会出现异常或者未正常启用的情况;
3、如果你使用了老鹰大大的暴击伤害相关脚本,这个属性修正脚本是兼容的,放在暴击伤害脚本之后即可;
4、这个脚本也是兼容ABE战斗引擎的(Ace Battle Engine ),我所用的版本为v1.22;
5、此脚本可能修改了一些方法,所以如果有别的相关战斗脚本,可以尝试将此脚本放在它们之后,避免脚本无法生效;
6、关于此脚本的调试功能,这是ai给我脚本的时候附带的(实际上我并未用过,我是在数据库中的战斗测试中来测试数值效果的),因此可以无视该功能(因为我确实不太会用这个);
7、此脚本经过了我和ai的多次修改,可能存在一些不明不白的未知bug,还请多多见谅;
8、暂时就想到这些,其他的以后再补充
2026年02月17日 10点02分 2
找到调试方法了,在游戏测试时,启用显示主控制台,则相关调试信息将在控制台中显示!
2026年03月02日 12点03分
1