god_mukin 发表于 2012-12-16 13:00:21

[实践出真理]紫晓对伤害目标(UnitDamageTarget)函数,攻击类型,伤害类型的研究

UnitDamageTarget( 伤害来源,伤害目标,伤害值,是否攻击伤害,是否远程攻击,攻击类型,伤害类型,武器类型),这个函数是做技能时的主要函数之一,但是其中的许多参数的作用却并非一目了然,最近开始用到这个函数,所以花了一天的时间进行了系统的研究,基本上已经解决问题。         文章分为三部分,第一部分搞清疑惑点,说明基本常识。第二部分,写出此函数的运行机制。第三部分,总结规律,简化后得出结论。【第一部分】[搞清疑惑点         简单来说,我们希望搞清楚4个问题。         什么情况下计算护甲。         什么情况下计算法抗。         什么情况下无视魔法免疫。         什么情况下可以伤害虚无。(经研究,发现,如果能伤害虚无单位,那么一定有伤害加成(平衡常数里调节的那个),不会出现虚无单位受伤但是没有加成的情况。)                  补充:对 是否攻击伤害,是否 远程攻击,2项测试后没有任何发现,是攻击伤害后此函数也不会触发 单位被攻击 事件,也不会对 尖刺外壳,硬化皮肤,步兵的盾牌等技能产生影响,所以这2个参数暂不讨论。 [基本常识]      
攻击类型决定是否计算法抗。是否计算法抗只看是否攻击类型 为 法术 或者 魔法。与 伤害类型无关。   伤害类型决定是否计算护甲。是否计算护甲只看是否伤害类型 为 普通。与 攻击类型 无关。         【法抗】                   法抗应该分为2种法抗,一种是 攻击类型为魔法时 需要计算的 魔攻法抗。(比如对战中人族女巫的物理攻击)另一种是 攻击类型为法术时 需要计算的 法术法抗。(比如暴风雪等技能造成的伤害)                   因为法抗其实只由2类技能提供,一类是 神秘腰带(魔法伤害减少),另一类 是 艾露尼之优雅(防御(物品),魔法防御属同类)                            [神秘腰带只提供 法术法抗(即只抵挡技能伤害,不抵挡魔法攻击伤害),并且 不能叠加,后获得的技能直接将 法术法抗值 覆盖(直接对变量赋值)。(覆盖后再丢弃物品就可以让法抗还原)                            [艾露尼之优雅在物编里只能设置 所受魔法伤害,所设置同时影响法术法抗和魔攻法抗(即2种法抗都乘以所受魔法伤害系数)。艾露尼之优雅可以完美叠加,与以前的法抗为相乘关系(法抗=法抗*艾露尼之优雅)。                   下面列出公式,一下就懂。                            魔攻法抗=艾露尼之优雅*艾露尼之优雅*艾露尼之优雅….(魔法攻击法抗仅受艾露尼之优雅影响,且互相之间相乘)                            法术法抗=最后一个获得的神秘腰带*神秘腰带之后的艾露尼之优雅*神秘腰带之后的艾露尼之优雅…(神秘腰带技能将以前的法抗系数都覆盖了,不过之后获得的艾露尼之优雅无影响)          【伤害类型】:伤害类型共22(13+1+6+2)种,主要有4类,分别为 普通类,魔法类,强化类,通用类。                   [普通类(共1种):只有 普通伤害类型                        对战游戏中,所有物理攻击的伤害类型为 普通。【特点】普通伤害类型一定而且只有普通伤害类型计算单位护甲。                    [魔法类(共13种):火焰,冰冻,闪电,神圣(神圣伤害类型其实应该翻译为光明系,如圣骑士的圣光伤害不死族),魔法,音速,力量,死亡,精神,植物,防御,灵魂锁链,暗影突袭                            魔法类很容易理解,死亡缠绕(攻击类型-法术,伤害类型-死亡)就是这种伤害类型的代表。【特点】无视护甲(只有普通伤害类型计算且一定计算护甲),不能伤害魔法免疫,如果攻击类型是法术则可以伤害虚无,与是否计算法抗无关。   
                        可以看到,和死亡缠绕,暴风雪这种小技能完全对应。(法术攻击,魔法伤害)                                        [强化类(共6种):强化,毒药,疾病,酸性,破坏,慢性毒药                            【特点】无视护甲(因为不是普通伤害类型),与是否计算法抗无关,攻击类型不是魔法则无视魔法免疫,攻击类型不是魔法则不能伤害虚无单位。                   [通用类(共2种):通用,未知                            【特点】无视护甲(因为不是普通伤害类型), 与是否计算法抗无关,如果攻击类型不是魔法则无视魔法免疫,如果攻击类型是法术则可以伤害虚无单位。【攻击类型】:攻击类型共7(5+1+1)种,分为3类,物理攻击类,魔法物理攻击类,法术。         [物理攻击类(共5种):普通,穿刺,攻城,英雄,混乱                   【特点】无视法抗。         [魔法物理攻击类(共1种):魔法-攻击类型                   【特点】需要计算 魔攻法抗。可以伤害虚无单位,无法攻击魔免单位(可以在平衡常数里修改为允许攻击魔免单位)[代表对战中,女巫等法师的物理攻击。         [法术类(共1种):法术                   【特点】需要计算 法术魔抗。

god_mukin 发表于 2012-12-16 13:00:56

本帖最后由 god_mukin 于 2013-1-1 14:31 编辑

【第二部分-摸清内部运行步骤】         UnitDamageTarget函数调用后,设置 伤害Real 为函数调入的伤害值, 魔攻法抗Real为单位的 魔法攻击类型抗性, 法术法抗Real 为单位的 法术攻击类型抗性。                            [第一步根据 攻击类型,护甲类型对 伤害Real 进行调整。         [第二步检测是否计算护甲.                            如果( 伤害类型 == 普通 ) Then ( 根据 护甲伤害减少 对 伤害Real 进行调整 )         [第三步检测是否伤害魔免单位,或者虚无单位                            如果( 单位是魔法免疫 )Then ( 判断伤害 是否 无视魔免 )                                             如果( 攻击类型==魔法 OR 伤害类型==魔法类13种 )Then( 此类伤害 不能伤害魔免单位, 伤害Real = 0 )                            否则如果( 单位是 虚无状态 )Then(判断伤害 是否 伤害虚无单位)//虚无无法与魔免同时存在                                             如果{( 攻击类型 == 魔法) OR ( 伤害类型 == 魔法类13种 )OR [ 攻击类型==法术 AND 伤害类型== 通用类2种 ]} Then( 设置 伤害Real * 虚无加成系数 )否则(说明不能伤害虚无单位 伤害Real = 0 )         [第四步计算法抗                            如果( 攻击类型 == 魔法 ) Then ( 伤害Real = 伤害Real * (1 –魔攻抗性Real )                            否则如果( 攻击类型 == 法术 ) Then ( 伤害Real = 伤害Real *(1- 法术法抗Real)                  

补充:是否伤害虚无单位与游戏平衡常数有关,如果设置攻城伤害类型对虚无单位的伤害为100%,则攻城类型-魔法类13种伤害也能造成伤害.

god_mukin 发表于 2012-12-16 13:01:08

本帖最后由 god_mukin 于 2013-1-1 14:46 编辑

【第三部分-总结】
[所有组合] 下面写出常见的常用的组合方式
从目标看,是否计算护甲,是否计算法抗,是否无视魔免,是否伤害虚无,共2*2*2*2=16种。其中有些种类不可能存在,如不可能既伤害虚无又不计法抗。
       补充:如果更改平衡常数表可以既伤害虚无又不计法抗,比如 攻城-火焰,只需设置 攻城类型对虚无伤害不为0即可

      从结果看,由3种攻击类型和4种伤害类型组合,共12种。
      最后总结得到8种情况。
      [计算护甲,无视魔免,不能伤害虚无,不计法抗] 物理攻击-普通伤害
      [计算护甲,无视魔免,不能伤害虚无, 计算法抗] 法术攻击-普通伤害
[计算护甲,不能伤害魔免,伤害虚无,计算法抗] 魔法攻击-普通伤害
      [不计护甲,不能伤害魔免,不能伤害虚无,不计法抗] 物理攻击-魔法伤害
      [不计护甲,不能伤害魔免,伤害虚无,计算法抗] 魔法攻击-魔法伤害, 魔法攻击-加强伤害, 魔法攻击-通用伤害, 法术攻击-魔法伤害
      [不计护甲,无视魔免,不能伤害虚无,不计法抗] 物理攻击-加强伤害, 物理攻击-通用伤害
      [不计护甲,无视魔免,不能伤害虚无, 计算法抗] 法术攻击-加强伤害
      [不计护甲,无视魔免,伤害虚无, 计算法抗] 法术攻击-通用伤害

神圣伤害:混乱攻击,加强伤害。这并非真正无敌的神圣伤害,因为 伤害虚无与不计法抗无法同时存在。混乱攻击,所以不计算法抗,并且护甲类型无影响(混乱攻击一般都是设为100%),加强伤害所以无视魔免,不计护甲。所以是写多少,打多少。不过不能打虚无单位。
               
附言:还有很多很细节的测试,比如,当单位身上有灵魂锁链技能时,受到 任意攻击类型-灵魂锁链伤害类型 伤害时就不分摊伤害…!!!而且单位既是虚无又有灵魂锁链BUFF时,所有魔法类13种伤害类型搭配任意攻击类型(不只是法术魔法)都可以伤害虚无单位,不过伤害量很小.(应该是伤害连续分摊的结果吧).不过,现在先不研究这个了…

美味豆沙包 发表于 2012-12-18 20:49:10

不错的研究文,写得很详细呢
但是有一些小错误需要补充一下:
存在既伤害虚无又不计法抗的伤害,但是需要在平衡性常数里面设置
默认除“法术攻击”和“魔法攻击”之外的伤害对虚无单位造成0伤害,但是这是可以修改的

god_mukin 发表于 2012-12-18 21:26:32

美味豆沙包 发表于 2012-12-18 20:49 static/image/common/back.gif
不错的研究文,写得很详细呢
但是有一些小错误需要补充一下:
存在既伤害虚无又不计法抗的伤害,但是需要 ...

页: [1]
查看完整版本: [实践出真理]紫晓对伤害目标(UnitDamageTarget)函数,攻击类型,伤害类型的研究