查看: 52|回复: 0

[转载发布] 仿VA自定义技能公式

[复制链接]
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 33 天

    连续签到: 1 天

    [LV.5]常住居民I

    2022

    主题

    32

    回帖

    7144

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5074
    OK点
    16
    积分
    7144
    发表于 同元一千年八月八日(秋) | 显示全部楼层 |阅读模式
      其实就是想做做看..... 感觉有不少童鞋不理解默认的技能伤害公式设置, 如果不会设置默认, 干脆用自定义吧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. # 攻击力: a攻      力量: a力     灵活: a灵   最大HP : aM血  ※M是大写
    35. # 防御: a防        智力: a智     HP: a血     最大SP : aM蓝
    36. # 特防: a特        速度: a速     SP: a蓝     等级 : a级 (敌人的话, 这个数值为
    37. #                                                        队伍里的最高等级)
    38. # 特殊参数:
    39. # v : v[1] 表示 1号变量的值
    40. # 钱: 持有的金钱
    41. # 步: 走过的步数
    42. # 时: 游戏时间(秒)
    43. # lv : 队伍总等级
    44. # 人 : 队伍里存活的人数
    45. # 尸 : 队伍里死掉的人数
    46. # 怪 : 场上剩余的怪物数量
    47. #------------------------------------------------------
    48. module RPG
    49.   class Skill
    50.     def formula
    51.       returnnilif@common_event_id == 0
    52.       returnnilif$data_common_events[@common_event_id].list[0].code != 108
    53.       returnnilif !$data_common_events[@common_event_id].list[0
    54.       ].parameters[0].include?("[公式]")
    55.       f = $data_common_events[@common_event_id].list[0
    56.       ].parameters[0].gsub("[公式]","")
    57.       for i in1..5
    58.         if$data_common_events[@common_event_id].list[i] != niland
    59.         $data_common_events[@common_event_id].list[i].code == 408
    60.           f += $data_common_events[@common_event_id].list[i].parameters[0]
    61.         end
    62.       end
    63.       return f
    64.     end
    65.   end
    66. end
    67. class Game_Battler
    68.   def diy_formula(user,skill_for)
    69.     if skill_for.nil?
    70.       return
    71.     end
    72.     a攻 = user.atk.to_f
    73.     a防 = user.pdef.to_f
    74.     a特 = user.mdef.to_f
    75.     a力 = user.str.to_f
    76.     a速 = user.agi.to_f
    77.     a灵 = user.dex.to_f
    78.     a智 = user.int.to_f
    79.     a血 = user.hp.to_f
    80.     aM血 = user.maxhp.to_f
    81.     a蓝 = user.sp.to_f
    82.     aM蓝 = user.maxsp.to_f
    83.     a级 = user.is_a?(Game_Actors) ? user.level.to_f : $game_party.max_level.to_f
    84.     b攻 = self.atk.to_f
    85.     b防 = self.pdef.to_f
    86.     b特 = self.mdef.to_f
    87.     b力 = self.str.to_f
    88.     b速 = self.agi.to_f
    89.     b灵 = self.dex.to_f
    90.     b智 = self.int.to_f
    91.     b血 = self.hp.to_f
    92.     bM血 = self.maxhp.to_f
    93.     b蓝 = self.sp.to_f
    94.     bM蓝 = self.maxsp.to_f
    95.     b级 = self.is_a?(Game_Actors) ? self.level.to_f : $game_party.max_level.to_f
    96.     v = $game_variables
    97.     钱 = $game_party.gold
    98.     步 = $game_party.steps
    99.     时 = Graphics.frame_count / Graphics.frame_rate
    100.     lv = 0
    101.     人 = 0
    102.     尸 = 0
    103.     for i in$game_party.actors
    104.       尸 += 1if i.dead?
    105.       人 += 1if i.exist?
    106.       lv += i.level
    107.     end
    108.     怪 = 0
    109.     for i in$game_troop.enemies
    110.       怪 += 1if i.exist?
    111.     end
    112.     f = skill_for.split(/最大/)
    113.     f1 = f[0].split(/最小/)
    114.     f2 = f[1].nil? ? [] : f[1].split(/最小/)
    115.     if f1[1] != nil
    116.       big,small,fr = f[1],f1[1],f1[0]
    117.     elsif f2[1] != nil
    118.       big,small,fr = f2[0],f2[1],f[0]
    119.     elsif f[1] != nil
    120.       big,small,fr = f[1],nil,f[0]
    121.     else
    122.       big,small,fr = nil,nil,f[0]
    123.     end
    124.     eval("damage = (#{fr}).to_i")
    125.     damage = [damage,big.to_i].minif big != nil
    126.     damage = [damage,small.to_i].maxif small != nil
    127.     self.damage = damage
    128.   end
    129.   def skill_effect(user, skill)
    130.     # 清除会心一击标志
    131.     self.critical = false
    132.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
    133.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
    134.     if((skill.scope == 3or skill.scope == 4)andself.hp == 0)or
    135.        ((skill.scope == 5or skill.scope == 6)andself.hp >= 1)
    136.       # 过程结束
    137.       returnfalse
    138.     end
    139.     # 清除有效标志
    140.     effective = false
    141.     # 公共事件 ID 是有效的情况下,设置为有效标志
    142.     effective |= skill.common_event_id > 0
    143.     # 第一命中判定
    144.     hit = skill.hit
    145.     if skill.atk_f > 0
    146.       hit *= user.hit / 100
    147.     end
    148.     hit_result = (rand(100) < hit)
    149.     # 不确定的特技的情况下设置为有效标志
    150.     effective |= hit < 100
    151.     # 命中的情况下
    152.     if hit_result == true
    153.       # 计算威力
    154.       power = skill.power + user.atk * skill.atk_f / 100
    155.       if power > 0
    156.         power -= self.pdef * skill.pdef_f / 200
    157.         power -= self.mdef * skill.mdef_f / 200
    158.         power = [power, 0].max
    159.       end
    160.       # 计算倍率
    161.       rate = 20
    162.       rate += (user.str * skill.str_f / 100)
    163.       rate += (user.dex * skill.dex_f / 100)
    164.       rate += (user.agi * skill.agi_f / 100)
    165.       rate += (user.int * skill.int_f / 100)
    166.       # 计算基本伤害
    167.       self.damage = power * rate / 20
    168. #####菜刀到此一游####################################################
    169.       diy_formula(user,skill.formula)
    170. #####################################################################
    171.       # 属性修正
    172.       self.damage *= elements_correct(skill.element_set)
    173.       self.damage /= 100
    174.       # 伤害符号正确的情况下
    175.       ifself.damage > 0
    176.         # 防御修正
    177.         ifself.guarding?
    178.           self.damage /= 2
    179.         end
    180.       end
    181.       # 分散
    182.       if skill.variance > 0andself.damage.abs > 0
    183.         amp = [self.damage.abs * skill.variance / 100, 1].max
    184.         self.damage += rand(amp+1) + rand(amp+1) - amp
    185.       end
    186.       # 第二命中判定
    187.       eva = 8 * self.agi / user.dex + self.eva
    188.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
    189.       hit = self.cant_evade? ? 100 : hit
    190.       hit_result = (rand(100) < hit)
    191.       # 不确定的特技的情况下设置为有效标志
    192.       effective |= hit < 100
    193.     end
    194.     # 命中的情况下
    195.     if hit_result == true
    196.       # 威力 0 以外的物理攻击的情况下
    197.       if skill.power != 0and skill.atk_f > 0
    198.         # 状态冲击解除
    199.         remove_states_shock
    200.         # 设置有效标志
    201.         effective = true
    202.       end
    203.       # HP 的伤害减法运算
    204.       last_hp = self.hp
    205.       self.hp -= self.damage
    206.       effective |= self.hp != last_hp
    207.       # 状态变化
    208.       @state_changed = false
    209.       effective |= states_plus(skill.plus_state_set)
    210.       effective |= states_minus(skill.minus_state_set)
    211.       # 威力为 0 的场合
    212.       if skill.power == 0
    213.         # 伤害设置为空的字串
    214.         self.damage = ""
    215.         # 状态没有变化的情况下
    216.         unless@state_changed
    217.           # 伤害设置为 "Miss"
    218.           self.damage = "Miss"
    219.         end
    220.       end
    221.     # Miss 的情况下
    222.     else
    223.       # 伤害设置为 "Miss"
    224.       self.damage = "Miss"
    225.     end
    226.     # 不在战斗中的情况下
    227.     unless$game_temp.in_battle
    228.       # 伤害设置为 nil
    229.       self.damage = nil
    230.     end
    231.     # 过程结束
    232.     return effective
    233.   end
    234. end
    复制代码

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

    本帖子中包含更多资源

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

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-3 07:27 , Processed in 0.047993 second(s), 44 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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