Project1

标题: 新人请教,如何设计一种【反击】类型的技能 [打印本页]

作者: 苍月的魔王    时间: 2017-9-10 16:07
标题: 新人请教,如何设计一种【反击】类型的技能
请教一下各位了,我想在游戏中做出一种带【反击】效果的技能,目前的思路是这样的:
当角色或者敌人使用【反击】技能时,他会获得一个反击【状态】,而当对方对其攻击或者是使用特定技能时,反击技能就会发挥效果,给与对方伤害或者激发其他技能效果
之前请教了一位朋友,他说类似的技能只能用脚本才能做出来,所以我来拜托各位了
作者: 苍月的魔王    时间: 2017-9-18 01:29
我研究了一下,似乎【伏虎之反击】只能作用于造成物理伤害,但是没办法给攻击者附加额外状态啊……
作者: 紫苍焰    时间: 2017-9-18 09:52
……
状态里调整物理反击和魔法反射几率不就完了……
用得着这么麻烦么……
不过这俩不是反特定而是啥都反,这个似乎不符合要求……
作者: 紫苍焰    时间: 2017-9-18 09:54
本帖最后由 紫苍焰 于 2017-9-18 10:01 编辑
苍月的魔王 发表于 2017-9-18 01:29
我研究了一下,似乎【伏虎之反击】只能作用于造成物理伤害,但是没办法给攻击者附加额外状态啊…… ...


添加状态【反击】,效果是物理反击几率提升100%持续3回合。
你复制一个这个技能,然后改名字改描述,最后再添加一个状态【魔法反射】试试看。
以上。
作者: 骷髅岛遗老    时间: 2017-9-18 13:11
  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食用,赞
作者: 苍月的魔王    时间: 2017-9-19 01:29
骷髅岛遗老 发表于 2017-9-18 13:11
脚本在这,设置给你想要的反击状态(不想反的状况还可以设置反伤抗性,虽然我不需要还没用过),搭配技能 ...

谢谢,我这就回去试试{:2_249:}
作者: 苍月的魔王    时间: 2017-9-19 02:15
紫苍焰 发表于 2017-9-18 09:54
添加状态【反击】,效果是物理反击几率提升100%持续3回合。
你复制一个这个技能,然后改名字改描述,最后 ...

那个……可能是我一开始的意思没有表达明确,我的想法其实是这样:当角色处于设置的状态时,如果对手对其发动攻击,再取消伤害(或者不取消)的同时会给攻击的对手身上附加额外的状态(如黑暗、麻痹等)
反击造成伤害只是基础,最重要的还是要给予攻击者附加异常状态作为反击(没有表达明确真是抱歉……)
作者: 苍月的魔王    时间: 2017-9-19 02:22
骷髅岛遗老 发表于 2017-9-18 13:11
脚本在这,设置给你想要的反击状态(不想反的状况还可以设置反伤抗性,虽然我不需要还没用过),搭配技能 ...

那个……我虽然回去看了一下……但是……还是看不懂啊……还是想拜托大佬指点一下了……(我想要做出的技能的效果在第7楼有说明)
作者: 苍月的魔王    时间: 2017-9-19 19:14
骷髅岛遗老 发表于 2017-9-18 13:11
脚本在这,设置给你想要的反击状态(不想反的状况还可以设置反伤抗性,虽然我不需要还没用过),搭配技能 ...

我是这么想的:设定一个拥有【异常状态反击】效果的技能,当角色或敌人使用这个技能之后,就会给自己附加一个状态,而当角色处于这个设置的状态时,如果对手对角色其发动攻击时,会给攻击的对手身上附加额外的状态,如黑暗、麻痹甚至是禁止使用魔法等,根据不同的需求设定有不同异常状态的技能,这就是目前我想要的
作者: 骷髅岛遗老    时间: 2017-9-20 00:03
苍月的魔王 发表于 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-20 00:58
本帖最后由 骷髅岛遗老 于 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楼到底是哪里不对啊还是没看出来
可以自由更改添加任意想要的反击效果,仅针对【当敌人使用的技能不同时,反击导致的异常状态不同】的情况
作者: 苍月的魔王    时间: 2017-9-21 23:53
骷髅岛遗老 发表于 2017-9-20 00:58
自己重新写一遍,忽然成功了(所以12楼到底是哪里不对啊还是没看出来
可以自由更改添加任意想要的反击效 ...

额……真是非常抱歉,本人目前对脚本是一窍不通,虽然大佬对脚本中有注明,但是有些部分还是没看懂,比如说 【#这两句貌似是把数据库的技能ID加入item】,我都不知道具体要加到哪里……实际操作之后,也是发生脚本错误(说是第17行)……总之还是请大佬能够帮我详细的说明一下这个脚本的正确用法,拜托了
作者: 骷髅岛遗老    时间: 2017-9-22 13:03
实际用起来大概就是这样的了
作者: 紫苍焰    时间: 2017-9-22 16:03
苍月的魔王 发表于 2017-9-19 02:15
那个……可能是我一开始的意思没有表达明确,我的想法其实是这样:当角色处于设置的状态时,如果对手对其 ...

……
做另外一个状态,添加“物理反击几率100%”的同时也添加“攻击附加状态”这个效果,这样处于“反击”状态时发动的攻击也会附加状态了……
作者: 紫苍焰    时间: 2017-9-22 16:03
骷髅岛遗老 发表于 2017-9-20 00:03
上状态很简单数据库里面设个无属性状态再来个技能加上就行了
不过被攻击时给攻击者附加不同异常状态的效 ...

……活用状态就能解决的……比写脚本简单多了……
作者: 骷髅岛遗老    时间: 2017-9-22 18:13
紫苍焰 发表于 2017-9-22 16:03
……
做另外一个状态,添加“物理反击几率100%”的同时也添加“攻击附加状态”这个效果,这样处于“反击 ...

这样是做不出不同技能甚至不同血量使用者打到同一状态目标被进入不同状态的效果的,就算能做到肯定也要弄大量同名技能或者公共事件费时费力。而且你是不是理解错了,系统自带的那个攻击附加状态是只对普通攻击有效,而且是带有状态的人去攻击别人才附加,不是带有状态的人被攻击附加……
作者: 苍月的魔王    时间: 2017-9-22 22:14
骷髅岛遗老 发表于 2017-9-22 13:03
实际用起来大概就是这样的了

我已经按照你图上所标识的方法做了……但是,不知道为什么,好像并没有什么效果啊……
C:\Users\Administrator\Desktop
作者: 苍月的魔王    时间: 2017-9-22 22:16
不会发图,再试一次
file:///C:/Users/Administrator/Desktop/图片/2017_09_22_22_10.41.bmp
作者: 苍月的魔王    时间: 2017-9-23 00:05
骷髅岛遗老 发表于 2017-9-22 13:03
实际用起来大概就是这样的了

已经全部改了……但还是没用啊……
def make_damage_value(user, item)
    value = item.damage.eval(user, self, $game_variables)

   
    if item.is_a?(RPG::Skill)        #这两句貌似是把数据库的技能ID加入item
        case item.id                    #总之定义技能编号好像一定要这两句
        
          when 384                       #当使用80号技能(可设置为怪物的技能)时
            if self.state?(133)           #如果被攻击者处于2号状态(反击状态)
               user.add_state(134)        #攻击者进入2号状态
            end
         
          when 384,384,384                #当使用83\84\85号技能时
            if self.state?(133)           #如果被攻击者处于2号状态(反击状态)
               user.add_state(134)       #攻击者进入26号状态
             end                        #
            
#~          when #技能编号                                                #如果你
#~            if self.state?(#反击状态的编号)                        #想照样添加别的反击效果
#~               user.add_state(#反击给攻击者的状态编号)  #复制这4行贴到后面
#~             end                                                                 #按上面的格式自己填吧

            #添加状态朝这贴

           end  
       end                  #差不多首行每个if对应一个end,case对应一个end
作者: 骷髅岛遗老    时间: 2017-9-23 00:37
本帖最后由 骷髅岛遗老 于 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   
这一段全部注释掉,你只要一个技能就应该把多余的都注释掉,重复描述同一个技能程序就懵逼了,我写几段就是考虑你要做一堆技能才预留的
作者: 紫苍焰    时间: 2017-9-29 15:55
骷髅岛遗老 发表于 2017-9-22 18:13
这样是做不出不同技能甚至不同血量使用者打到同一状态目标被进入不同状态的效果的,就算能做到肯定也要弄 ...

反击状态和击晕效果是可以共存的啊哥哥……
完全可以设置多个不同效果的反击状态吧……甚至可以添加全部异常状态然后依靠攻击者身上各自不同的状态抗性达成攻击者被反击时出现不同状态的效果……至于伤害更好办了,攻击者临时加防和不加防还不好弄吗……
作者: themself    时间: 2017-11-9 17:27
骷髅岛遗老 发表于 2017-9-18 13:11
脚本在这,设置给你想要的反击状态(不想反的状况还可以设置反伤抗性,虽然我不需要还没用过),搭配技能 ...

使用中发现角色进行攻击不再显示造成多少伤害,直接显示吸取多少体力。这样是否正常呢?
作者: 骷髅岛遗老    时间: 2017-11-9 18:20
themself 发表于 2017-11-9 17:27
使用中发现角色进行攻击不再显示造成多少伤害,直接显示吸取多少体力。这样是否正常呢? ...

脚本本身就是这样的……实际上伤害是正常造成的,只是战斗信息只显示吸血
作者: themself    时间: 2017-11-10 12:37
骷髅岛遗老 发表于 2017-11-9 18:20
脚本本身就是这样的……实际上伤害是正常造成的,只是战斗信息只显示吸血 ...

感谢回答。不过能先显示伤害再显示吸血吗。这样其实有些奇怪。。
作者: 苍月的魔王    时间: 2018-11-6 19:58
本帖最后由 苍月的魔王 于 2018-11-6 19:59 编辑

C:\Users\Administrator\Desktop\111
作者: 苍月的魔王    时间: 2018-11-6 19:59
C:\Users\Administrator\Desktop\111




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1