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

Project1

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

[已经过期] 新人请教,如何设计一种【反击】类型的技能

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2323
在线时间
274 小时
注册时间
2017-7-25
帖子
163
1
发表于 2017-9-18 13:11:22 | 显示全部楼层
  1. #==============================================================================
  2. # ■ 伤害吸血与反弹  by 老鹰
  3. #------------------------------------------------------------------------------
  4. #   - 新增对所有造成的伤害的吸血、反弹的处理(先吸血、再反弹)
  5. #   - 角色、职业、武器、护甲、敌人、状态的备注栏中填入下式,即可对伤害反弹进行设置
  6. #    <HP Rebound: 伤害反弹比例(%)>
  7. #     - 伤害反弹比例(%) : 填入对最终伤害的反弹的比例,为百分数,%可省略
  8. #    <Resist HP Rebound: 抵抗反弹比例(%)>
  9. #     - 抵抗反弹比例(%) : 填入对最终伤害的抵抗反弹的比例,为百分数,%可省略
  10. #   - 角色、职业、武器、护甲、敌人、状态的备注栏中填入下式,即可对伤害吸血进行设置
  11. #    <HP Drain: 吸血比例(%) 吸血概率分子 吸血概率分母>
  12. #     - 吸血比例(%) : 填入最终伤害的吸血比例,为百分数,%可加可不加
  13. #     - 概率分子分母 : 吸血的概率为 分子/分母,可不填,默认为 1
  14. #    <Resist HP Drain: 抵抗吸血比例(%) 抵抗概率分子 抵抗概率分母>
  15. #     - 抵抗比例(%) : 被吸血时,比例要减去的值,默认为 0
  16. #     - 抵抗分子分母 : 抵抗的概率为 分子/分母,进行吸血处理时,要减去该概率,默认为 0
  17. #   - 举例:
  18. #    1 号角色备注内填入了 <HP Drain: 20%>
  19. #     - 1号角色造成的所有伤害,会吸取伤害的 20% (不超过目标的当前hp值)回复自己
  20. #    1 号敌人备注内填入了 <Resist HP Drain: 10%, 1,5>
  21. #    1 号角色备注内填入了 <HP Drain: 20%, 1,2>
  22. #     - 1号角色攻击1号敌人,有 1/2 - 1/5 的概率 吸取伤害的 20% - 10% 回复自己
  23. #
  24. #   - 实质:在真正实行伤害加减时,先进行吸血操作的处理;在计算完伤害后,进行反弹计算
  25. #==============================================================================

  26. class Game_ActionResult
  27.   #--------------------------------------------------------------------------
  28.   # ○ 生成反弹数值
  29.   #--------------------------------------------------------------------------
  30.   def execute_equips_hp_rebound(user)
  31.     return if @hp_damage <= 0
  32.     rate = (@battler.hp_rebound_rate - user.resist_hp_rebound_rate) / 100.0
  33.     return if rate <= 0
  34.     value = (@hp_damage * rate).to_i
  35.     user.result.hp_damage += value
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ○ 生成吸血数值
  39.   #--------------------------------------------------------------------------
  40.   def execute_equips_hp_drain(user)
  41.     return if @hp_damage <= 0
  42.     pro = user.hp_drain_pro - @battler.resist_hp_drain_pro
  43.     return if pro < 1 && (pro < 0 || rand > pro)
  44.     rate = (user.hp_drain_rate - @battler.resist_hp_drain_rate) / 100.0
  45.     return if rate <= 0
  46.     @hp_drain += (@hp_damage * rate).to_i
  47.     @hp_drain = [@battler.hp, @hp_drain.to_i].min
  48.   end
  49. end

  50. class Game_BattlerBase
  51.   #--------------------------------------------------------------------------
  52.   # ○ 获取用于计算吸血相关的数组
  53.   #--------------------------------------------------------------------------
  54.   def get_hp_drain_array
  55.     []
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   # ○ 重新获取吸血与反弹的相关参数
  59.   #--------------------------------------------------------------------------
  60.   def reget_hp_drain_params
  61.     # 数组依次存储 [吸血比例 吸血概率 抗吸血比例 抗吸血概率]
  62.     @hp_drain_params = [0, 0, 0, 0]
  63.     # [反弹比例 抗反弹比例]
  64.     @hp_rebound_params = [0, 0]
  65.     get_hp_drain_array.each do |a|
  66.       next if a == nil
  67.       if a.note =~ /<HP Drain: *(-?\d+)%?[ ,]*(\d*)[ ,]*(\d*)>/
  68.         @hp_drain_params[0] = $1.to_i
  69.         pro1 = $2 == "" ? 1 : $2.to_i
  70.         pro2 = $3 == "" ? 1 : $3.to_i
  71.         @hp_drain_params[1] = pro1 * 1.0 / pro2
  72.       end
  73.       if a.note =~ /<Resist HP Drain: *(-?\d+)%?[ ,]*(\d*)[ ,]*(\d*)>/
  74.         @hp_drain_params[2] = $1.to_i
  75.         pro1 = $2 == "" ? 1 : $2.to_i
  76.         pro2 = $3 == "" ? 1 : $3.to_i
  77.         @hp_drain_params[3] = pro1 * 1.0 / pro2
  78.       end
  79.       if a.note =~ /<HP Rebound: *(-?\d+)%?>/
  80.       @hp_rebound_params[0] = $1.to_i
  81.       end
  82.       if a.note =~ /<Resist HP Rebound: *(-?\d+)%?>/
  83.       @hp_rebound_params[1] = $1.to_i
  84.       end
  85.     end
  86.   end
  87.   #--------------------------------------------------------------------------
  88.   # ○ 吸血比例与概率
  89.   #--------------------------------------------------------------------------
  90.   def hp_drain_rate
  91.     @hp_drain_params[0]
  92.   end
  93.   def hp_drain_pro
  94.     @hp_drain_params[1]
  95.   end
  96.   #--------------------------------------------------------------------------
  97.   # ○ 抗吸血比例与概率
  98.   #--------------------------------------------------------------------------
  99.   def resist_hp_drain_rate
  100.     @hp_drain_params[2]
  101.   end
  102.   def resist_hp_drain_pro
  103.     @hp_drain_params[3]
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ○ 伤害反弹比例
  107.   #--------------------------------------------------------------------------
  108.   def hp_rebound_rate
  109.     @hp_rebound_params[0]
  110.   end
  111.   #--------------------------------------------------------------------------
  112.   # ○ 抗反弹比例
  113.   #--------------------------------------------------------------------------
  114.   def resist_hp_rebound_rate
  115.     @hp_rebound_params[1]
  116.   end
  117. end

  118. class Game_Battler < Game_BattlerBase
  119. #~   #--------------------------------------------------------------------------
  120. #~   # ● 计算伤害
  121. #~   #--------------------------------------------------------------------------
  122.   alias eagle_equips_hp_rebound_make_damage_value make_damage_value
  123.   def make_damage_value(user, item)
  124.     user.reget_hp_drain_params
  125.     reget_hp_drain_params
  126.     eagle_equips_hp_rebound_make_damage_value(user, item)
  127.     @result.execute_equips_hp_rebound(user)
  128.   end
  129.   #--------------------------------------------------------------------------
  130.   # ● 执行伤害
  131.   #--------------------------------------------------------------------------
  132.   alias eagle_equips_hp_drain_execute_damage execute_damage
  133.   def execute_damage(user)
  134.     @result.execute_equips_hp_drain(user)
  135.     eagle_equips_hp_drain_execute_damage(user)
  136.     user.hp -= user.result.hp_damage
  137.   end
  138. end

  139. class Game_Actor < Game_Battler
  140.   #--------------------------------------------------------------------------
  141.   # ○ 获取用于计算吸血相关的数组
  142.   #--------------------------------------------------------------------------
  143.   def get_hp_drain_array
  144.     [actor, self.class] + equips + states
  145.   end
  146. end

  147. class Game_Enemy < Game_Battler
  148.   #--------------------------------------------------------------------------
  149.   # ○ 获取用于计算吸血相关的数组
  150.   #--------------------------------------------------------------------------
  151.   def get_hp_drain_array
  152.     [enemy] + states
  153.   end
  154. end
  155. class Scene_Battle
  156.   #--------------------------------------------------------------------------
  157.   # ● 战斗行动结束时的处理
  158.   #--------------------------------------------------------------------------
  159.   alias eagle_hp_drain_process_action_end process_action_end
  160.   def process_action_end
  161.     all_battle_members.each { |m| m.result.clear_damage_values }
  162.     eagle_hp_drain_process_action_end
  163.   end
  164. end
复制代码


脚本在这,设置给你想要的反击状态(不想反的状况还可以设置反伤抗性,虽然我不需要还没用过),搭配技能公式系列https://rpg.blue/thread-307316-1-1.html?_dsign=5a9bad8f食用,赞
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2323
在线时间
274 小时
注册时间
2017-7-25
帖子
163
2
发表于 2017-9-20 00:03:12 | 显示全部楼层
苍月的魔王 发表于 2017-9-19 19:14
我是这么想的:设定一个拥有【异常状态反击】效果的技能,当角色或敌人使用这个技能之后,就会给自己附加 ...

上状态很简单数据库里面设个无属性状态再来个技能加上就行了
不过被攻击时给攻击者附加不同异常状态的效果不好搞,从数据库技能公式入手的话可能必须每个敌人的技能都要改,真的贼麻烦还容易错漏啊
多研究一下6、8、12楼吧直接从基础脚本的Game_Battler的
def make_damage_value(user, item)
    value = item.damage.eval(user, self, $game_variables)下方插入,可以全局性地对所有技能进行判断,12楼的写法应该跟你要的效果非常接近了,当然你希望出现几种效果还是要写分别出几个来,添加多组的写法参考29楼
       if self.state?(2)               #如果目标处在2号状态,也就是你设定的反击状态
        user.add_state(66)         #技能的使用者(攻击方)被附加66号状态
        value = ???              #伤害公式,如果不希望这个状态改变原有技能的伤害,这行就写value += 0
       end
          我先照葫芦画个瓢,这个比较简单,但反击结果只能是固定一种(66)状态,如果你有【不同需求】还要判断具体技能编号(其实12楼的写法我复制下来一个劲出错,你要是研究出来了麻烦告诉我到底哪出了问题)

点评

不同效果的话单靠事件就不太好办了……不过其实也不是做不到……  发表于 2017-9-29 16:19
在反击状态里添加攻击附加状态效果,反击时被反击的目标如果没有对应抗性就会中招……  发表于 2017-9-29 16:18
添加“攻击附加状态”效果,只要攻击者不免疫该状态就会在被反击的时候中招……  发表于 2017-9-22 16:04
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2323
在线时间
274 小时
注册时间
2017-7-25
帖子
163
3
发表于 2017-9-20 00:58:56 | 显示全部楼层
本帖最后由 骷髅岛遗老 于 2017-9-20 01:05 编辑
  1.        if item.is_a?(RPG::Skill)        #这两句貌似是把数据库的技能ID加入item
  2.         case item.id                    #总之定义技能编号好像一定要这两句
  3.         
  4.           when 80                       #当使用80号技能(可设置为怪物的技能)时
  5.             if self.state?(2)           #如果被攻击者处于2号状态(反击状态)
  6.                user.add_state(2)        #攻击者进入2号状态
  7.             end
  8.          
  9.           when 83,84,85                 #当使用83\84\85号技能时
  10.             if self.state?(2)           #如果被攻击者处于2号状态(反击状态)
  11.                user.add_state(26)       #攻击者进入26号状态
  12.              end                        #
  13.             
  14.           when #技能编号                                                #如果你
  15.             if self.state?(#反击状态的编号)                        #想照样添加别的反击效果
  16.                user.add_state(#反击给攻击者的状态编号)  #复制这4行贴到后面
  17.              end                                                                 #按上面的格式自己填吧

  18.             #添加状态朝这贴

  19.            end  
  20.        end                  #差不多首行每个if对应一个end,case对应一个end……吧?
复制代码


自己重新写一遍,忽然成功了(所以12楼到底是哪里不对啊还是没看出来
可以自由更改添加任意想要的反击效果,仅针对【当敌人使用的技能不同时,反击导致的异常状态不同】的情况
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2323
在线时间
274 小时
注册时间
2017-7-25
帖子
163
4
发表于 2017-9-22 13:03:31 | 显示全部楼层
实际用起来大概就是这样的了
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2323
在线时间
274 小时
注册时间
2017-7-25
帖子
163
5
发表于 2017-9-22 18:13:19 | 显示全部楼层
紫苍焰 发表于 2017-9-22 16:03
……
做另外一个状态,添加“物理反击几率100%”的同时也添加“攻击附加状态”这个效果,这样处于“反击 ...

这样是做不出不同技能甚至不同血量使用者打到同一状态目标被进入不同状态的效果的,就算能做到肯定也要弄大量同名技能或者公共事件费时费力。而且你是不是理解错了,系统自带的那个攻击附加状态是只对普通攻击有效,而且是带有状态的人去攻击别人才附加,不是带有状态的人被攻击附加……
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2323
在线时间
274 小时
注册时间
2017-7-25
帖子
163
6
发表于 2017-9-23 00:37:09 | 显示全部楼层
本帖最后由 骷髅岛遗老 于 2017-9-23 00:48 编辑
苍月的魔王 发表于 2017-9-23 00:05
已经全部改了……但还是没用啊……
def make_damage_value(user, item)
    value = item.damage.eval(u ...


  when 384,384,384                #当使用83\84\85号技能时
            if self.state?(133)           #如果被攻击者处于2号状态(反击状态)
               user.add_state(134)       #攻击者进入26号状态
             end   
这一段全部注释掉,你只要一个技能就应该把多余的都注释掉,重复描述同一个技能程序就懵逼了,我写几段就是考虑你要做一堆技能才预留的
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2323
在线时间
274 小时
注册时间
2017-7-25
帖子
163
7
发表于 2017-11-9 18:20:17 | 显示全部楼层
themself 发表于 2017-11-9 17:27
使用中发现角色进行攻击不再显示造成多少伤害,直接显示吸取多少体力。这样是否正常呢? ...

脚本本身就是这样的……实际上伤害是正常造成的,只是战斗信息只显示吸血
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-7 17:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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