游侠NETSHOW论坛

标题: 武功伤害的解析 [打印本页]

作者: oahp    时间: 2013-8-25 17:49:53     标题: 武功伤害的解析

看了一些人发武功伤害的帖子,但是还是有很多的问题。如果想真正的理解武功伤害是如何计算的,那么必须要彻底的理解一段代码
我先把这段代码贴上
  #--------------------------------------------------------------------------
  # ● 获取技能攻击伤害
  #--------------------------------------------------------------------------
  def event_damage_skill(user,event,skill)
    # 计算威力
    power = skill.power + user.atk * skill.atk_f / 100
    if power > 0
      power -= event.pdef * skill.pdef_f / 200
      power -= event.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)
    # 计算基本伤害
    damage = power * rate / 20
    # 分散
      if skill.variance > 0 and damage.abs > 0
        amp = [damage.abs * skill.variance / 100, 1].max
        damage += rand(amp+1) + rand(amp+1) - amp
      end
      if skill.plus_state_set.size > 0
        if rand(100) > 100-rand(skill.hit)
          #==============左岸修改,不知道为什么原先程序只取技能第一状态==
          for state in skill.plus_state_set
          #event.add_state(skill.plus_state_set[0])
          event.add_state(state)
          end
        #=====================注释掉的内容是原先的代码========================
        end
      end
    return damage
  end




然后我来解析一下
power = skill.power + user.atk * skill.atk_f / 100
这是先获取威力的skill.power就是招式的威力,user.atk 就是人物的攻击力,也就是受各种武器影响后的最终攻击力
skill.atk_f就是招式的攻击力,在原版1.0中,外功攻击全是100,内功攻击全是0.如果这个算不是0,武器的攻击力才有效果
到了晴天版,这里出现了50,80等等非100的数字,也就是人物的攻击力只有50%起效,或者80%起效。
接下来的
    if power > 0
      power -= event.pdef * skill.pdef_f / 200
      power -= event.mdef * skill.mdef_f / 200
      power = [power, 0].max
    end
这是破防招,内功防御,外功防御的控制
如果是内功攻击,那么skill.pdef_f就是0,让event.pdef 不起作用,对power不影响
也就是招式的外功防御为0,让敌人的外防不起作用,只有内防起作用
如果两个都是0,就是破防招了。
所以定义武功的时候,下面的两个物理防御和魔法防御越小,武功威力越高。
到了晴天版,出现多不规范的东西。在3.67中,我会修正。

接下来的
    # 计算倍率
    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)
    # 计算基本伤害
    damage = power * rate / 20

这个就是四维的计算了,先去rate = 20,最后除以20,是为了防止小于1

再下面的
# 分散

是在设置分散的范围里,随机取消,这个分散一般设置15。
也就是上面计算的结果,在15%上下波动

最后是招式负面状态的启用
这段代码我修改了,加了我名字的注释
原来的程序只有招式的第一个状态才起效
也就是像打狗棒,虽然负面效果多,其实只有第一个是有用的
我修改后,是全面起效的。


现在举例说一个
比如3.66的三才剑法
威力18,外功,招式攻击力100,刚100

如果人物的攻击力是20,四维都是100,那么计算如下
先是
power=18+20*100/100=38(其实两个100抵消,就是攻击力20起作用)
接着计算敌人防御,假设敌人外防御,内防御都是10
      power -= 10* skill.pdef_f / 200——————因为是外功攻击,所以这里的skill.pdef_f 是100所以power减少5
      power -= 10* skill.mdef_f / 200——————因为外功攻击,所以这里skill.mdef_f是0.所以不变
      power = [power, 0].max,保证power不能是负数

如果是破防招,才够不要减少skill.pdef_f ,和skill.mdef_f都是0

这时pow已经是33了

接下来计算四维
因为三才剑只有刚100
所以
    rate = 20
    rate += (user.str * skill.str_f / 100)==================因为刚100,所以这句有效,skill.str_f为100,我假设了user.str,也就是人物刚为100
    rate += (user.dex * skill.dex_f / 100)==================愈,无效skill.dex_f为0
    rate += (user.agi * skill.agi_f / 100)==================轻,无效skill.agi_f 为0
    rate += (user.int * skill.int_f / 100)====================柔,无效skill.int_f为0
    # 计算基本伤害
    damage = power * rate / 20


计算得到rate=120
damage=33*120/20=198

然后是198在15%波动









作者: kirin1990    时间: 2013-8-25 17:58:40

沙发  好复杂啊
作者: z7416535    时间: 2013-8-25 18:04:22

能不能一句话概括。。。
作者: oahp    时间: 2013-8-25 18:05:18

z7416535 发表于 2013-8-25 18:04
能不能一句话概括。。。

这个帖子是给那些一直纠结伤害计算人看的,无兴趣的玩家可以跳过。{:dm(16):}

作者: z7416535    时间: 2013-8-25 18:06:50

本帖最后由 z7416535 于 2013-8-25 18:08 编辑
oahp 发表于 2013-8-25 18:05
这个帖子是给那些一直纠结伤害计算人看的,无兴趣的玩家可以跳过。
...


没有简单易懂一点的吗?
...
我的意思是,某个招式的威力是200,不计算敌人防御的情况下,我的相应能力要到多少点才能达到1W点伤害。。。

作者: oahp    时间: 2013-8-25 18:10:21

z7416535 发表于 2013-8-25 18:06
没有简单易懂一点的吗?
...
我的意思是,某个招式的威力是200,不计算敌人防御的情况下,我的相应能力要 ...

条件复杂,我无法给出答案


{:41:}楼主,我怎么觉得,你这样问,就是:“我只要第三层”

作者: sh13587635945    时间: 2013-8-25 18:12:35

吓死。。
作者: 柳應任    时间: 2013-8-25 18:49:20

看得好暈
作者: 狂~正邪    时间: 2013-8-25 19:03:20

复杂诶
作者: ケ泠_若_风マ    时间: 2013-8-25 19:06:41

只能膜拜了~~

作者: 摘星子123    时间: 2013-8-25 19:45:22

仔细看了一遍,懂了。话说编程可以用小数么。
power = skill.power + user.atk * skill.atk_f / 100
此句无非是说 user.atk是否起作用,乘以系数就按0,1就可以,今后有需要按(0,1)区间的小数记不好么,这样也不用再除以100.难道是因为整形数值存储空间较小的缘故?。。

作者: oahp    时间: 2013-8-25 20:15:02

摘星子123 发表于 2013-8-25 19:45
仔细看了一遍,懂了。话说编程可以用小数么。
power = skill.power + user.atk * skill.atk_f / 100
此句 ...

因为技能设置里就已经规定了用0到100.没规定用小数
作者: 九弈    时间: 2013-8-25 23:49:53

嚎腻害!新人学习了~没学到~




欢迎光临 游侠NETSHOW论坛 (https://game.ali213.net/) Powered by Discuz! X2