因为不同游戏的战斗机制的不同,实际上战斗数值是一个非常复杂的问题。看了一些文章都是直接从数学公式入手,游戏小白看起来比较难。写这篇文字主要是简单的厘清概念,以此来说明战斗数值策划过程中考虑的关键因素。
基础概念
基础属性
RPG游戏是基于战斗为主题的游戏,其主要的核心属性主要为生命、攻击、防御三个基础属性。随着游戏玩法的丰富,在这三个属性下面有产生了二级、三级的属性。如攻击属性拆分为魔法攻击、物理攻击等二级属性,还可以继续拆分成命中率、攻击速度等属性。
RPG游戏里面一些常见的属性如下:
- DMG = damage 伤害
- PD = physical damage 物理伤害
- MD = magic damage 魔法伤害
- TD = true damage 真实伤害
- ATK/AP = attack 攻击 / attack power 攻击
- PA = physical attack 物理攻击
- MA = magic attack 魔法攻击
- CRIT = critical hit 暴击
- CRIT DMG/CRI = critical damage 暴击伤害
- CRIT RATE/CRT = critical damage 暴击率
- HR = hit rate 命中率
- SPD = attack speed 攻击速度
- DEF = defense 防御
- PD = physical defense 物理防御
- MD = magic defense 魔法防御
- BLK = block 格挡
- BLK RATE = block rate 格挡率
- EVD/DEG = evade rate 闪避率 / dodge chance 闪避率
- HP = health point/hit point 生命
- REG = hp regeneration 生命恢复
不同游戏对上述概念的定义、机制略有不同,甚至连单词和缩写都略有不同,建议参考具体游戏的文档和说明。
有些游戏还有护盾、元素伤害、眩晕等机制,这里罗列只是一些通用的概念。
核心概念
在开始介绍战斗计算之前,有必要了解几个游戏策划常用的核心概念。这些概念虽然很少直接展现给玩家,但是却是做数值策划时必须考虑的因素。
- DPS 每秒伤害输出
DPS(damage per second,每秒伤害输出),是指角色每秒综合输出的伤害总量。DPS叠加了装备、技能、等级等影响,DPS是衡量一个角色输出能力的重要指标,反映了角色在战斗中输出伤害的效率。
DPS跟角色的伤害输出(含自身攻击属性、装备和技能加成等)和角色攻击频率相关。DPS 可以简单计算如下:
DPS = DMG * HitsPerSecond
另一个伤害相关的概念是 DPH(damage per hit,单次攻击伤害) ,更侧重于衡量角色在特定技能或武器装备加成下单一次 的攻击伤害的水平。
- DR 减伤率
DR(damage reduction,减伤率)是指角色受到伤害时,因为角色防御而减少的伤害比例。DR 是衡量角色防御水平的一个重要指标,反映了角色在战斗中的生存能力。
对方攻击角色时会因为角色的防御(含自身防御、装备加成等)而减少一部分伤害。DR和伤害的关系可以简单计算如下:
DMG = ATK * ( 1 - DR)
既 DR = 1 - DMG / ATK
DR是一个综合性的概念,跟游戏的伤害公式、游戏的玩法机制有关系。
如果伤害公式选择的是减法公式( DMG = ATK - DEF
),则DR = (ATK - DEF)/ ATK
。如果伤害公式选择的是乘法公式( DMG = ATK * (1- DR)
),则直接得出DR。
不同游戏的伤害计算公式不同,DR计算也会不同,但是DR仍然可以作为一个衡量角色防御水平的一个重要概念。
- EHP 有效生命值
EHP( effective health points,有效生命值),是指角色在拥有防御(含角色自身防御、装备和技能等加成)时拥有的有效生命值。有效生命比基础生命更能反映角色在战斗过程中的生存能力。
有效生命可以简单的计算如下:
EHP = HP / (1 - DR)
即因为有角色减伤的存在,相当于角色拥有了更多的有效生命。
- TTK 击杀时间
TTK(time to kill,击杀时间)是指角色击败对手所需要的时间。TTK作为一个衡量战斗节奏的重要指标。在游戏过程中,相比于玩家能直观感受到的战斗动作、战斗特效等因素,在做数值策划时,更应该关注TTK。
TTK可以简单的计算如下:
TTK = EHP / DPS
在RPG游戏中,不仅要考虑战斗的输赢,还必须考虑角色在PVP、PVE过程中的TTK。合理的设置TTK,有助于为用户创造不同的战斗体验。
伤害计算
伤害计算公式是一个游戏最核心的设定,决定了游戏的玩法机制。合理设定伤害计算公式,不仅能让忘记获得良好的游戏体验,也能促进游戏健康、合理的发展。
伤害计算公式
RGP游戏的战斗基本上是围绕着不同角色的生命HP、攻击ATK、防御DEF的计算。当然也有一些复杂的游戏有特殊的机制,这里主要以基于HP、ATK、DEF的基础计算公式来阐述主要考虑的因素。
RPG游戏中比较常见的伤害计算公式主要有减法公式、乘法公式,以及由此派生出来的各种变种的公式。
减法公式
减法公式如下:
DMG = ATK - DEF
减法公式的主要特点有:
简单好理解
减法公式的参数比较少,公式就是一个加减法的问题,很容易理解。特别对于一些需要精确计算数值的游戏,如卡片类游戏等,简单的计算是至关重要的。攻击和防御对伤害数值变化敏感
每1点的攻击或防御就对应1点伤害,伤害的变化随着攻击和防御的变化而线性变化。
这种敏感的数值变化,更适合于小数值的游戏,让玩家可以感受每一点属性变化带来的不同体验。攻击和防御收益过于平均
攻击和防御的收益在战斗中的收益是等效的,对于伤害收益来说来说每1点的攻击等效于1点的防御。过于平均的收益会导致角色过度关注单一的属性,例如玩家会堆积防御属性,而不追求攻击属性。
也有一些游戏通过调整系数来降低防御的收益,例如DMG = ATK - 0.5 * DEF
,直接让防御的收益减半来规避问题。
对于一些角色自由成长要求不高的游戏,减法公式是一个不错的选择。如简单的单机游戏,角色升级后属性加点是固定的,忘记不需要选择成长属性。会出现不破防的问题
从公式可以看出,当 ATK <= DEF 时 DMG <=0 。但防守方的防御过高时,会出现砍不动对手的可能。
针对不破防的问题,部分游戏通过修改伤害计算公式来避免。例如,设定最小伤害为攻击的10%,即当 DMG <= ATK * 10%时,DMG = ATK * 10%。攻防改变时,对有效生命EHP和战斗时间TTK的影响不规律
游戏中有效生命EHP决定这角色是生存能力,为了保证角色之间的战力平衡,生命值的投放是一个需要慎重考虑的属性。游戏应该有一个规律的投放方式。战斗时间TTK非常影响战斗体验,是一个需要衡量的重要因素。
从EHP、TTK和DMG的公式可以得出:
EHP = HP * ATK / (ATK - DEF)
TTK = HP / DMG = HP / ( ATK - DEF )
假设,HP = 10,ATK = 10, DEF = 9,那么EHP = 100,TTK = 10。若其他数值不变,角色的ATK提升1个点,即ATK = 11,那么EHP = 55,TTK = 5。ATK增加1个点,ERP减少45点,TTK减少5个点。
可以看出,ATK的提升是线性的,带来的DMG的变化也是线性的,但是对EHP、TTK的影响却不是线性的。在减法公式里面,ATK和DEF越接近,其对变化对EHP、TTK的影响越大,这会对玩家产生困惑。
当然,也有一些游戏利用减法公式的收益非线性增长的特点来设置游戏关卡,出现卡在关卡上时,增加一点就轻易通关的体验。
如果要使用减法公式,又想要控制战斗时间TTK,可以考虑等比的投放对应的HP。战斗力不绝对
在减法公式下,A战胜B、B战胜C,无法得出A战胜C的结论。
假设角色之间的攻击频率是相等的,想要战胜对方,则需要有相对比较大的TTK。
例,A战胜B、B战胜C,,则 TTK_a > TTK_b、TTK_b > TTK_c,即:
HP_a / ( ATK_b - DEF_a) > HP_b / ( ATK_a - ATK_b)
HP_b / ( ATK_c - DEF_b) > HP_c / ( ATK_b - ATK_c)
上述两个公式无法推导出(推导过程为数学问题,本文省略):
HP_a / ( ATK_c - DEF_a) > HP_c / ( ATK_a - ATK_c)
当然,合理的利用减法公式的战力不传递的特性,可以设计出A、B、C相互克制的关系。
综上所述,减法伤害计算公式适用于:
- 需要设置门槛的关卡类游戏。利用战斗时间不线性变化的特点,让角色在关卡临界值的上提升属性时,通关效率显著提升。
- 需要频繁计算属性加成的策略类游戏。利用减法公式简单易计算的特点,如战棋类游戏,让玩家频繁计算属性更容易一些。
- 不需要角色成长的休闲类游戏。因为角色无需成长,避免了减法公式在成长过程中容易失控的缺点。
乘法公式
乘法公式如下:
DMG = ATK * ( 1 - DR%)
其中,DR%为防御减伤率。一些游戏对减少率的计算如:DR% = DEF / (DEF + α) [ α为常数]。那么这个公式可以表示为:
DMG = ATK * ( 1 - ( DEF / ( DEF + α) ) ) [ α为常数 ]
乘法公式的特点有:
防御的收益是边际递减的
防御的免伤率为 DR% = DEF / (DEF + α) ,是一个无限接近于 1的数值。从公式可以得出,防御的收益是非线性的,前期收益高于后期的收益。
后期防御的收益边际递减,可以避免忘记通过纯堆叠防御属性来获得优势,但是也会导致玩家后期对提升防御力动力减小。
合理的利用乘法公式防御收益边际递减的特点,可以引导玩家在不同游戏节奏里面提升不同的属性。角色有效生命EHP只跟自己属性有关,跟对手属性无关
在战斗过程中角色的防御力最终体现在EHP上。通过有效生命EHP 和 DR 的公式可以得出:
EHP = HP * ( DEF + α ) / DEF
EHP只跟自身的DEF有关系,其价值对所有敌人来说是恒定的。一方面减低了数据平衡性的调控难度。另一方面也让玩家在面对不同对手时能拥有比较一致的体验。不会出现不破防的问题
因为防御的免伤率无限接近于1,而不会等于1,所以DMG不会等于0。每点攻击的效益是一致,且相对稳定
通过乘法伤害公式得出:
DMG = ATK * ( 1 - DR% )
当对手的免伤率DR%不变时,每增加1点的ATK,就会造成等比例的DMG收益。
对应到战斗时间里面,TTK为:
TTK = EHP / ATK
可以看出,当ATK取值较大时,ATK的增长TTK的变化会变得比较平缓。根据这个特点来说,乘法公式更适合于较大数值的游戏。
另外,从公式可以看出当ATK发生百分比变化时TTK也是相对可控的。例如, ATK对于增加100%,代入公式TTK相应减少 1/(1+100%) ≈ 50%,对应降低了1倍。乘法公式对于提升百分比伤害的游戏机制比较友好。战斗力是绝对的
在乘法公式下,A战胜B、B战胜C。假设角色之间的攻击频率是相等的,想要战胜对方,则需要有相对比较大的TTK。
例,A战胜B、B战胜C,则 TTK_a > TTK_b、TTK_b > TTK_c,即:
HP_a / (ATK_b *(1 - DR_a%) ) > HP_b / (ATK_a *(1 - DR_b%) )
HP_b / (ATK_c *(1 - DR_b%) ) > HP_c / (ATK_b * (1 - DR_c %) )
公式两边同乘公约数后,可以推导出(推导过程本文省略):
HP_a / (ATK_c * (1 - DR_a%) ) > HP_c / (ATK_a * (1 - DR_c%) )
在乘法公式里面,玩家对强弱的认定比较简单,战力高的角色必然战胜战力低的角色。
综上所述,乘法公式适用于如下游戏:
- 角色成长玩法较深度的游戏:利用乘法公式收益可控的特性,减少出现高级玩家完胜低级玩家的优势。
- 有多种角色或GVG类的游戏:乘法公式的有效生命值只涉及角色自身防御水平,在多种角色或组队战斗时,比较容易调节角色之间的平衡性。
- 角色成长自由度较高的游戏:乘法公式攻击和防御的收益相对平衡,比较难以通过堆叠单一属性来获取较大优势。
伤害公式的变化
上文只是以HP、ATK、DEF来举例说明伤害计算公式,在实际的游戏中并不会这么简单,不同的游戏对伤害计算公式还有着不同的考量。
- 加入等级压制
以魔兽世界的伤害计算公式为例,其采用了乘法公式为基础,在公式里面增加了攻击方的等级参数:
DR% = DEF / (DEF + 400 + 85 × LEV_a) [LEV_a为攻击方的等级]
DMG = ATK * (1 - DEF / (DEF + 400 + 85 × LEV_a) )
防守方的防御会受到攻击方等级的影响,等级参数为跟攻击方等级相关的函数f(lv)。攻击方的等级越高,防守方能的免伤率越低。这个改动提供了等级的收益,使得高等级角色能更简单的战胜低等级角色,引导角色升级。
还有一部分游戏增加了防守方的等级系数进行修正:
DR% = DEF / (DEF + α + LEV_d) [α为常数,LEV_d为攻击方的等级系数]
DMG = ATK * (1 - DEF / (DEF + α + LEV_d系数) )
咋一看有点奇怪,防守方等级高了免伤率却更低了。但是也可以利用在这个问题,让DEF获得了更多的投放空间。在LEV_d变大时,DEF可以获得更高得增长,让RD%的增长可控。
- 加入战斗力压制
战斗力计算经常是不太准确的(这里不展开说明),为了让战斗力更准确的表达玩家强弱区别,也有一些游戏会在伤害公式里面增加战斗力的参数,如:
DR% = DEF / (DEF + 100 + f(HT_a, HT_d))) [f(HT_a,HT_d)为攻击方和防守方的战斗力差值参数]
DMG = ATK * (1 - DEF / (DEF + 100 + f(HT_a, HT_d))))
加入了战力差值作为修正参数,更高的战斗力可以在战斗过程中起到压制作用,提升了战斗力这个数值的作用,引导玩家最求更高的战斗力水平。
- 除法公式
以暗黑破坏神的公式为例,采用了除法公式。当然可以把除法公式看成是乘法公式的一种变体。
DMG = ATK * ATK / ( ATK + DEF )
等价于 DMG = ATK * (1 - DEF/ (ATK + DEF))
从公式可以看出,增加了攻击方攻击属性ATK的收益。角色增加ATK时,可以获得非线性的收益。
- 增加随机数
为了提升游戏的趣味性,有部分游戏为伤害值增加了一个随机数。
DMG = ATK * (1 - DEF / (DEF + α)) * r [r为随机数]
r有两种计算方式,一种是直接取随机数如 r = Random(0.9,1.1)。最终伤害收益为原先收益的 90%~110%。另一种是利用筛子随机数DnD的方式,如 r = 3d6,3个点骰子投掷6次,求和得出。其取值为3-18之间,最终伤害的收益为原先收益的3-18倍。两种随机方式各有优劣。
引入复杂机制
上文只是给出了基础的公式,为了丰富游戏的玩法,不同游戏为攻击和防御增加了不同的玩法,如暴击、格挡等。
以王者荣耀举例,王者荣耀有物理伤害和法术伤害的机制,这里以其中一种伤害举例。
王者荣耀采用了乘法公式作为基础。其伤害公式为:
DMG = ATK * ( 1 - RD%)
因为有真伤机制,真伤无视防御直接对角色造成伤害,所以真伤TD无须参与免伤率的计算。
DMG = ATK * ( 1 - RD%)+ TD
王者荣耀基础的免伤公式为:
RD% = DEF / (602 + DEF)
王者荣耀有护甲穿透的机制。穿透类型有两种,一种是数值型的穿透AP,一种是百分比型的穿透AP%。公式为:
RD% = ((DEF - AP) * (1 - AP%)) / (602 + (DEF - AP) * (1- AP%))
王者荣耀还有复杂的攻击加成、暴击、格挡等机制,这里只作为简单阐述,感兴趣的可以查看官方论坛,这里不往下展开。
概率的计算方法
有些游戏在伤害公式里面存在多个概率型的参数,如命中率、暴击率、格挡率等。在游戏中,如果先计算命中率,再计算暴击率。如果攻击没名字,那么暴击率就没意义了。
为了应对这种情况,伤害计算公式里面概率型属性的计算方式一般有两种方式,瀑布型算法和圆桌型算法。
- 瀑布型算法
瀑布型算法就是把概率属性先按优先级依次排序,然后依据优先级从高到底依次判断概率是否生效。
假设设定命中率优先级比暴击率高,若命中率为80%,暴击率为10%。那么命中率先计算为80%,而暴击必须在命中基础上才能计算,其概率为80%*10%=8%。
瀑布型算法可以让所有的属性都可以参与计算,但是会导致优先级较低的属性收益低于其显示的值,而且优先级越低的属性值其实际作用越低。
在瀑布型算法中,优先级较低的属性可以设置得大一点以对冲其优先级带来的损失。
- 圆桌型算法
圆桌型算法就是把所有的属性像圆桌一样,平铺在一起根据各个属性大小占比进行计算。例如将命中率80%(即闪避为20%)、暴击率10%、破甲5%放在一起,通过计算命中哪个区域则哪个区域的规则生效。
圆桌型算法如果所有属性加在一起超过100%,则直接舍去优先级较小的属性,如果不足100%则剩下当成普攻。
圆桌型算法的优势是可以保持各个属性的效用跟面板展示的一致,不会因为优先级低而衰减。但是,也会因为优先级较低而导致部分属性无法参与计算。
伤害公式的扩张应用
在实际策划过程中,经常会出现一个公式无法满足所有场景的情况,参数调整调来调去按了葫芦又起瓢。这种情况下可以采用如下方式:
- 采用分段函数
一个单一的公式经常会随着角色成长导致数值在前期、后期收益失控的情况。这种情况可以采用分段函数来规避,为角色的前期、中期、后期分别设置不同的公式、参数。
当然,在实际操作过程中,经常是以公式计算作为基础,然后通过表格对部分数据进行微调。
- 采用不同的函数
对于一些复杂的函数会对不同的角色采用不同的伤害计算公式或者参数。例如在神仙道中,法师和战士分别采用乘法公式和加法公式计算伤害,在王者荣耀中为孙悟空单独设置了暴击伤害系数等。
伤害计算公式多种多样,但是在选择时主要遵循一些基本原则:
- 简单易理解:过于复杂的公式会增加用户的理解成本,从而加大用户流失的可能性。伤害计算公式作为RPG游戏的底层设计规则,除非必要,不然越简单越好。不要让玩家纠结游戏机制,而应该让玩家把更多时间花在探索游戏玩法,不断促进角色成长上。
- 良好的体验:数据策划要符合玩家的期望,让玩家在游戏中花费时间或金钱时得到对等的预期收益。伤害计算公式既要保障效率优先,让玩家觉得付出和收益相匹配,又要兼顾公平防止过高的收益带来游戏不平衡。
- 丰富的玩法:游戏战斗机制最后都会落到伤害计算公式上,如常见的暴击、破防、格挡等机制。在保障公式简洁的前提下,公式中包含更多的战斗元素,能提升游戏玩法的丰富度。
- 适合游戏类型:没有最好的伤害计算公式,只有最合适的伤害计算公式,不同游戏应该基于游戏类型和玩法进行选择,最终服务于游戏本身。
最后,还是要强调一下,没有最好的数据策划只有最合适的数据策划。在符合玩家预期的情况下,尽可能平衡各方面收益才是最重要的。