Project1

标题: 仿VA自定义技能公式 [打印本页]

作者: 灯笼菜刀王    时间: 2019-5-16 02:44
标题: 仿VA自定义技能公式
本帖最后由 灯笼菜刀王 于 2020-3-19 17:25 编辑

  其实就是想做做看..... 感觉有不少童鞋不理解默认的技能伤害公式设置, 如果不会设置默认, 干脆用自定义吧XD

功能就是能像VA一样 单独设置技能的公式, 没设置的话就按XP默认的来,  设置了自定义伤害计算后, 技能的属性克制, 分散度一样会影响最终结果, 如果需要固定伤害, 就去掉属性, 把分散度设置为0

另外增加了一些参数, 像金钱,时间, 步数, 队伍活着的人数, 死掉的人数之类的,  可以用来做些奇葩技能......=.=

同时也加入了限制最大最小伤害的设置

设置方法 技能引用公共事件, 并在公共事件第一行用注释, 内容:[公式]XXXXX, 可以换行

不影响原本的公共事件调用,如果技能无需用到公共事件,就只注释写公式就可以了,具体公式写法看说明



冲突, 经芯大指点, 使用公共事件应该没冲突了

有覆盖了 def skill_effect(user, skill) , 其实就只加一句, 如果有改动过, 就把(菜刀到此一游的那句)复制到自己的脚本里就可以了

RUBY 代码复制
  1. #------------------------------------------------------
  2. # 自定义技能公式   by 灯笼菜刀君
  3. #
  4. # 用途, 和VA一样,可以对技能单独设置伤害计算公式
  5. #
  6. # 设置方法 技能引用公共事件, 并在公共事件第一行用注释, 内容:[公式]XXXXX,可以换行
  7. # 不影响原本的公共事件调用,如果技能无需用到公共事件,就注释写完公式后放空
  8. #
  9. # 写法:  
  10. # [公式](a攻-b防)*a力
  11. # 表示, 伤害值等于 攻方的攻击 - 受方的防御的差 乘上 攻方的力量
  12. #
  13. # [公式](a攻-b防)*a力 最大9999
  14. # 公式后面加上 最大9999, 表示公式结果如果超过9999就只取值9999
  15. #
  16. # [公式](a攻-b防)*a力 最小1
  17. # 公式后面加上 最小1, 表示公式结果如果低于1就取值1
  18. #
  19. # [公式](a攻-b防)*a力 最小1最大9999
  20. # 最小和最大可以同时写,结果会在 1-9999 之间
  21. #
  22. #[公式] 100
  23. # 固定伤害 100点(会受属性,分散度, 防御的修正)
  24. #--------------------------------------------------------
  25. # 公式里可使用的参数 注意符号都要用半角
  26. #--------------------------------------------------------
  27. # 备注:  最大N 写在公式最后,表示结果取值不超过N
  28. #        最小N 写在公式最后,表示结果取值不低于N
  29. #        ※以上两个可以同时写,但是之间不能有空格或者其他符号
  30. #
  31. # 运算符号: 加+ ; 减- ; 乘* ; 除/  ; 除余%
  32. #
  33. # 能力对应写法,a表示攻方,b表示受方(注意都要用小写字母)两者都可以使用以下参数
  34.  
  35. # 攻击力: a攻      力量: a力     灵活: a灵   最大HP : aM血  ※M是大写
  36. # 防御: a防        智力: a智     HP: a血     最大SP : aM蓝
  37. # 特防: a特        速度: a速     SP: a蓝     等级 : a级 (敌人的话, 这个数值为
  38. #                                                        队伍里的最高等级)
  39. # 特殊参数:
  40. # v : v[1] 表示 1号变量的值
  41. # 钱: 持有的金钱
  42. # 步: 走过的步数
  43. # 时: 游戏时间(秒)
  44. # lv : 队伍总等级
  45. # 人 : 队伍里存活的人数
  46. # 尸 : 队伍里死掉的人数
  47. # 怪 : 场上剩余的怪物数量
  48. #------------------------------------------------------
  49. module RPG
  50.   class Skill
  51.     def formula
  52.       return nil if @common_event_id == 0
  53.       return nil if $data_common_events[@common_event_id].list[0].code != 108
  54.       return nil if !$data_common_events[@common_event_id].list[0
  55.       ].parameters[0].include?("[公式]")
  56.       f = $data_common_events[@common_event_id].list[0
  57.       ].parameters[0].gsub("[公式]","")
  58.       for i in 1..5
  59.         if $data_common_events[@common_event_id].list[i] != nil and
  60.         $data_common_events[@common_event_id].list[i].code == 408
  61.           f += $data_common_events[@common_event_id].list[i].parameters[0]
  62.         end
  63.       end
  64.       return f
  65.     end
  66.   end
  67. end
  68. class Game_Battler
  69.   def diy_formula(user,skill_for)
  70.     if skill_for.nil?
  71.       return
  72.     end
  73.     a攻 = user.atk.to_f
  74.     a防 = user.pdef.to_f
  75.     a特 = user.mdef.to_f
  76.     a力 = user.str.to_f
  77.     a速 = user.agi.to_f
  78.     a灵 = user.dex.to_f
  79.     a智 = user.int.to_f
  80.     a血 = user.hp.to_f
  81.     aM血 = user.maxhp.to_f
  82.     a蓝 = user.sp.to_f
  83.     aM蓝 = user.maxsp.to_f
  84.     a级 = user.is_a?(Game_Actors) ? user.level.to_f : $game_party.max_level.to_f
  85.     b攻 = self.atk.to_f
  86.     b防 = self.pdef.to_f
  87.     b特 = self.mdef.to_f
  88.     b力 = self.str.to_f
  89.     b速 = self.agi.to_f
  90.     b灵 = self.dex.to_f
  91.     b智 = self.int.to_f
  92.     b血 = self.hp.to_f
  93.     bM血 = self.maxhp.to_f
  94.     b蓝 = self.sp.to_f
  95.     bM蓝 = self.maxsp.to_f
  96.     b级 = self.is_a?(Game_Actors) ? self.level.to_f : $game_party.max_level.to_f
  97.     v = $game_variables
  98.     钱 = $game_party.gold
  99.     步 = $game_party.steps
  100.     时 = Graphics.frame_count / Graphics.frame_rate
  101.     lv = 0
  102.     人 = 0
  103.     尸 = 0
  104.     for i in $game_party.actors
  105.       尸 += 1 if i.dead?
  106.       人 += 1 if i.exist?
  107.       lv += i.level
  108.     end
  109.     怪 = 0
  110.     for i in $game_troop.enemies
  111.       怪 += 1 if i.exist?
  112.     end
  113.     f = skill_for.split(/最大/)
  114.     f1 = f[0].split(/最小/)
  115.     f2 = f[1].nil? ? [] : f[1].split(/最小/)
  116.     if f1[1] != nil
  117.       big,small,fr = f[1],f1[1],f1[0]
  118.     elsif f2[1] != nil
  119.       big,small,fr = f2[0],f2[1],f[0]
  120.     elsif f[1] != nil
  121.       big,small,fr = f[1],nil,f[0]
  122.     else
  123.       big,small,fr = nil,nil,f[0]
  124.     end
  125.     eval("damage = (#{fr}).to_i")
  126.     damage = [damage,big.to_i].min if big != nil
  127.     damage = [damage,small.to_i].max if small != nil
  128.     self.damage = damage
  129.   end
  130.   def skill_effect(user, skill)
  131.     # 清除会心一击标志
  132.     self.critical = false
  133.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  134.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  135.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  136.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  137.       # 过程结束
  138.       return false
  139.     end
  140.     # 清除有效标志
  141.     effective = false
  142.     # 公共事件 ID 是有效的情况下,设置为有效标志
  143.     effective |= skill.common_event_id > 0
  144.     # 第一命中判定
  145.     hit = skill.hit
  146.     if skill.atk_f > 0
  147.       hit *= user.hit / 100
  148.     end
  149.     hit_result = (rand(100) < hit)
  150.     # 不确定的特技的情况下设置为有效标志
  151.     effective |= hit < 100
  152.     # 命中的情况下
  153.     if hit_result == true
  154.       # 计算威力
  155.       power = skill.power + user.atk * skill.atk_f / 100
  156.       if power > 0
  157.         power -= self.pdef * skill.pdef_f / 200
  158.         power -= self.mdef * skill.mdef_f / 200
  159.         power = [power, 0].max
  160.       end
  161.       # 计算倍率
  162.       rate = 20
  163.       rate += (user.str * skill.str_f / 100)
  164.       rate += (user.dex * skill.dex_f / 100)
  165.       rate += (user.agi * skill.agi_f / 100)
  166.       rate += (user.int * skill.int_f / 100)
  167.       # 计算基本伤害
  168.       self.damage = power * rate / 20
  169. #####菜刀到此一游####################################################
  170.       diy_formula(user,skill.formula)
  171. #####################################################################
  172.       # 属性修正
  173.       self.damage *= elements_correct(skill.element_set)
  174.       self.damage /= 100
  175.       # 伤害符号正确的情况下
  176.       if self.damage > 0
  177.         # 防御修正
  178.         if self.guarding?
  179.           self.damage /= 2
  180.         end
  181.       end
  182.       # 分散
  183.       if skill.variance > 0 and self.damage.abs > 0
  184.         amp = [self.damage.abs * skill.variance / 100, 1].max
  185.         self.damage += rand(amp+1) + rand(amp+1) - amp
  186.       end
  187.       # 第二命中判定
  188.       eva = 8 * self.agi / user.dex + self.eva
  189.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  190.       hit = self.cant_evade? ? 100 : hit
  191.       hit_result = (rand(100) < hit)
  192.       # 不确定的特技的情况下设置为有效标志
  193.       effective |= hit < 100
  194.     end
  195.     # 命中的情况下
  196.     if hit_result == true
  197.       # 威力 0 以外的物理攻击的情况下
  198.       if skill.power != 0 and skill.atk_f > 0
  199.         # 状态冲击解除
  200.         remove_states_shock
  201.         # 设置有效标志
  202.         effective = true
  203.       end
  204.       # HP 的伤害减法运算
  205.       last_hp = self.hp
  206.       self.hp -= self.damage
  207.       effective |= self.hp != last_hp
  208.       # 状态变化
  209.       @state_changed = false
  210.       effective |= states_plus(skill.plus_state_set)
  211.       effective |= states_minus(skill.minus_state_set)
  212.       # 威力为 0 的场合
  213.       if skill.power == 0
  214.         # 伤害设置为空的字串
  215.         self.damage = ""
  216.         # 状态没有变化的情况下
  217.         unless @state_changed
  218.           # 伤害设置为 "Miss"
  219.           self.damage = "Miss"
  220.         end
  221.       end
  222.     # Miss 的情况下
  223.     else
  224.       # 伤害设置为 "Miss"
  225.       self.damage = "Miss"
  226.     end
  227.     # 不在战斗中的情况下
  228.     unless $game_temp.in_battle
  229.       # 伤害设置为 nil
  230.       self.damage = nil
  231.     end
  232.     # 过程结束
  233.     return effective
  234.   end
  235. end

作者: 89444640    时间: 2019-5-16 06:45
本帖最后由 89444640 于 2019-5-16 07:03 编辑

FF计算师?不过敌人没等级,还得赋予等级才合理,跟调查结合在一起,按照队伍算不好啊。
夜里欢啊,两点起来发帖。
参数还可以继续添加,
你这个如果有低通速通会用得上,游戏时间越长伤害越高/越低,等级越低伤害越高什么的。
是不是把对应数值代入某个临时变量,然后计算?



作者: 芯☆淡茹水    时间: 2019-5-16 08:28
说明栏那个窄小的地方,写公式貌似有些捉急。
其实可以写到公共事件脚本里,然后技能备注公共事件ID,
这样或许还要好一些。
作者: SailCat    时间: 2019-5-16 15:41
2016年就做过类似的啦:http://rpg.blue/thread-389962-1-1.html

作者: miantouchi    时间: 2019-5-16 22:08
刚刚研究明白不带参数,最大、最小、最小-最大范围、固定伤害这块。带参数这块暂时没有啥奇葩思路,挺好的,参数的以后继续研究。如果你有啥奇葩技能
希望分享下,开拓下思路

另外你说的最后一句,有覆盖了 def skill_effect(user, skill) , 其实就只加一句,如果有改动过, 就把(菜刀到此一游的那句)复制到自己的脚本里就可以了
是不是意思如果我自己脚本修改过def skill_effect(user, skill),用你这个插件的时候就不要粘贴这一段了,直接把你加的这句话放到,我原先那段里。是这个意思吗?






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