じ☆ve冰风 发表于 2024-4-20 01:29:37

仿VA自定义技能公式

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

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

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

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

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

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



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

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

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号变量的值
# 钱: 持有的金钱
# 步: 走过的步数
# 时: 游戏时间(秒)
# lv : 队伍总等级
# 人 : 队伍里存活的人数
# 尸 : 队伍里死掉的人数
# 怪 : 场上剩余的怪物数量
#------------------------------------------------------
module RPG
class Skill
    def formula
      returnnilif@common_event_id == 0
      returnnilif$data_common_events[@common_event_id].list.code != 108
      returnnilif !$data_common_events[@common_event_id].list[0
      ].parameters.include?("[公式]")
      f = $data_common_events[@common_event_id].list[0
      ].parameters.gsub("[公式]","")
      for i in1..5
      if$data_common_events[@common_event_id].list != niland
      $data_common_events[@common_event_id].list.code == 408
          f += $data_common_events[@common_event_id].list.parameters
      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
      尸 += 1if i.dead?
      人 += 1if i.exist?
      lv += i.level
    end
    怪 = 0
    for i in$game_troop.enemies
      怪 += 1if i.exist?
    end
    f = skill_for.split(/最大/)
    f1 = f.split(/最小/)
    f2 = f.nil? ? [] : f.split(/最小/)
    if f1 != nil
      big,small,fr = f,f1,f1
    elsif f2 != nil
      big,small,fr = f2,f2,f
    elsif f != nil
      big,small,fr = f,nil,f
    else
      big,small,fr = nil,nil,f
    end
    eval("damage = (#{fr}).to_i")
    damage = .minif big != nil
    damage = .maxif 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 == 3or skill.scope == 4)andself.hp == 0)or
       ((skill.scope == 5or skill.scope == 6)andself.hp >= 1)
      # 过程结束
      returnfalse
    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 = .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
      # 伤害符号正确的情况下
      ifself.damage > 0
      # 防御修正
      ifself.guarding?
          self.damage /= 2
      end
      end
      # 分散
      if skill.variance > 0andself.damage.abs > 0
      amp = .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 != 0and 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

            本帖来自P1论坛作者灯笼菜刀王,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=477244若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 仿VA自定义技能公式