经典战斗公式详解
2015已有多款强IP新品获得成功,研发模式获得市场验证;
未来成功的IP产品一定是兼顾IP还原度和游戏可玩性的良心之作。
对于数值设计,这意味着更高的要求。
1.1. 什么是公式?
表示数量之间关系的等式叫公式,数值设计中的公式要表达的数量关系有:
l 属性和战斗力的关系——战斗力计算公式
l 命中值、闪避值以及最终的闪避事件发生概率的关系——闪避计算公式
l 玩家等级、计算伤害和最终伤害的关系——等级压制公式
l ...
等等,不一一赘述。
当我们希望高等级玩家对低等级玩家作战具备优势,或不鼓励玩家越级挑战时,就可以采用上面提到的等级压制公式。
可见,公式实质上是策划设计需求的实现——以代码的形式,或以配置的形式,对设计需求的实现。
1.1.1. 战斗公式
我们经常会对战斗伤害公式进行讨论。沿用前面的观点,那么战斗伤害公式,应该描述的是,攻击、防御等战斗属性和最终伤害的关系。
战斗伤害公式一般采用减法公式或是除法公式,还有其他类型的伤害公式,以后会专题讨论。
减法公式:
伤害 = 攻击方攻击力 - 受击方防御力
除法公式:
伤害 = 攻击方攻击力/(1+受击方防御力*系数K)
(上式有多种等价的写法,如:伤害=攻击方攻击力 * (1 - 受击方防御*系数k/(1+受击方防御*系数k)),不一一列出)
从理解成本上来说,减法公式很有优势,能很直观的预测和体会到能力变化的效果,因此他很适合做成长体验,在道具收费模式很适用。
除法公式则便于战斗力的量化,伤害公式稍加调整,生命值*攻击力*(1+防御力*系数K)可作为战斗力的计算公式,因此很容易做到平衡。另外由于攻击力总是按比例的折算为伤害,所以不容易出现不破防的情况。综上所述,除法公式在竞技类、弹幕类(容易出现小额伤害)更容易把控。
但是,减法公式和除法公式之间并无壁垒,不会存在某种情况下,减法或是除法公式的某一种完全无法胜任的时候。
1.2. 除法公式详解
1.2.1. War3
我知道的第一个除法公式,是在war3里:
防御力>0时,
①减少伤害的百分比 = 受击方防御*0.06/(1+受击方防御*0.06),在war3里k的取值为0.06
②伤害 = 攻击方攻击力*(1-伤害减少的百分比)
假设被攻击的单位有A的防御力:
这时敌人就只能对其造成 1 - [ A * 6% / (1 + A * 6%) ] 的伤害
即只能对其造成 1 / ( 1 + A * 6%) 的伤害
所以敌人要付出原本 1 + A * 6% 的伤害才能有原本的效果
换句话说,这个单位就有原本1 + 6% * A的生命值
即增加了A*6%的生命值
以上是除法公式的本质所在——防御总是可以换算为等效的生命值。
但是,它是怎么来的呢?事后的总结总是比当事决断来的容易,采用这种公式的设计师,当时是怎么思考的我们无从得知,只能尽可能还原这个场景,做点比事后诸葛更多的事情:
从需求出发的话,War3作为一个有着可成长的英雄的RTS(即时战略)游戏,需要考虑,英雄的护甲和高级兵种、建筑的护甲对低级兵种的攻击的防御效果。
我们用生存周期表示一个战斗单位在面临攻击时的生存能力,已知敌方单位对该其伤害是攻击力和防御力共同作用的一结果,表示为 dam(atk,arm),生命值为hp,那么生存周期,下面表示为
t = hp/dam(atk,arm) 式①
特别的,当防御为0时的生存周期t0 = hp/dam(atk,0)=hp/atk 式②
我们以t0的值作为生存周期的1个单位,则新的函数T = t/t0,表示的是在攻击和护甲变化时的生存周期相对于无护甲的生存周期的函数。
式①、②变为:
T=hp/(t0*dam(atk,arm)) = atk/dam(atk,arm) 式③
T0=1
从战略性的角度考虑,采用减法伤害公式,会造成低级兵种因攻击力低下,处于无法用数量弥补的劣势之中,造成战术的单一(憋科技),参考下图:
可以看到,护甲对于提升生存周期是指数级增长的
为使防御对于生存周期呈线性增长,并便于计算,那么上述图像,应该是这样的:
这个关系可以用一个式子表示:
生存周期函数T(arm)对arm的导数T’ = k,再带入T0=1,解这个方程,得到:
T = 1+k*arm
联立式③,解方程组得:
dam(atk,arm)=atk/(1+k*arm) 式④
K是斜率,即生存周期随护甲值变化速率,war3中k的取值如前述,k = 0.06
1.2.2. Wow
魔兽世界60级前的伤害减免公式:
伤害减免比例 = 护甲值/(护甲值 + 等级*85+400)
则,伤害 = 攻击力*(1-伤害减免) = 攻击力*(1 - 护甲值/(护甲值 + 等级*85+400))
化简得到,伤害 = 攻击力/(1+护甲值*(1/(400+85*等级)))
对比式④,可知,k = 1/(400+85*等级),可见,wow的伤害公式是要达成这样的一个效果——护甲增加的等效生命的比例是关于等级的一个单调递减的函数。
在dam = atk/(1+k*arm)的式子中,k*arm这部分的意义实际上是生存周期增加的比例。
v 1个极简模型
换句话说,在 wow中,若随等级投放的护甲值,满足条件护甲值/(400+85*等级)始终等于某个固定比例值,则角色在正常成长时,总能维持一个相对稳定的伤害减免比例;再保证各等级的生命/攻击力也是恒定值的话,战斗节奏就是稳定的——比如战士对法师,1级时若24秒结束战斗,在这个投放下,100级也一样是24秒。
为便于观察这一点,我们假设这样一个简单的成长曲线:
攻击力 = 400+85*等级
护甲值 = 400+85*等级
生命值 = 400*85*等级
若每次攻击的间隔假设为1秒,则T = 生命值/伤害 = 生命值/(攻击力/(1+防御力/(400+85*等级)))
= 1+防御力/(400+85*等级)=2
这个节奏太快了,我们多投放一些生命值,使得
生命值 = (400+85*等级)*12
这样战斗周期就是24秒了,考虑到这个数量级可能偏大,比如1级的血量有5820,可整体缩小比例,如缩小10倍:
60级血量约6600左右,是可以接受的。
v 初步的模型调整
把基础部分搞清楚了,我们可以考虑在这个基础上贯彻一些我们自己的设计理念。
之前我们设定了各等级段的稳定的24秒战斗周期,假设这个周期是合理的,接下来我们应该完成的工作就是考虑更多一些细节,比如近战攻击的战士和远程射击的弓箭手,弓箭手的攻击距离是多少,战士移动至弓箭手跟前花了几秒时间。这个过程中需要一边拍一边调,直至找到这些合理的设定值,使得在这个战斗周期内战士和弓箭手之间的战斗是合理的。
数值做的越久,就越会有一个感觉——算的越准,控制的越紧,游戏往往会变得不好玩。
在网络游戏刚萌生的那几年,网游一直有一个说法“新手玩战士,菜鸟玩弓箭手,高手玩法师”。这个说法的由头也很简单,战士血厚防高很安全;弓箭手有距离优势移动速度也快,很灵活;法师攻高血少操作很繁琐。后来这个说法很快的变了,那时候大多数游戏到了后期,战士都很生猛。
几年前看到过一些数值设计资料,发觉这不是完全偶然,有些游戏在设计职业时,就充分考虑过各职业的优势期,战士职业往往会被定义为“大器晚成”型。
其实通过调整各等级的战斗周期(实际上就是投放的生命值和攻击力的比例关系),依然以24秒的战斗周期作为参考,假设等级跨度是1到60级,若:1~40级内,战斗周期小于24秒,41~50之间战斗周期等于24秒,51~60级之间战斗周期大于24秒。那么,在1~40,41~50,51~60这样3个等级段内,远程的弓箭手/法师对近战的战士/盗贼等职业,分别是优势/平局/劣势的局面。
这个战斗周期的随等级的变化,可以用装备的品质来体现,因为装备的投放是很方便做调整的。比如绿字装备属性强调攻击,1~40级投放,蓝色装备攻守均衡,41~50级投放,紫字装备注重生存,51~60投放。就可以实现战士的“大器晚成”。
通过调整怪物的属性,比如怪物的攻击力,也可以实现某个设计需求——初期怪物攻击力低,法师可以单独群攻杀怪,后期怪物攻击力提升迅速,驱使法师寻求战士的配合拉怪,等等。一切数值设定,皆可能作为体验调整的着手点。下图非常适合用来说明某些时候,数值策划的工作状态——旁人看来似微不足道的调整,或许就是在拯救世界: