首先,你要解读一下invoke_item(target, item)这个方法
class Scene_Battle def invoke_item(target, item) if rand < target.item_cnt(@subject, item) #获取随机数来判断是否触发物理反击 invoke_counter_attack(target, item) #触发成功则发动反击 elsif rand < target.item_mrf(@subject, item) #如果物理反击没有触发则获取随机数来判断是否触发魔法反射 invoke_magic_reflection(target, item) #触发成功则发动反射魔法攻击 else #如果物理和魔法反击都没有触发 apply_item_effects(apply_substitute(target, item), item) #那么应用技能/物品效果 end @subject.last_target_index = target.index end end
class Scene_Battle
def invoke_item(target, item)
if rand < target.item_cnt(@subject, item) #获取随机数来判断是否触发物理反击
invoke_counter_attack(target, item) #触发成功则发动反击
elsif rand < target.item_mrf(@subject, item) #如果物理反击没有触发则获取随机数来判断是否触发魔法反射
invoke_magic_reflection(target, item) #触发成功则发动反射魔法攻击
else #如果物理和魔法反击都没有触发
apply_item_effects(apply_substitute(target, item), item) #那么应用技能/物品效果
end
@subject.last_target_index = target.index
end
end
看明白之后,再看一下你的问题,
#-------------------------------------------------------------------------- # ● 发动反击 #-------------------------------------------------------------------------- def invoke_counter_attack(target, item) @log_window.display_counter(target, item) attack_skill = $data_skills[target.attack_skill_id] @subject.item_apply(target, attack_skill) refresh_status @log_window.display_action_results(@subject, attack_skill) end
#--------------------------------------------------------------------------
# ● 发动反击
#--------------------------------------------------------------------------
def invoke_counter_attack(target, item)
@log_window.display_counter(target, item)
attack_skill = $data_skills[target.attack_skill_id]
@subject.item_apply(target, attack_skill)
refresh_status
@log_window.display_action_results(@subject, attack_skill)
end
那么这一段执行反击,那这里既然已经在反击了,也就是说这个时候是否反击这个条件已经判定成功了,那么很明显,不需要在这里动刀子(做修改)
接下来修改之前需要先想好大致的思路,如何让反击无效=>也就是无视反击率,直接判定不通过。=>反击率直接返回0
那么反击率在哪里计算,看if rand < target.item_cnt(@subject, item) #获取随机数来判断是否触发物理反击
这里可以看到target.item_cnt(@subject, item) #target这个对象调用了它的实例方法item_cnt,因此直接全局搜索这个方法,然后定位到定义它的位置
可以看到
class Game_Battler def item_cnt(user, item) return 0 unless item.physical? # 攻击类型不是物理攻击 return 0 unless opposite?(user) # 队友无法反击 return cnt # 返回反击几率 end end
class Game_Battler
def item_cnt(user, item)
return 0 unless item.physical? # 攻击类型不是物理攻击
return 0 unless opposite?(user) # 队友无法反击
return cnt # 返回反击几率
end
end
接着通过刚刚的思路,让反击率直接返回0
class Game_Battler def item_cnt(user, item) return 0 end end
class Game_Battler
def item_cnt(user, item)
return 0
end
end
这样一来,不管反击率有多少都不会触发反击了。那么再结合你的问题"怎么让敌方反击无效"
还是一样的,先整理思路,敌方反击无效=>敌方反击率直接返回0
敌方是什么呢?是Game_Enemy类的实例,如何判断是不是某个类的实例,在官方帮助文档F1中的Object类中写的很清楚,
is_a?(mod)
kind_of?(mod)
当 self 是 mod 类(或其子类)或是包含了 mod 模块的类(或其子类)的实例时,返回 true。
所以可以用is_a?(Game_Enemy)来判断是不是敌人
class Game_Battler def item_cnt(user, item) return 0 if self.is_a?(Game_Enemy) return 0 unless item.physical? # 攻击类型不是物理攻击 return 0 unless opposite?(user) # 队友无法反击 return cnt # 返回反击几率 end end
class Game_Battler
def item_cnt(user, item)
return 0 if self.is_a?(Game_Enemy)
return 0 unless item.physical? # 攻击类型不是物理攻击
return 0 unless opposite?(user) # 队友无法反击
return cnt # 返回反击几率
end
end
这样一来,就只让敌方的反击无效了
那么Game_Enemy类是Game_Battler类的子类,既然如此的话你也可以通过直接在Game_Enemy类中进行重定义该方法来达到同样的效果
class Game_Enemy def item_cnt(user, item) return 0 end end
class Game_Enemy
def item_cnt(user, item)
return 0
end
end
最后,你具体需要什么功能,具体要判定什么条件,你可以根据这种思路继续往下思考,再去修改即可,包括其他的功能也是一样的,不要着急下手,一步步解读 |