设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 236|回复: 2
打印 上一主题 下一主题

[有事请教] 怎么能让敌方反击无效

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1040
在线时间
69 小时
注册时间
2017-9-5
帖子
79
跳转到指定楼层
1
发表于 2024-4-10 16:14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 间桐樱 于 2024-4-11 16:12 编辑

根据网上找的魔改了一个【魔法反射无效】的能力,但在此基础上改成【物理反击无效】却失败了
    if item.is_a?(RPG::Skill) == true && item.stype_id == 2 && item.scope <= 6
      if user.ignore_magic_reflection == false && item.ignore_magic_reflection == false
        return mrf
      else
        return 0
      end
    end

    if item.is_a?(RPG::Skill) == true && item.stype_id == 1 && item.scope <= 6
      if user.ignore_counter_attack == false && item.ignore_counter_attack == false
        return cnt
      else
        return 0
      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

Lv3.寻梦者

梦石
0
星屑
4828
在线时间
1355 小时
注册时间
2015-7-25
帖子
544

开拓者

2
发表于 2024-4-11 19:33:40 | 只看该作者
首先,你要解读一下invoke_item(target, item)这个方法
RUBY 代码复制
  1. class Scene_Battle
  2.   def invoke_item(target, item)
  3.     if rand < target.item_cnt(@subject, item) #获取随机数来判断是否触发物理反击
  4.       invoke_counter_attack(target, item) #触发成功则发动反击
  5.     elsif rand < target.item_mrf(@subject, item) #如果物理反击没有触发则获取随机数来判断是否触发魔法反射
  6.       invoke_magic_reflection(target, item) #触发成功则发动反射魔法攻击
  7.     else #如果物理和魔法反击都没有触发
  8.       apply_item_effects(apply_substitute(target, item), item) #那么应用技能/物品效果
  9.     end
  10.     @subject.last_target_index = target.index
  11.   end
  12. end


看明白之后,再看一下你的问题,
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 发动反击
  3.   #--------------------------------------------------------------------------
  4.   def invoke_counter_attack(target, item)
  5.     @log_window.display_counter(target, item)
  6.     attack_skill = $data_skills[target.attack_skill_id]
  7.     @subject.item_apply(target, attack_skill)
  8.     refresh_status
  9.     @log_window.display_action_results(@subject, attack_skill)
  10.   end

那么这一段执行反击,那这里既然已经在反击了,也就是说这个时候是否反击这个条件已经判定成功了,那么很明显,不需要在这里动刀子(做修改)

接下来修改之前需要先想好大致的思路,如何让反击无效=>也就是无视反击率,直接判定不通过。=>反击率直接返回0
那么反击率在哪里计算,看if rand < target.item_cnt(@subject, item) #获取随机数来判断是否触发物理反击
这里可以看到target.item_cnt(@subject, item) #target这个对象调用了它的实例方法item_cnt,因此直接全局搜索这个方法,然后定位到定义它的位置
可以看到
RUBY 代码复制
  1. class Game_Battler
  2.   def item_cnt(user, item)
  3.     return 0 unless item.physical?          # 攻击类型不是物理攻击
  4.     return 0 unless opposite?(user)         # 队友无法反击
  5.     return cnt                              # 返回反击几率
  6.   end
  7. end

接着通过刚刚的思路,让反击率直接返回0
RUBY 代码复制
  1. class Game_Battler
  2.   def item_cnt(user, item)
  3.     return 0
  4.   end
  5. end

这样一来,不管反击率有多少都不会触发反击了。那么再结合你的问题"怎么让敌方反击无效"
还是一样的,先整理思路,敌方反击无效=>敌方反击率直接返回0
敌方是什么呢?是Game_Enemy类的实例,如何判断是不是某个类的实例,在官方帮助文档F1中的Object类中写的很清楚,
is_a?(mod)
kind_of?(mod)
当 self 是 mod 类(或其子类)或是包含了 mod 模块的类(或其子类)的实例时,返回 true。
所以可以用is_a?(Game_Enemy)来判断是不是敌人
RUBY 代码复制
  1. class Game_Battler
  2.   def item_cnt(user, item)
  3.     return 0 if self.is_a?(Game_Enemy)
  4.     return 0 unless item.physical?          # 攻击类型不是物理攻击
  5.     return 0 unless opposite?(user)         # 队友无法反击
  6.     return cnt                              # 返回反击几率
  7.   end
  8. end

这样一来,就只让敌方的反击无效了
那么Game_Enemy类是Game_Battler类的子类,既然如此的话你也可以通过直接在Game_Enemy类中进行重定义该方法来达到同样的效果
RUBY 代码复制
  1. class Game_Enemy
  2.   def item_cnt(user, item)
  3.     return 0
  4.   end
  5. end


最后,你具体需要什么功能,具体要判定什么条件,你可以根据这种思路继续往下思考,再去修改即可,包括其他的功能也是一样的,不要着急下手,一步步解读
目前的坑 幽灵契约外传:歌莉娅
回归持续更新中~ 进度 v0.22/v1.00
笨肉包开始学像素画啦!努力训练中XD
啊~今天也是填mo坑yu的一天呢!
这是属于笨肉包一个人的旅行~(再见了...蚊子湯,七重酱,笨肉包永远想你们!TwT

看!是肉包!
只能看!不能吃!
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1040
在线时间
69 小时
注册时间
2017-9-5
帖子
79
3
 楼主| 发表于 2024-4-12 18:00:33 | 只看该作者
魔法丶小肉包 发表于 2024-4-11 19:33
首先,你要解读一下invoke_item(target, item)这个方法
class Scene_Battle
  def invoke_item(target, ite ...

感谢大佬的详细讲解,有些头绪,我去研究一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-2 10:38

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表