查看: 5037|回复: 14

[原创发布] 仿VA自定义技能公式

[复制链接]
梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2019-5-16 02:44:15 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 灯笼菜刀王 于 2020-3-19 17:25 编辑

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

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

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

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

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

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

TIM图片20190516112911.png

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

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

[pre lang="ruby"]#------------------------------------------------------
# 自定义技能公式   by 灯笼菜刀君
#
# 用途, 和VA一样,可以对技能单独设置伤害计算公式
#
# 设置方法 技能引用公共事件, 并在公共事件第一行用注释, 内容:[公式]XXXXX,可以换行
# 不影响原本的公共事件调用,如果技能无需用到公共事件,就注释写完公式后放空
#
# 写法:  
# [公式](a攻-b防)*a力
# 表示, 伤害值等于 攻方的攻击 - 受方的防御的差 乘上 攻方的力量
#
# [公式](a攻-b防)*a力 最大9999
# 公式后面加上 最大9999, 表示公式结果如果超过9999就只取值9999
#
# [公式](a攻-b防)*a力 最小1
# 公式后面加上 最小1, 表示公式结果如果低于1就取值1
#
# [公式](a攻-b防)*a力 最小1最大9999
# 最小和最大可以同时写,结果会在 1-9999 之间
#
#[公式] 100
# 固定伤害 100点(会受属性,分散度, 防御的修正)
#--------------------------------------------------------
# 公式里可使用的参数 注意符号都要用半角
#--------------------------------------------------------
# 备注:  最大N 写在公式最后,表示结果取值不超过N
#        最小N 写在公式最后,表示结果取值不低于N
#        ※以上两个可以同时写,但是之间不能有空格或者其他符号
#
# 运算符号: 加+ ; 减- ; 乘* ; 除/  ; 除余%
#
# 能力对应写法,a表示攻方,b表示受方(注意都要用小写字母)两者都可以使用以下参数

# 攻击力: a攻      力量: a力     灵活: a灵   最大HP : aM血  ※M是大写
# 防御: a防        智力: a智     HP: a血     最大SP : aM蓝
# 特防: a特        速度: a速     SP: a蓝     等级 : a级 (敌人的话, 这个数值为
#                                                        队伍里的最高等级)
# 特殊参数:
# v : v[1] 表示 1号变量的值
# 钱: 持有的金钱
# 步: 走过的步数
# 时: 游戏时间(秒)
# lv : 队伍总等级
# 人 : 队伍里存活的人数
# 尸 : 队伍里死掉的人数
# 怪 : 场上剩余的怪物数量
#------------------------------------------------------
module RPG
  class Skill
    def formula
      return nil if @common_event_id == 0
      return nil if $data_common_events[@common_event_id].list[0].code != 108
      return nil if !$data_common_events[@common_event_id].list[0
      ].parameters[0].include?("[公式]")
      f = $data_common_events[@common_event_id].list[0
      ].parameters[0].gsub("[公式]","")
      for i in 1..5
        if $data_common_events[@common_event_id].list != nil and
        $data_common_events[@common_event_id].list.code == 408
          f += $data_common_events[@common_event_id].list.parameters[0]
        end
      end
      return f
    end
  end
end
class Game_Battler
  def diy_formula(user,skill_for)
    if skill_for.nil?
      return
    end
    a攻 = user.atk.to_f
    a防 = user.pdef.to_f
    a特 = user.mdef.to_f
    a力 = user.str.to_f
    a速 = user.agi.to_f
    a灵 = user.dex.to_f
    a智 = user.int.to_f
    a血 = user.hp.to_f
    aM血 = user.maxhp.to_f
    a蓝 = user.sp.to_f
    aM蓝 = user.maxsp.to_f
    a级 = user.is_a?(Game_Actors) ? user.level.to_f : $game_party.max_level.to_f
    b攻 = self.atk.to_f
    b防 = self.pdef.to_f
    b特 = self.mdef.to_f
    b力 = self.str.to_f
    b速 = self.agi.to_f
    b灵 = self.dex.to_f
    b智 = self.int.to_f
    b血 = self.hp.to_f
    bM血 = self.maxhp.to_f
    b蓝 = self.sp.to_f
    bM蓝 = self.maxsp.to_f
    b级 = self.is_a?(Game_Actors) ? self.level.to_f : $game_party.max_level.to_f
    v = $game_variables
    钱 = $game_party.gold
    步 = $game_party.steps
    时 = Graphics.frame_count / Graphics.frame_rate
    lv = 0
    人 = 0
    尸 = 0
    for i in $game_party.actors
      尸 += 1 if i.dead?
      人 += 1 if i.exist?
      lv += i.level
    end
    怪 = 0
    for i in $game_troop.enemies
      怪 += 1 if i.exist?
    end
    f = skill_for.split(/最大/)
    f1 = f[0].split(/最小/)
    f2 = f[1].nil? ? [] : f[1].split(/最小/)
    if f1[1] != nil
      big,small,fr = f[1],f1[1],f1[0]
    elsif f2[1] != nil
      big,small,fr = f2[0],f2[1],f[0]
    elsif f[1] != nil
      big,small,fr = f[1],nil,f[0]
    else
      big,small,fr = nil,nil,f[0]
    end
    eval("damage = (#{fr}).to_i")
    damage = [damage,big.to_i].min if big != nil
    damage = [damage,small.to_i].max if small != nil
    self.damage = damage
  end
  def skill_effect(user, skill)
    # 清除会心一击标志
    self.critical = false
    # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
    # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
      # 过程结束
      return false
    end
    # 清除有效标志
    effective = false
    # 公共事件 ID 是有效的情况下,设置为有效标志
    effective |= skill.common_event_id > 0
    # 第一命中判定
    hit = skill.hit
    if skill.atk_f > 0
      hit *= user.hit / 100
    end
    hit_result = (rand(100) < hit)
    # 不确定的特技的情况下设置为有效标志
    effective |= hit < 100
    # 命中的情况下
    if hit_result == true
      # 计算威力
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # 计算倍率
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      # 计算基本伤害
      self.damage = power * rate / 20
#####菜刀到此一游####################################################
      diy_formula(user,skill.formula)
#####################################################################
      # 属性修正
      self.damage *= elements_correct(skill.element_set)
      self.damage /= 100
      # 伤害符号正确的情况下
      if self.damage > 0
        # 防御修正
        if self.guarding?
          self.damage /= 2
        end
      end
      # 分散
      if skill.variance > 0 and self.damage.abs > 0
        amp = [self.damage.abs * skill.variance / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # 第二命中判定
      eva = 8 * self.agi / user.dex + self.eva
      hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
      # 不确定的特技的情况下设置为有效标志
      effective |= hit < 100
    end
    # 命中的情况下
    if hit_result == true
      # 威力 0 以外的物理攻击的情况下
      if skill.power != 0 and skill.atk_f > 0
        # 状态冲击解除
        remove_states_shock
        # 设置有效标志
        effective = true
      end
      # HP 的伤害减法运算
      last_hp = self.hp
      self.hp -= self.damage
      effective |= self.hp != last_hp
      # 状态变化
      @state_changed = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)
      # 威力为 0 的场合
      if skill.power == 0
        # 伤害设置为空的字串
        self.damage = ""
        # 状态没有变化的情况下
        unless @state_changed
          # 伤害设置为 "Miss"
          self.damage = "Miss"
        end
      end
    # Miss 的情况下
    else
      # 伤害设置为 "Miss"
      self.damage = "Miss"
    end
    # 不在战斗中的情况下
    unless $game_temp.in_battle
      # 伤害设置为 nil
      self.damage = nil
    end
    # 过程结束
    return effective
  end
end[/pre]

评分

参与人数 1赞 +1 收起 理由
miantouchi + 1 精品文章

查看全部评分

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
发表于 2019-5-16 06:45:36 | 显示全部楼层
本帖最后由 89444640 于 2019-5-16 07:03 编辑

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


点评

游戏时间可以直接用 时 这个字来计算, 其实支持变量就可以做很多效果了, 另外对默认公式计算方式不了解的也可以干脆自定义算法  发表于 2019-5-16 10:05
回复

使用道具 举报

梦石
0
星屑
34459
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2019-5-16 08:28:40 | 显示全部楼层
说明栏那个窄小的地方,写公式貌似有些捉急。
其实可以写到公共事件脚本里,然后技能备注公共事件ID,
这样或许还要好一些。

点评

不过放公共事件可以避免抢地盘冲突, 技能本来就可以关联公共事件不需要备注嘛, 我试试改进下  发表于 2019-5-16 10:23
VA的公式栏也是小小的一条嘛, 再说会写复杂公式的也不需要用这个东西XD, 放公共事件,要避免自动换行出错太麻烦了~~  发表于 2019-5-16 10:00
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

遠航の猫咪

梦石
3
星屑
26947
在线时间
2423 小时
注册时间
2005-10-15
回帖
987

开拓者

发表于 2019-5-16 15:41:24 | 显示全部楼层
2016年就做过类似的啦:http://rpg.blue/thread-389962-1-1.html

点评

我这一辆车有两种牌子轮胎- -b  发表于 2019-5-17 21:46
造轮子是件很开心的事XD  发表于 2019-5-16 15:50
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复

使用道具 举报

梦石
0
星屑
15041
在线时间
2230 小时
注册时间
2019-1-24
回帖
964

R考场第七期纪念奖

发表于 2019-5-16 22:08:15 | 显示全部楼层
刚刚研究明白不带参数,最大、最小、最小-最大范围、固定伤害这块。带参数这块暂时没有啥奇葩思路,挺好的,参数的以后继续研究。如果你有啥奇葩技能
希望分享下,开拓下思路

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

点评

还有随机造成 0-9999 的伤害, 公式这样写 rand(10000)  发表于 2019-5-16 23:44
还有FF系列经典的 LV5即死, 等级是5的倍数伤害就是9999, 公式这样写 Integer(b等) % 5 == 0 ? 9999 : 0  发表于 2019-5-16 23:42
其实主要还是扩展BOSS使用的技能, 比如根据队员的等级总和进行的全体攻击, 要挑战它要么控制等级,要么控制人数, 否则这招一出就是全灭  发表于 2019-5-16 23:40
非常规技能嘛 ,像FF系列按比例扣血的重力啦, 以自己损失的血量来进行伤害的 差距剑啦, 一次性扔出全部钱来造成对应伤害的乾坤一掷啦,  发表于 2019-5-16 23:38
是的, 因这个函数的改动只是替换一下原本的伤害计算结果而已, 能动手的话把这段插到默认脚本比较好, 方便以后改造检查除错  发表于 2019-5-16 23:29
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部