设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 8490|回复: 9
打印 上一主题 下一主题

[交流讨论] 技能伤害式初探

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
248 小时
注册时间
2010-8-22
帖子
127
跳转到指定楼层
1
发表于 2015-11-16 11:30:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 YamazakiRyusa 于 2015-11-16 15:37 编辑

写了一个小时,稍微理顺思路了。
于是技能伤害要全部重写一遍了2333
  1.   物理攻击,目标的物理防御力抵消攻击者的物理攻击力,两边同时进行放大是为了方便微调
  2.     n + (a.atk * 2 - b.def * 2)                      // 一比一物理伤害,n 是固定伤害量(下同)
  3.     n + (a.atk * 4 - b.def * 2)                      // 两倍物理伤害
  4.     n + (a.atk * n - b.def * 2)                      // N/2 倍物理伤害

  5.     n + (a.atk * 2 - b.def * 2 * (1 - ignore_rate) )  // 【穿甲】无视目标特定比例的物理防御力,例如
  6.       n + (a.atk * 2 - b.def * 2 * (1 - 30%) ) => n + (a.atk * 2 - b.def * 1.4) // 即无视目标 30% 物理防御力

  7.     n + (a.atk * 4 - b.def * 2) / fixed_rate * damage_rate
  8.       让伤害能够超过目标物理防御,然后进行一个比例的修正,最后乘以放大倍率。比如 N 连击的技能,用 fixed_rate 对应连击次数修正伤害过高的问题,如果直接在括号内改变倍率,有可能遇到无法破防的 BUG

  9.   物理攻击的衍生类型
  10.     n + (a.atk * 2 - b.mdf * 2)                      // 让目标以魔法防御力承受物理攻击伤害
  11.     n 这个固定伤害量可以设计为一个子式,如下例
  12.       (a.level / 40) * 200 + (a.atk * 2 - b.def * 2)
  13.         此时 n = (a.level / 40) * 200。物理伤害除了一个固定伤害量之外,附加一个攻击者的等级加权。意味着攻击者等级达到 40 级时,固定伤害量会达到 200 点,用 n = (a.level / fixed_level) * n1 这样的方式可以方便地对固伤量过大的问题进行修正
  14.     n1 + (a.agi * n2) + (a.atk * 2 - b.mdf * 2)        // 物理伤害除了一个固定伤害量之外,附加一个攻击者的敏捷值(AGI)加权,当攻击者速度越高时,附加的伤害量越大,例:
  15.       (a.agi * n2) = (a.agi / 150) * 100。类似于上面的等级加权,当攻击者速度达到 150 时,会得到 100 点额外的固定伤害量,当速度达到 300 时,固定伤害量翻倍到 200 点。
  16.     除了 a.level 以及 a.agi 之外,还可以用 a.luk(幸运值)进行类似的加权。

  17.   由此可以得到完整的物理攻击伤害推广式:
  18.   (n0 + n1 + n2 + n3 + ... + nn) + (a.atk * 2 - b.def * 2 * ( 1 - ingore_rate) ) / fixed_rate * damage_rate
  19.     其中:
  20.     n0 = 常数固定伤害量
  21.     n1 = (a.level / fix_level) * certain_value,等级加权的固定伤害量。攻击者等级等于 fixed_level 时返回 certain_value;攻击者等级等于 fixed_level 两倍时返回 certain_value * 2
  22.     n2 = (a.agi / fixed_agi) * certain_value,敏捷值加权的固定伤害量。攻击者等级等于 fixed_agi 时返回 certain_value;攻击者等级等于 fixed_agi 两倍时返回 certain_value * 2
  23.     n3 = (a.luk / fixed_luk) * certain_value,幸运值加权的固定伤害量。攻击者等级等于 fixed_luk 时返回 certain_value;攻击者等级等于 fixed_luk 两倍时返回 certain_value * 2
  24.     n4 ~ nn = 其他的脑洞固定伤害量
  25.     ingore_rate = 无视目标物理防御力的百分比
  26.     fixed_rate  = 连击类型伤害修正倍率,一般地应该等于连击次数
  27.     damage_rate = 简单粗暴的伤害放大倍率

  28.   魔法攻击
  29.     与物理攻击类似,仅需将 a.atk 与 b.def 替换为 a.mat 与 b.mdf。

  30.   其他特殊判定类型
  31.     n + (a.atk * 2 - b.mdf * 2)  // 强制让目标以魔法防御力承受攻击者的物理攻击
  32.     n + (a.mat * 2 - b.def * 2)  // 强制让目标以物理防御力承受攻击者的魔法攻击
  33.     n + (a.atk * 2 - b.atk * 2)  // 与目标“决斗”,攻击者物理攻击力比目标高时目标受到伤害
  34.     n + (a.mat * 2 - b.mat * 2)  // 与目标“斗法”,攻击者魔法攻击力比目标高时目标受到伤害
  35.     n + (a.def * 2 - b.def * 2)  // 与目标“冲撞”,攻击者物理防御力比目标高时目标受到伤害,重装机兵的“撞击板”伤害判定方式即为此
  36.     n + (a.def * 2 - b.mdf * 2)  // 与目标“冲撞”,攻击者物理防御力比目标魔法防御力高时目标受到伤害,这个可能比较罕见,但仍然写出来供参考了
  37.     n + (a.mdf * 2 - b.mdf * 2)  // 攻击者魔法防御力比目标高时目标受到伤害,这个可能比较罕见,但仍然写出来供参考了
  38.     n + (a.mdf * 2 - b.def * 2)  // 攻击者魔法防御力比目标物理防御力高时目标受到伤害,这个可能比较罕见,但仍然写出来供参考了
  39.     n + (a.atk * 2 - b.mdf * 2) + (a.mat * 2 - b.def * 2) // 同时具有物理攻击与魔法攻击伤害

  40.   其他可以写为 n 固定伤害加权或者 damage_rate 的小式子有
  41.     ((10 + a.mmp) / (10 + a.mp))        // 攻击者当前法力值越低,返回一个越大的值。可以用来制造一个竭尽全力的效果,在变量前加上 10 的修正值是为了避免出现除以零的问题
  42.     Math.random()*value                 // 返回一个 (0~1) * value 值的伪随机数

  43.   如果想设计真实伤害(即使无法破防仍然给出一定伤害量,则可以用如下的条件式)
  44.     (eval1) > (eval2)? (eval3):(eval4)  // 如果满足等式Ⅰ大于等式Ⅱ则返回等式Ⅲ,否则返回等式Ⅳ。注意不能用 return 缩写某个 eval
  45.     例如
  46.       (a.atk-b.def*0.5)<0?(a.level/5):(a.atk-b.def*0.5)
  47.     即无视目标 50% 物理防御进行攻击,未能穿透目标护甲时,强行附加基于攻击者等级五倍的伤害。
复制代码

Lv1.梦旅人

梦石
0
星屑
50
在线时间
248 小时
注册时间
2010-8-22
帖子
127
2
 楼主| 发表于 2015-11-16 15:35:15 | 只看该作者
本帖最后由 YamazakiRyusa 于 2015-11-16 18:16 编辑

一些常用的技能伤害公式模板
  1.     (a.atk-b.def)<0?(Math.random()*5):(a.atk-b.def)
  2.     ()<0?():()
  3.       如果不能破防则随机返回一个 0~5 的整数伤害值
  4.     (a.level/50)*300+(a.luk/140)*50+(a.mat*2-b.mdf)/2
  5.       吸血技能,角色达到 50 级时平均 HP 在 3000 左右;幸运值在 40 级时与 140 持平。如果敌人按照相同水平设置,则可以接受 500HP 左右的一次性伤害量
  6.     100+(a.level/50*500)+a.mat*2
  7.       治疗术,等级加权
  8.     ((a.level*5-b.def)/2)<0?(Math.random()*5):((a.level*5-b.def)/2)
  9.       狼嚎技能,事先进行破防修正,如果仍然不能破防则随机返回一个 0~5 的整数伤害值
  10.     ((a.level/30)*200+(a.atk-b.def))/2.5
  11.       致命乱舞,因为是五次连击将修正值设定为 5,乘以两倍伤害之后最终的修正值为 2.5
  12.     ((a.mat*2-b.mdf+a.atk*2-b.def)/2)<0?(Math.random()*10):((a.mat*2-b.mdf+a.atk*2-b.def)/2)
  13.       裁决之剑,无视目标 50% 物理与魔法防御进行穿透伤害,不能破防则随机返回一个 0~10 的整数伤害值
  14.     (((20+(1+a.agi)/100)*40+a.atk-b.def*0.7)/3.4)<0?(Math.random()*10):(((20+(1+a.agi)/100)*40+a.atk-b.def*0.7)/3.4)
  15.       枪突击,无视防御,速度加权
  16.     (a.atk-b.def*0.7)<0?(a.level*5):(a.atk-b.def*0.7)
  17.       破防重击,无视防御
  18.     ((a.level/25)*50+a.atk*2-b.def+a.mat/3)<0?(Math.random()*5):((a.level/25)*50+a.atk*2-b.def+a.mat/3)
  19.       元素枪,等级加权,附加魔法伤害
  20.     (10+(a.level/30)*40+(a.atk*5-b.def)/3)<0?(Math.random()*5):(10+(a.level/30)*40+(a.atk*5-b.def)/3)
  21.       剑舞,等级加权
  22.     (20+(a.luk/100)*30+(a.atk*2-b.def)/2)<0?(Math.random()*5):(20+(a.luk/100)*30+(a.atk*2-b.def)/2)
  23.       V字斩,幸运加权
  24.     ((10+a.level/30)*20+(a.atk*2+b.mdf/2-b.def)/2)<0?(Math.random()*5):((10+a.level/30)*20+(a.atk*2+b.mdf/2-b.def)/2)
  25.       封魔斩,等级加权,目标魔法防御力越高受到伤害越大
  26.     ((a.level/25)*50+(a.atk+b.def/2-b.mdf)/2)<0?(Math.random()*5):((a.level/25)*50+(a.atk+b.def/2-b.mdf)/2)
  27.       幽魂斩,等级加权,目标以魔法防御力承受伤害,目标物理防御越高伤害越大
  28.     ((a.level/25)*10+(a.agi/150)*30+a.atk-b.def)<0?(Math.random()*5):((a.level/25)*10+(a.agi/150)*30+a.atk-b.def)
  29.       弓箭技,等级加权,速度加权
  30.     (10+(a.agi/150)*30-b.mdf)<0?(Math.random()*5):(10+(a.agi/150)*30-b.mdf)
  31.       破魔箭,速度加权,消耗目标法力
  32.     ((a.level/25)*10+(a.agi/150)*30+(a.atk-b.def/2)/2.5)<0?(Math.random()*5):((a.level/25)*10+(a.agi/150)*30+(a.atk-b.def/2)/2.5)
  33.       众矢之的,等级加权,速度加权,五连射修正

  34.     (a.level/45*100+(a.mat-b.mdf))<0?(Math.random()*5):(a.level/45*100+(a.mat-b.mdf))
  35.       冰枪术,等级加权
  36.     (30+(a.mat-b.mdf)/2)<0?(Math.random()*5):(30+(a.mat-b.mdf)/2)
  37.       火球术
  38.     (((1+a.mmp)/(1+a.mp))*50+(a.mat*2-b.mdf)/2)<0?(Math.random()*5):(((1+a.mmp)/(1+a.mp))*50+(a.mat*2-b.mdf)/2)
  39.       暗黑球,当前 MP 越低伤害越高
  40.     (a.level/45*100+(a.mat-b.mdf*0.7))<0?(Math.random()*5):(a.level/45*100+(a.mat-b.mdf*0.7))
  41.       闪电术,等级加权,无视目标魔法防御力
  42.     (1+(a.level/20)*50+(a.mat*3-b.mdf)/3)<0?(Math.random()*5):(1+(a.level/20)*50+(a.mat*3-b.mdf)/3)
  43.       土炮术,等级加权
复制代码
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2920
在线时间
713 小时
注册时间
2010-7-25
帖子
813

开拓者

3
发表于 2015-11-16 18:35:10 | 只看该作者
你知道伤害公式里更改变量和获得、取消状态的写法是怎么写吗?还是和以前一样吗?

点评

game_batterbase里的能力都可以吧。。。  发表于 2015-11-21 23:13
我觉得那是懂英文或者已经知道我要找的东西的写法的前提下才能成立……会英文看脚本肯定比不会英文的看中文翻译还要更直观  发表于 2015-11-18 08:11
全局搜索英文并没有什么区别  发表于 2015-11-17 06:51
……方法名已经够直白了  发表于 2015-11-17 06:51
而且当我想找东西却不知道英文写法的时候,例如我想知道判定暴击的写法,就全局搜索 暴击、会心、致命 总能找到它对应的写法。  发表于 2015-11-16 23:00
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
90 小时
注册时间
2007-8-14
帖子
25
4
发表于 2015-11-16 19:32:52 | 只看该作者
本帖最后由 chaizi1992 于 2015-11-16 19:34 编辑

减法公式虽然简单,但是不太好用,攻击和防御的投放比一旦失控经常出现0伤害的情况。
网络游戏中常用的公式是除法公式:
普攻伤害=A的攻击/(1+免伤系数*B的防御)
我使用的免伤系数是0.003,自测还行。
其余技能都在普攻公式的前提下增加一些系数修正或者额外伤害

点评

这个好!  发表于 2015-11-17 16:48
其实装备的防御力低一点,HP增加多一点就行了  发表于 2015-11-16 23:15
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
130
在线时间
23 小时
注册时间
2013-2-14
帖子
1
5
发表于 2015-11-17 14:11:04 | 只看该作者
想了半天 还是用了 WOW 的 a.atk^2 / a.atk + b.def 公式 _(:зゝ∠)_

点评

为什么要先atk^2再除atk?计算不是一样的吗?而且为何最后要加敌人的防御力?  发表于 2015-11-18 08:17
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
29 小时
注册时间
2015-10-28
帖子
30
6
发表于 2015-11-19 02:22:26 | 只看该作者
FF5武器防具固定攻击力和防御力的方式也可以采用,然后根据武器种类和自身能力的系数区分,自身能力根据职业和被动技能固定,等级也被纳入伤害计算中


Swords:
攻击力计算:Dmg = ([Wpn. Atk x (1~1.125)] - Tar. Def) x ([Lv x Str / 128] + 2), []表示取整,以下同。
特殊设定:
1. 支持"BothHand"技能,装备该技能后,攻击倍率加倍。
2. 支持魔法剑

Spears:
攻击力计算:与Swords完全相同
特殊设定:
当使用"Jump"指令攻击时,Dmg=Dmgx2

Katanas:
攻击力计算:与Swords完全相同
特殊设定:
1. 长刀类武器支持"BothHand"技能,装备该技能后,攻击倍率加倍。
2. 长刀类武器有会心一击率,一般是12%,也可能更高,最高为村雨(25%)。当出现会心一击时,伤害值计算公式中的攻击力加倍,防御力视为0,即([Wpn. Atk x (1~1.125)] x 2) x ([Lv x Str / 128] + 2)。

Bows:
攻击力计算:和Knives完全相同
特殊设定:
后列攻击不变,伤害类型为空系(也就是说对大多数飞鸟敌人来说不会Miss)。

Rods:
攻击力计算:Dmg=([Wpn. Atk x (0~1)] x 2 - Tar. MDf) x ([Lv x Mag / 256] + 2)
特殊设定:
1. 后列攻击不变。伤害类型为黑魔法系。
2. Rods的攻击因为是魔法攻击,可以被Aegis Shield或敌人的魔法回避率回避掉。

评分

参与人数 1星屑 +10 收起 理由
YamazakiRyusa + 10 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
75
在线时间
75 小时
注册时间
2011-3-17
帖子
133
7
发表于 2015-11-19 07:28:50 | 只看该作者
好评,研究的很详细
MDF-MDF应该可以看成开着防护罩撞开着防护罩的对手吧
回复 支持 反对

使用道具 举报

Lv2.观梦者

会吐槽的画师

梦石
0
星屑
782
在线时间
3431 小时
注册时间
2011-6-10
帖子
6535
8
发表于 2015-11-19 08:27:05 | 只看该作者
我的技能伤害其中20%部分
RUBY 代码复制
  1. def make_obj_damage_value(user, obj)
  2.     damage = obj.base_damage      
  3.     if damage > 0   
  4.       damage += (user.atk * obj.atk_f/100).round      
  5.       damage += (user.spi * obj.spi_f/100).round      
  6.       damage -= (self.def * obj.atk_f/100).round
  7.       damage -= (self.spi * obj.spi_f/100).round   
  8.     elsif damage < 0                           
  9.       damage -= (user.atk * obj.atk_f/50).round   
  10.       damage -= (user.spi * obj.spi_f/50).round      
  11.     end
  12.     damage *=100  if user.state?(50) and [705,706,714].include? obj.id
  13.     damage *=100  if user.state?(62) and [233,234,243].include? obj.id
  14.     damage *=100  if user.state?(83) and [221,226,227].include? obj.id
  15.     damage *=100  if user.state?(84) and [224,225].include? obj.id
  16.     damage += user.atk*100 if  [246].include? obj.id
  17.     if $game_switches[424] == true
  18.        damage *=1.20
  19.      end
  20.     damage *=(1 + user.atts/100)
  21.     damage *=(1 - self.skis/100)
  22.     damage *= elements_max_rate(obj.element_set)
  23.     damage /= 100
  24.     damage = (apply_variance(damage, obj.variance)).round   
  25.     damage = (apply_guard(damage)).round  
  26.     damage *=(1.000 + (($game_temp.combo_hit/100.000) *(2.000 + $game_variables[60]/100.000)))
  27.     $game_variables[69] = sprintf("%.2f",(2.000+($game_variables[60]/100.000))).to_f
  28.     $game_variables[71] = damage
  29.     if obj.damage_to_mp  
  30.       @mp_damage = (damage).round                        
  31.     else
  32.       @hp_damage = (damage).round                  
  33.     end
  34.   end
长名公主玩家群:372588926 攻略娱乐应有尽有
了解更多新RM游戏,游戏制作请加入RPGmaker支援群:113622890
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
248 小时
注册时间
2010-8-22
帖子
127
9
 楼主| 发表于 2015-11-20 12:10:00 | 只看该作者
jianyulei 发表于 2015-11-16 18:35
你知道伤害公式里更改变量和获得、取消状态的写法是怎么写吗?还是和以前一样吗? ...
其实装备的防御力低一点,HP增加多一点就行了

这样做除了无限放大显示数字之外没有任何用处,而且数字位数多大反而不太容易阅读。
记得 DNF 改版就有网友这样吐槽过,老版本的伤害万位千位,一下子就能看得出来,现在一大串……
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

10
发表于 2015-11-21 23:15:12 | 只看该作者
(b.def-a.str%15)*3怎样。。。
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-22 20:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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