注册 | 登录

游侠NETSHOW论坛





查看: 5009|回复: 12
打印 上一主题 下一主题

[心得] 武功伤害的解析 [复制链接]

金庸无双工作组【技术】

帖子
437
精华
1
积分
628
金钱
7330
荣誉
19
人气
190
评议
0
跳转到指定楼层
楼主
发表于 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%波动








已有 1 人评分金钱 荣誉 收起 理由
max8068330 + 200 + 1 膜拜技術帝,對腳本有幫助

总评分: 金钱 + 200  荣誉 + 1   查看全部评分

使用道具 举报

至尊江湖工作组【版务】
思无邪

白金会员勋章活跃勋章荣誉勋章

帖子
17374
精华
1
积分
10859
金钱
61563
荣誉
182
人气
1517
评议
0
沙发
发表于 2013-8-25 17:58:40 |只看该作者
沙发  好复杂啊

使用道具 举报

帖子
1914
精华
0
积分
959
金钱
4899
荣誉
0
人气
6
评议
0
板凳
发表于 2013-8-25 18:04:22 |只看该作者
能不能一句话概括。。。

使用道具 举报

金庸无双工作组【技术】

帖子
437
精华
1
积分
628
金钱
7330
荣誉
19
人气
190
评议
0
地板
发表于 2013-8-25 18:05:18 |只看该作者
z7416535 发表于 2013-8-25 18:04
能不能一句话概括。。。

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

使用道具 举报

帖子
1914
精华
0
积分
959
金钱
4899
荣誉
0
人气
6
评议
0
5#
发表于 2013-8-25 18:06:50 |只看该作者
本帖最后由 z7416535 于 2013-8-25 18:08 编辑
oahp 发表于 2013-8-25 18:05
这个帖子是给那些一直纠结伤害计算人看的,无兴趣的玩家可以跳过。
...


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

使用道具 举报

金庸无双工作组【技术】

帖子
437
精华
1
积分
628
金钱
7330
荣誉
19
人气
190
评议
0
6#
发表于 2013-8-25 18:10:21 |只看该作者
z7416535 发表于 2013-8-25 18:06
没有简单易懂一点的吗?
...
我的意思是,某个招式的威力是200,不计算敌人防御的情况下,我的相应能力要 ...

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


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

使用道具 举报

帖子
231
精华
0
积分
146
金钱
1985
荣誉
3
人气
5
评议
0
7#
发表于 2013-8-25 18:12:35 |只看该作者
吓死。。

使用道具 举报

帖子
5137
精华
0
积分
2575
金钱
25844
荣誉
0
人气
52
评议
0
8#
发表于 2013-8-25 18:49:20 |只看该作者
看得好暈

使用道具 举报

帖子
1200
精华
0
积分
603
金钱
1168
荣誉
0
人气
5
评议
0
9#
发表于 2013-8-25 19:03:20 |只看该作者
复杂诶

使用道具 举报

大头像勋章白金会员勋章活跃勋章

帖子
15865
精华
0
积分
8005
金钱
8954
荣誉
3
人气
414
评议
0

10#
发表于 2013-8-25 19:06:41 |只看该作者
只能膜拜了~~

最恨不过流年~

使用道具 举报

帖子
16
精华
0
积分
8
金钱
193
荣誉
0
人气
0
评议
0
11#
发表于 2013-8-25 19:45:22 |只看该作者
仔细看了一遍,懂了。话说编程可以用小数么。
power = skill.power + user.atk * skill.atk_f / 100
此句无非是说 user.atk是否起作用,乘以系数就按0,1就可以,今后有需要按(0,1)区间的小数记不好么,这样也不用再除以100.难道是因为整形数值存储空间较小的缘故?。。

使用道具 举报

金庸无双工作组【技术】

帖子
437
精华
1
积分
628
金钱
7330
荣誉
19
人气
190
评议
0
12#
发表于 2013-8-25 20:15:02 |只看该作者
摘星子123 发表于 2013-8-25 19:45
仔细看了一遍,懂了。话说编程可以用小数么。
power = skill.power + user.atk * skill.atk_f / 100
此句 ...

因为技能设置里就已经规定了用0到100.没规定用小数

使用道具 举报

座天使·沙利叶
九弈

黄金圣斗士·山羊座·圣剑

大头像勋章白金会员勋章活跃勋章特色头衔勋章

帖子
16438
精华
1
积分
8938
金钱
2526
荣誉
49
人气
294
评议
0

13#
发表于 2013-8-25 23:49:53 |只看该作者
嚎腻害!新人学习了~没学到~

使用道具 举报

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

手机版|Archiver|游侠NETSHOW论坛 ( 苏ICP备2023007791号 )

GMT+8, 2025-8-7 03:03 , Processed in 0.363258 second(s), 13 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

分享到