对于装备属性成长系数的调整本篇原作者:王鑫然
知乎原文:游戏战斗设计基础(十二)——数值框架搭建及战斗平衡计算实践
一、前言
这篇文章虽然把数值单拿出来讲,但在这里要强调的是,数值不是万能的,它是一个可以方便调整体验的工具,以及显示项目哪些地方需要调整的显示器。数值对游戏整体体验的调整,需要多方面的配合才能达到预期。而且先有需求,才会有数值。如果把数值排在需求之前,就是本末倒置,只会拉低项目的上限。
数值不是单独存在的东西,它必须有法可依。在《英雄联盟》多次调整后,初始金币设定为500,多兰之戒价格设定为400,多兰之剑设定为450。之所以初始金币设定为500,是为了让玩家在前期购买完出门装之后,初始金币可以被充分利用,减少出门装和出门道具选择困难,有些玩家出门不带药,期望省下药钱快点买下一件装备。为此还调整了血瓶的价格,以及一大堆装备道具数值调整。而多兰之戒之所以比多兰之剑少50金币,是因为并不是所有中路法师释放技能都是耗蓝的,多两个血瓶在前期对于中路不耗蓝的法师更有帮助。
数值的设定需要机制的配合。角色明明有30%的暴击率,可是脸黑情况下砍了100刀愣是一次没暴击。为解决此问题,一些游戏设置了特殊机制。比如战斗开始后先把1到10进行随机排布,作为第1刀到第10刀里判断哪一刀暴击的标准,然后选取数值≤3的进行暴击,但这样做要把10刀都砍完才会进行下一波排序。有的游戏又用了另一些方法——将第一刀暴击率设为11.89%,若是没有暴击则将下一刀的暴击率提高至原来的2倍,变为23.78%,直至暴击发生,如果暴击则下一刀暴击率重回11.89%,以此总体保持30%的暴击率。
并不是所有的数值设定都能见成效。比如《艾尔登法环》中死亡掉落全部金币,原本的设计初衷是一种战斗失败惩罚,结果因为战斗容错低,经常还没等玩家把上次死亡掉落的金币捡起来,就又死了一次,然后金币全消。于是老玩家就学会了刷金币技能。进副本前也会把金币耗光,进副本之后是地上道具捡一圈儿,遇到小怪是能躲就躲,直冲BOSS房间,让死亡掉落金币这种惩罚变得没什么作用。
数值设定可以应用在游戏研发中的各个方面。假设一个商业游戏预期一年导入100万流量,预期付费率5%;预期大R比例5%,付费比例80%;中R比例15%,付费比例15%;小R比例80%,付费比例5%;预期年流水1000万,则单个大R的付费金额=(1000万年流水×大R付费比例)÷(100万流量×付费率5%×大R比例5%)=3200,这就是单个大R用户,预期一年内要在游戏里的消费的数学期望值,相应的中R=200,小R=12.5。这些数字决定了游戏要设定的付费深度,以及各个充值活动的定价,比如很多游戏面相小R用户的10元首充(部分游戏是首充活动1元,点进充值界面后提示最低充值10元),面向中R的148,168,198。
虽然游戏行业有专门的数值策划,但这并不意味着其他策划可以不了解数值。数值也是设计的一部分,了解数值设计可以让策划对设计的思考更加精确,并且提高全盘思考和设计能力。游戏行业里经常能出一些缝合怪式的游戏,原因之一就是策划在设计时各做各的,每个模块单独看做的都挺好,只是合在一起之后,就变得十分割裂。
学习数值需要良好的逻辑思维能力,数学知识部分,对于精确性不高的游戏,初高中知识可以解决大部分问题,对于moba这种精确性要求极高的游戏,就需要具备大学数学的能力和思维,重点在思维。数学公式及公式特性什么的,用到什么查什么就可以。工具方面,Excel可以解决大部分问题,常用的Excel函数要记住,方便使用,其他函数,用到什么查什么。
对于想要做数值策划的同学,VBA尽量学会用,它能模拟战斗过程并输出过程数据,方便调节技能数值。而且平时玩游戏用按键精灵用的熟练的,VBA学起来也不难。数值策划本身是一个极其枯燥的工作。经常要根据实际需求的变化大规模调整数值,天天看表格容易长出复眼,看东西能看出好几个分身。
对于战斗策划,大型游戏战斗策划本身的工作量远大于数值策划,所以一般是不负责数值的,甚至战斗策划在做设计时,应该屏蔽自己的数学思维,从好玩的角度开始进行设计。但是战斗策划应该知道本项目的数值策划能做什么,假如战斗策划设计100个技能,数值策划只能处理其中20个技能的平衡,那么不算技术研发能力,这个项目最终就只能做出20个技能,如果项目开始没有数值策划,做一半插个数值策划进来,就会经常遇到这种情况。如果因为技术原因又去掉10个,那么最终只能做出10个技能。其实有大公司是战斗策划也负责做数值的,但按照1+1>3的原则:
全文大约有16000多字,涉及大量公式及运算,尤其是战斗平衡计算部分,要看懂本文,需要具备一定数学基础。
二、基础概念和机制
2.1、回合
指对战双方中的一方进行一次攻击结算的最小时间单位,可以是回合制游戏中的1回合,也可以是即时战斗中的1秒。
战斗总回合数是指双方互砍,同时死亡所需的总回合数,也可指一方把另一方打死所需的回合数。通常用来衡量职业是否平衡的标准,假设AB两个职业互掐,A把B打倒要20回合,B把A打倒只需要10回合,说明在对战过程中,B肯定能把A打赢,这种情况下,AB两职业就是不平衡的。
2.2、数学期望
用来描述一组波动数据的真实情况。期望值=“各个数据出现的概率×数据本身”再加和。
比如一个游戏一天有100人上线,其中10人全天上线时长20分钟,40人全天上线时长50分钟,40人全天上线时长80分钟,10人全天上线时长100分钟。则100人这组数据,一人一天在线时长的真实值为:
10%*20+40%*50+40%*80+10%*100=64分钟
如果预期的在线时长数据与64分钟相差不多,且在线时长分布图像集中,说明玩家的在线时长符合预期。如果64分钟与预期在线时长不符,或者在线时长图像离散,说明在线时长不符合预期,要调整游戏设定。
2.3、体验设定数据
指与游戏体验直接相关的数值设定,如一场战斗打多久,打死一只怪物要多少刀。体验设定数据在数值计算中是自变量,由这些自变量得出因变量,部分自变量会再根据因变量数值与预期的差距来调整。
思考哪些数据是体验设定数据是游戏数值计算开始前最重要的一环。以moba游戏的“一次线上时长”为例,就是英雄多久回一次城,英雄回城是进行装备更换和补给,所以它能影响装备的价格,装备价格又影响一次线上获得的金币数,这个金币数和一次线上时长又影响一次线上总共出多少波兵,每波兵总共能获得多少金币,以及打野在野区能打几只怪,每只怪得多少金币。一次线上时长与技能篮耗又能影响英雄蓝量上限、回蓝速度。
多数情况下,游戏中一个因变量需要多个自变量才能得出。并且当因变量不符合预期时,要经常回来修改自变量。这里涉及到一个原则——数值体验和数值平衡是根据游戏运营中的各种数据调出来的。你永远不可能算准,因为玩家会用各种你未能预料的方式,打破预期。
2.4、技能冷却时间
技能释放后,技能会进入冷却,在冷却时间结束前,技能不能释放。
即时对战中,冷却时间从什么时候开始计算,直接影响规定时间内技能释放的次数。以一个拿刀挥砍的技能为例,技能动作分为前摇、命中瞬间、后摇三部分,命中瞬间的时间=0。如果前摇时间为A,后摇时间为B,技能冷却时间为C,A+B≤C,战斗时间为D,D≥A+B,求技能释放次数:
- 若从技能前摇开始,冷却时间就开始计时,则技能释放次数≈D÷C
- 若从技能前摇结束后,冷却时间才开始计时,因为每次冷却时间结束后,要再进行一次前摇,才会开始计算冷却时间,所以技能释放次数≈D÷(A+C)
- 若从技能后摇结束后,冷却时间才开始计时,则技能释放次数≈D÷(A+B+C)
从以上三种情况可以看出,冷却时间从前摇开始的时候,就开始计时的话,规定时间内技能的攻击次数是最多的。
有的同学可能已经注意到了,为什么我在上边用了一个“≈”号,而不是“=”号。举个例子,若D=60秒,C=58秒,则在第59秒还能放一次技能,但如果A=2,B=2,即A+B=4,则技能在第59秒开始释放进行前摇,但前摇还没结束,战斗就已经停止。这就类似于《率土之滨》中,技能已经准备完成,但没释放成功的概念。
所以,对于冷却时间从技能前摇开始的情况,计算其释放次数的精确函数表达式应该:
if(D-C≤0,1,if(D-(A+B)-rounddown(D÷C,0)*C<0,rounddown(D÷C,0),roundup(D÷C,0))
其中,if、rounddown、roundup均是Excel中的函数。其他两种情况的精确表达式,各位同学自行思考。
技能冷却时间有很多变种形式,比如《炉石传说》中的“费”,费随回合恢复,卡牌消耗“费”使用,相当于多少回合释放一个技能。
2.5、最大值和最小值
最大值和最小值是数值平衡计算过程中,极其常用的概念,经常用于计算和调节不稳定数据。
以BUFF类技能为例,AB两个单位互殴,A是远程,B是近战,B可以开增伤BUFF,A边打边跑,B要追着A做输出,这意味着在B开增伤BUFF的时候,由于没有追到A,所以B并不是所有技能伤害都能享受到增伤BUFF,假设B增伤BUFF持续时间是25秒,战斗时长为30秒,B追上A全程总共花费时间为10秒,则技能享受增伤BUFF的最大时长是30-10=20秒,最小时长是25-10=15秒,最大时长意味着增伤BUFF持续时间中的一部分用来追人,最小时长意味着开了增伤BUFF后,才开始追人。
在战斗平衡计算过程中,如果用技能收益最大值去计算数值,就意味着实际战斗容错很低,如果用技能收益最小值去计算数值,就意味着实际战斗容错很高。
三、实战演练
数值搭建过程根据是否进行大规模调整进行划分,分为框架搭建和数值调整两个阶段,框架搭建阶段以手填数值为主,涉及数值微调,主要目标是搭框架;数值调整阶段是在框架搭建后,按照对各个因变量的预期,对自变量进行整体的大规模综合调整。
这里以即时战斗游戏为例,引用《英雄联盟》中的职业进行框架搭建阶段的演示,涉及部分数值调整思路。内容主要涉及职业属性,装备属性,战斗平衡。下文中所有表格中,表红色的文字都是可手动调整的自变量。
3.1、定义属性及公式
第一步定义游戏中有哪些属性。在这里设定有以下属性:
生命值,魔法值,物理攻击,魔法攻击,物理防御,魔法防御,命中值,闪避值,暴击值。
其中,攻击方命中值和防御方闪避值共同得出命中率。
第二步定义计算公式。计算公式的定义涉及游戏中有多少个属性系统,本游戏中,设定只有三个系统——角色系统、装备系统、技能系统,其他类型的系统,可以根据装备系统的数值设计思路,自行设计。设定公式如下:
总生命值=角色生命值+装备生命值+其他系统生命值
其他属性总值与总生命值的计算思路相同,这里就不罗列了
物理伤害=攻击方总物理攻击×系数1×(1-防御方物理减免)×技能系数百分比+系数2。防御以防御减免的方式呈现,意味着一定会破防,但也有缺点,攻击方总物理攻击越高,被减掉的伤害就越多。系数1和系数2是设定值,均可调整。
魔法伤害=攻击方总魔法攻击×系数3×(1-防御方魔法减免)×技能系数百分比+系数4。
物理减免=(总物理防御×系数5)÷(总物理防御+等级×系数6+系数7),这个公式首先是除法公式,分母加入等级,使得在装备不变等级提升时,防御减免下降,促使玩家更换高等级装备。系数用来调整图像走势,使走势符合预期。
魔法减免=(总魔法防御×系数8)÷(总魔法防御+等级×系数9+系数10)
命中率=总命中值/(总命中值+总闪避值×系数11)×100%,命中率最低值设定为10%,最高值设定为90%。
暴击率=(总暴击值×系数12)÷(总暴击值+等级×系数13+系数14)
暴击伤害=正常伤害×系数15
其中,暴击率、物理减免、魔法减免、命中率都是隐性数值,游戏中不会直接显示出来,要通过其他显性数值换算。其中,暴击率和命中率,应用纯随机,不做机制上的伪随机处理。
在实际游戏开发过程中,每一种属性的设定,以及每一个公式的设定,都要遵循严格的现实意义,比如你想让每一种属性对于角色实力的影响呈现“线性相关。
第三步定义攻击判断流程。技能CD从前摇开始时就开始计算。游戏中有三种攻击判定结果:
攻击未命中
攻击命中,但未暴击
攻击命中,并且暴击
这里使用逐步判断法,即先判断是否命中,再判断是否暴击。则真实暴击概率=命中率×暴击率。对于逐步判断法,判定的优先级越往后,其真实发生概率偏差的就越大。
另一种攻击判断方法是圆桌理论,网上讲的很多,也有优缺点,目前主流游戏多使用复合判断方法。
3.2、定义标准人物属性
将各个属性类型赋值,作为标准人物的1级裸奔属性。
随后设定各个属性每一级的成长率,等级上限设定为30级,每10级进行一次等级突破,设定下一个10级中,各个属性的成长率高于上一个10级。有下边这个表。
再根据1级各个属性的值,及各个属性的成长率,算出下一级的属性值,以生命值为例,公式为:
下一级生命属性值=上一级生命属性值×(1+生命属性值的成长率)
得到1到30级标准人属性,如下图所示:
这里要注意,虽然数值策划在这里使用的是百分比增长,但做系统的时候,如果要显示下一级属性和下一级增长了多少属性,要显示成固定值的形式。
3.3、定义标准人装备属性
设定装备有白、绿、蓝、紫、橙5个品质,靠游戏中怪物掉落,等级有1、10、20、30四个档次。依次将每一种属性单拿出来,按照依品质、等级属性递增的原则,赋予属性成长系数。
以蓝色品质3级装备的生命值为例,它的生命值属性=标准人3级生命值属性×蓝色装备1级的生命值属性成长系数(因为10级一档,所以3级的装备应用1级的属性增长系数)
对于装备属性的调整:
如果期望玩家先把30级白装收集完,再去收集绿色1级装备,那么绿色1级装备的属性就应该高于白色30级装备属性,若发现计算结果不符合这个预期,就去调整成长系数。
如果期望橙色装备总属性是同等级角色属性的30%,那么所有橙色装备属性成长系数,就都应该填30%。
具体设定的数值,根据各个系统的预期数值需求进行综合调整。
计算完后,将1、10、20、30级装备属性单拿出来,这就是标准人装备的总属性。
这里要注意10级、20级、30级装备的属性,要依据角色等级突破后的属性去计算。因为玩家穿着10级装备要去打11级的怪物,11级的怪物属性会按照角色10级等级突破后的属性标准去计算。
如果给装备再加一个强化设定,总共10星强化,就要设定每一星强化后,装备属性的增长系数,再与装备原属性相乘。
如果装备有洗炼设定,就先计算装备总属性,再把洗炼的属性单拿出来做掉落权重和洗炼花费计算,类似于抽奖。
3.4、定义标准装备类型和属性
装备种类设定为武器、头、肩、衣服、腰带、裤子、鞋子、护腕1、护腕2、戒指1、戒指2,共11种装备,将9种属性分配到装备上,保证每种属性下都有大致等量的装备。得到如下所示的表格。
再对每一种属性在不同装备上进行分配,保证每一种装备在属性分配上都占据一定优势,以此确保每一种装备的收集吸引力。
之后按照标准人的装备属性,和装备上属性的占比,计算不同装备的具体属性,比如绿色10级武器上的物理攻击属性值=标准人绿色10级装备的物理攻击属性×物理攻击属性在武器上的占比。以此算出不同种类装备的具体属性值。
3.5、职业设定及各职业属性
以标准人为基准,为游戏总共设定两个定位差距大的职业——炼金术士和暗夜猎手。
其中炼金术士血量最高,主要是魔法伤害;暗夜猎手输出最高,主要是物理伤害。根据各个职业特点,以标准人的属性为基准,设定炼金术士和暗夜猎手的属性系数。如下图所示:
ABCDE表示属性高低的程度,炼金术士防御高,所以生命值是A,暗夜猎手物理攻击最高,所以物理攻击是B。之后在对ABCDE进行手动赋值,最后转化成各个职业相对于标准人物的属性系数。属性系数也可以直接手填,比如炼金术士生命值系数可以直接手填个2,系数都要在综合计算数值后,根据因变量预期进行调整。
再用各个属性的属性系数×标准人相应属性的属性值,得到各个职业不同等级下的职业属性值。
3.6、各职业装备属性
根据标准人装备属性,及各职业的属性系数,算出各个职业的装备总属性。以炼金术士10级蓝色装备的生命值为例,其数值=标准人10级蓝色装备的生命值×炼金术士生命值属性系数,暗夜猎手和炼金术士的装备总属性如下图所示:
再根据不同装备部位的属性分配及属性占比,得出各个职业不同品质、不同部位、不同等级的装备属性
3.7、各个职业属性汇总
用各职业角色属性+各职业同等级装备总属性,得出各个职业不同等级下的总属性。因为装备有品质区分,所以要用不同品质的装备,分别与角色属性相加,得出各个职业在穿戴不同品质装备时的总属性。
之所以用X等级的角色属性+X等级的装备总属性,是因为游戏的预期设计是玩家以穿戴同等级装备为目标,为了让玩家以此目标进行游戏,怪物的属性设计,也要以这个标准去计算。
如10级怪物的属性,应该以角色等级为10+10级装备的属性去计算,角色等级属性取角色突破前的属性还是突破后的属性,取决于你是想让玩家先去打10级掉突破材料的怪物,还是先打10级掉装备的怪物。如果预期设定为先打10级掉突破材料的怪物,那么玩家打这个怪物时,角色属性处于未突破状态,身上穿的是1级装备,那么怪物属性的计算当取10级未突破角色属性,1级装备属性取那个品质,取决于你想让这个怪物有多强。
到了这一步,就应该进行一波参数和系数调整。方法是把各项属性的总数值,单拿出来,做折线图,查看折线图的变化趋势是否符合预期。以物理防御和魔法防御为例,将他们分别转化为物理减免和魔法减免,然后做折线图:
则折线图的走势应该满足以下几点:
装备品质和装备等级不变,随着角色等级的提高,减免值降低。因为我们在减免公式的分母中加入了等级,期望不换高等级高品质装备,防御能力就会降低。
角色等级不变,装备品质、装备等级越高,减免值越高,且差距可观。
穿上白色品质等级1的装备,所带来的物理减免或法术减免的增加,应该肉眼可见,不然穿上装备跟没有防御值一样。
如果折线图不符合上边两个预期,就去调整减免公式、角色防御属性成长系数、装备防御属性成长系数,甚至于为减免公式增加分段函数,由其是分段函数,大家以后如果要做数值,就会经常用到。分段函数的好处有两点:
能够方便调节各个成长阶段的属性成长走势
可以灵活运用各种公式走势的优缺点
以后如果要拓展属性上限,可以新增一个分段函数,保证整体数值稳定
3.8、职业玩法和职业技能设定
分别为炼金术士、暗夜猎手两个职业设定玩法,并依据玩法设计技能,这里直接引用《英雄联盟》炼金术士和暗夜猎手的技能设定,加以修改,如下图所示。
依据技能的特点,对各个技能的参数进行赋值,这些值都是自变量,在职业对抗的预演中,如果最终预演的数值不符合预期,就可以调整这些自变量。这些自变量也严格按照一定的数值标准,比如大招的CD一定是最长的,如果调整自变量数值后,发现大招CD不是最长的,那就是调整错了。
移动速度设定为两个职业相同,均为1格/秒。上图中,暗夜猎手的射程和位移的单位均为秒,意味着走完这么长的射程距离,要花费多长时间,1.5秒意味着以1格/秒的移动速度走,要1.5秒走完,实际射程转化为格子数则是1.5格
技能等级设定为4个等级,角色每10级提升一次技能等级,这就意味着角色等级在1、10、20、30级时,技能等级分别为1、2、3、4级。
按照技能等级,手动为各个等级下的技能设定数值,这里的属性值大小会根据职业对抗结果进行最终调整。数值如下
在实际游戏设计过程中,技能数值是经常会调整的东西,上线后,也会经常涉及技能数值全面调整,技能机制也会因为实际需求进行调整,比如《英雄联盟》中的机器人,加速跑技能后会有一个短时间内降低移速的debuff,给技能加这个机制是因为技能原数值太小,不好做技能等级提升,为了增大技能数值,相应的在技能机制上给机器人加了个削弱。
四、职业对抗及数值平衡计算
有了各职业总属性和技能数值,就可以做职业对抗模拟了,模拟的目的是为了调整数值。模拟时选取各职业等级10级、20级、30级,进行两两对战。装备品质取蓝色。
之所以选定从10级开始,是因为MMORPG游戏,玩家进入游戏后一定等级之前,是不会PK的,装备也没穿全,对这个时候的各职业进行职业对抗模拟没有意义。到了一定等级之后才会去PK。
总共选取职业等级10级、20级、30级,三个等级位进行战斗模拟,是因为数值无法保证100%的平衡,但要保证阶段性的平衡,10、20、30是游戏设定的最基本的三个阶段。
装备品质取蓝色纯属预期设定,实际游戏对抗模拟中,会取中、高两档装备进行对抗模拟,尤其是对于卖高级装备的游戏,要保证大R玩家穿着高品质高等级装备PK时,实力是相等的。
虽然此处取了蓝色品质装备做平衡计算,但计算结果应该保证白、绿、紫、橙四种品质装备下的各职业依然能够保持平衡
对抗时,先用炼金术士VS炼金术士,再用暗夜猎手VS暗夜猎手,这样会得出两个战斗回合数,因为炼金术士防御最强,暗夜猎手伤害最高,所以得出的战斗回合数,是整个游戏中,两两对抗战斗回合数的最大值和最小值,相应的,暗夜猎手VS炼金术士的战斗回合数,应该处在这个最大值和最小值之间。
4.1、炼金术士VS炼金术士
分析炼金术士对打的特点:
炼金术士打架时,是开着【毒气】毒对方
炼金术士VS炼金术士,攻击距离相同,不存在追击问题,所以移动速度、位移等可以抛开不管
由于炼金术士的【疯狂药剂】开启后会给自己加魔法攻击、双防、移动速度,所以要计算不同技能在开了【疯狂药剂】和没开【疯狂药剂】时候的释放次数和伤害值
【毒气】由于不受命中和暴击影响,一定会命中,且不会暴击,所以计算【毒气】的伤害期望值时,计算值=真实值
由于【疯狂药剂】有生命恢复效果,每秒恢复一定最大生命值百分比,所以【疯狂药剂】应在受到伤害后开启,使生命恢复效果不浪费
【强力黏胶】和【过肩摔】配合造成的眩晕效果,会影响普攻的释放次数,对长CD技能释放次数的影响可以不计。
【过肩摔】动作会把对方举起来摔到身后,就意味着【过肩摔】技能动作开始时,对方处于类似于眩晕的状态,眩晕时间=技能动作时间
【疯狂药剂】的持续时间要分情况讨论,如果最后一次释放的【疯狂药剂】时间内,战斗已经结束,说明技能的持续时间,有一部分不能计算入战斗中
计算普攻释放次数时,要减去其他技能释放花费的动作时间
战斗双方倒下的标准是,战斗时间内(战斗回合数)内,“生命值/伤害值”的数值,刚好小于1,意味着刚好双方在最后一秒输出结束后,双双躺地
调用和计算炼金术士在开启【疯狂药剂】前后的数据,如下
计算战斗中各个技能数据的思路如下:
设定第一次开启【疯狂药剂】的时间为战斗后1秒
战斗时间手动设置,根据“生命值/伤害值”的数值大小最终确认
疯狂药剂
【疯狂药剂】开启次数=(战斗时间-第一次开疯狂药剂时间)÷技能CD时间
【疯狂药剂】持续时间=if(战斗时间-第一次开启时间-(疯狂药剂开启次数-1)*技能CD时间<技能持续时间,战斗时间-第一次开启时间-(疯狂药剂开启次数-1)*技能CD时间+(疯狂药剂开启次数-1)*技能持续时间,疯狂药剂开启次数*技能持续时间)
毒气
【毒气】开启次数为1次,即战斗开始后,开启就一直没关闭
【毒气】在没有【疯狂药剂】时造成的伤害=没开【疯狂药剂】前【毒气】造成的魔法伤害*(战斗时间-药剂持续时间-毒气释放次数*毒气动作时间),魔法攻击取疯狂药剂释放前的魔法攻击,毒气释放一次就会一直开下去
【毒气】在有【疯狂药剂】时造成的伤害=开【疯狂药剂】后【毒气】造成的魔法伤害*药剂持续时间
强力黏胶
【强力黏胶】的释放次数=战斗时间÷技能CD时间
【强力黏胶】对应的伤害,是普攻在眩晕时间内造成的伤害,给【强力黏胶】设定一个修正系数,表示【过肩摔】不一定100%把对方扔到【强力黏胶】上,同时这个修正系数也是对普攻的修正,所以最终,【强力黏胶】的伤害=开【疯狂药剂】前的普攻物理伤害*rounddown(【强力黏胶】放次数*(战斗时间-药剂持续时间)/战斗时间,0)*【强力黏胶】单次眩晕时长*普攻修正值+开【疯狂药剂】后的普攻物理伤害*rounddown(【强力黏胶】释放次数*药剂持续时间/战斗时间,0)*【强力黏胶】单次眩晕时长*普攻修正值
过肩摔
没开【疯狂药剂】时的【过肩摔】次数=战斗时间内【过肩摔】释放的总次数*没有药剂的时间占总战斗时间的比值=(总战斗时间/【过肩摔】技能CD时间)*(战斗时间-药剂持续时间)/战斗时间,结果向上取整
开【疯狂药剂】时的【过肩摔】次数=战斗时间内【过肩摔】释放总次数-没有药剂时释放的【过肩摔】次数=(总战斗时间/【过肩摔】技能CD时间)-没有药剂时释放的【过肩摔】次数,结果向上取整
伤害值分别通过魔法伤害公式计算
普攻次数
没开【疯狂药剂】时普攻次数=(战斗时间-药剂持续时间-【毒气】释放次数*【毒气】动作时间-【强力黏胶】释放次数*rounddown【(战斗时间-药剂持续时间)/战斗时间】*【过肩摔】动作时间-【过肩摔】非狂释放次数*【过肩摔】动作时间-【疯狂药剂】释放次数*动作时间-【强力黏胶】在没有药剂BUFF时间内的眩晕时间)÷普攻动作时间,结果向下取整
开【疯狂药剂】时普攻次数=(药剂持续时间-【强力黏胶】释放次数*rounddown(药剂持续时间/战斗时间,0)*【过肩摔】动作时间-【过肩摔】狂释放次数*【过肩摔】动作时间)/普攻动作时间
伤害值分别通过物理伤害公式计算
总生命值
总生命值=总生命值*(1+【疯狂药剂】释放次数*【疯狂药剂】技能恢复生命比例)
伤害期望值
- 除【毒气】外,其他伤害应该把命中率和暴击率算进去,得出伤害期望值
最终得出计算数据如下:
从以上数据可以看出,【毒气】伤害占总伤害比重的60%以上,战斗时间随着炼金术士等级提升,越来越低,但变化不大,符合对炼金术士的玩法设定。但要注意,这里所引用的数据,最终要根据炼金术士VS暗夜猎手的对战数据,得出的最终结果进行调整。
4.2、暗夜猎手VS暗夜猎手
分析暗夜猎手对打的特点:
暗夜猎手打架时,是靠普攻互相伤害
暗夜猎手VS暗夜猎手,攻击距离相同,不存在追击问题,所以移动速度、位移等可以抛开不管
【杀戮时刻】会增加物理攻击,并降低【翻滚一箭】的CD时间,所以计算时要对每一个造成物理伤害的技能,按照是否开启【杀戮时刻】计算伤害
【击退巨箭】造成的眩晕对普攻次数有影响,对其他长CD技能的释放次数影响可以不计
【击退巨箭】并不一定能把对方射到障碍物上造成眩晕,所以要加一个修正
【击退巨箭】将目标射到障碍物上造成的伤害,跟没射到建筑物上造成的伤害不同,要分开计算
为了将【杀戮时刻】持续时间利用最大化,暗夜猎手对打肯定是上来就开技能
计算普攻释放次数时,要减去其他技能释放花费的动作时间
调用和计算暗夜猎手在开启【杀戮时刻】前后的数据,如下
计算战斗中各个技能数据的思路如下:
战斗时间手动设置,根据“生命值/伤害值”的数值大小最终确认
杀戮时刻
【杀戮时刻】释放次数=战斗时间/杀戮时刻CD时间
【杀戮时刻】持续时间=if(战斗时间-【杀戮时刻】释放次数*【杀戮时刻】技能动作时间-(【杀戮时刻】释放次数-1)*【杀戮时刻】技能CD时间<【杀戮时刻】技能持续时间,(【杀戮时刻】释放次数-1)*【杀戮时刻】技能持续时间)+战斗时间-【杀戮时刻】释放次数*【杀戮时刻】技能动作时间-(【杀戮时刻】释放次数-1)*【杀戮时刻】技能CD时间,【杀戮时刻】技能持续时间*【杀戮时刻】技能释放次数)
击退巨箭
没开【杀戮时刻】时【击退巨箭】释放次数=【击退巨箭】在战斗时间内释放的总次数*没有【杀戮时刻】的时间占总战斗时间的比值=(战斗时间/【击退巨箭】CD时间)*(战斗时间-【杀戮时刻】可持续时间)/战斗时间,结果向上取整
没开【杀戮时刻】时【击退巨箭】的伤害=没射墙造成的伤害+射墙造成的伤害=没开【杀戮时刻】时【击退巨箭】的释放次数*【击退巨箭】眩晕时间修正*没开【杀戮时刻】时【击退巨箭】造成的物理伤害+没开【杀戮时刻】时【击退巨箭】的释放次数*(1-【击退巨箭】眩晕时间修正)*没开【杀戮时刻】时【击退巨箭】造成的射墙物理伤害
开【杀戮时刻】时【击退巨箭】释放次数=战斗时间内【击退巨箭】释放总次数-没有【杀戮时刻】时【击退巨箭】的释放次数=战斗时间/【击退巨箭】CD时间-没有【杀戮时刻】时【击退巨箭】的释放次数
开【杀戮时刻】时【击退巨箭】的伤害=没射墙造成的伤害+射墙造成的伤害=开【杀戮时刻】时【击退巨箭】的释放次数*【击退巨箭】眩晕时间修正*开【杀戮时刻】时【击退巨箭】造成的物理伤害+开【杀戮时刻】时【击退巨箭】的释放次数*(1-【击退巨箭】眩晕时间修正)*开【杀戮时刻】时【击退巨箭】造成的射墙物理伤害
翻滚一箭
没开【杀戮时刻】时【翻滚一箭】释放次数=【翻滚一箭】在战斗时间内释放的总次数*没有【杀戮时刻】的时间占总战斗时间的比值=(战斗时间/【翻滚一箭】技能CD时间)*(战斗时间-【杀戮时刻】可持续时间)/战斗时间,结果向上取整
开【杀戮时刻】时【翻滚一箭】释放次数=【杀戮时刻】可持续时间/(【翻滚一箭】技能CD时间*(1-【杀戮时刻】减少【翻滚一箭】CD的百分比)),结果向上取整
伤害按照物理伤害计算公式分别计算
这里要注意【翻滚一箭】的CD时间,在实际设计过程中,战斗策划会遇到这样一个问题——如果玩家开了【翻滚一箭】后,再开【杀戮时刻】,【杀戮时刻】的剩余CD应该是多少,各位同学自己思考其中细节。
普攻
没开【杀戮时刻】时普攻释放次数=(战斗时间-【杀戮时刻】持续时间-没开【杀戮时刻】时【击退巨箭】眩晕时间-【杀戮时刻】释放次数*动作时间-没开【杀戮时刻】时【击退巨箭】的释放次数*【击退巨箭】的动作时间-没开【杀戮时刻】时【翻滚一箭】的释放次数*【翻滚一箭】的动作时间)/普攻动作时间,结果向下取整
开【杀戮时刻】时普攻释放次数=(【杀戮时刻】持续时间-【杀戮时刻】持续时间内修正后眩晕-【杀戮时刻】持续时间内【击退巨箭】释放次数*动作时间-【杀戮时刻】持续时间内【翻滚一箭】释放次数*动作时间)/普攻动作时间,结果向下取整
伤害按照物理伤害计算公式分别计算
暗夜猎手
释放次数=普攻释放次数÷3,结果向下取整,“÷3”是因为每3次普攻触发一次暗夜猎手
伤害期望值
各个技能和普攻伤害应该把命中率和暴击率算进去,得出伤害期望值
在计算总伤害期望值时,应该把暗夜猎手造成的伤害,换算成真实伤害,并计入到总伤害期望值中
最终得出计算数据如下:
从以上数据可以看出,普攻+暗夜猎手的伤害之和,占总伤害的60%左右,符合玩法设定。20级对战时,生命/总伤害期望值=0.92,有0.08的差距,说明战斗在10秒多时就已经结束。
4.3、炼金术士VS暗夜猎手
分析对打的特点:
暗夜猎手是远程,有位移技能,炼金术士是近战,所以战斗开始后,炼金术士要追赶暗夜猎手,用于追赶的时间,在计算炼金术士的【毒气】技能伤害时,要从战斗时间中减去
技能输出要分为炼金术士进攻暗夜猎手,和暗夜猎手进攻炼金术士两部分计算,而且要先计算暗夜猎手,因为他是远程,能在开始战斗后就造成伤害
炼金术士会开【疯狂药剂】给自己加属性,所以炼金术士的伤害和防御能力要按照【疯狂药剂】开启前后分别计算
【疯狂药剂】不会给炼金术士普攻提供伤害加成,且暗夜猎手没有给自己加物防的技能,所以炼金术士的普攻不用分开计算
暗夜猎手会开【杀戮时刻】给自己加属性,所以暗夜猎手的伤害能力要按【杀戮时刻】开启前后分别计算
为了保证BUFF技能的最大化效用,炼金术士会在战斗开始受到伤害后,立即开启【疯狂药剂】,暗夜猎手会在战斗开始后立即开启【杀戮时刻】
暗夜猎手对炼金术士释放【击退巨箭】的眩晕,再修正后要算进炼金术士追上暗夜猎手的时间里去,炼金术士对暗夜猎手释放【过肩摔】和【强力黏胶】造成的眩晕,要从暗夜猎手输出时间中减去
炼金术士和暗夜猎手对战平衡的标准是:前一秒双方“生命/总伤害”的比值都>1,下一秒都<1
最后有一个追击问题,暗夜猎手的最优输出方式应该是边走边打,还是站撸
先看追击问题:
应用题1:
有AB两个单位,A的移动速度=A格/秒,B的移动速度=B格/秒,且B<A,
AB之间相隔M,同时向左行驶
问题1:多久A才能追上B
问题2:若B不动,A多久能追上B
问题3:以上两种情况下,比较B普攻次数的大小
对于问题1:
假设:X秒后A追上B
则有:A*X=B*X+M →(A-B)*X=M → X=M/(A-B)
当B的攻速小于1时,B=1-B的攻速,意味着每1秒,B用一部分时间普攻,一部分时间位移,此时B的普攻次数=X
对于问题2:
X=M/A
当B的攻速小于1时,B=1-B的攻速,进而B的攻速=1-B,则B在被A追上时,B的普攻次数=总时间/B的攻速=M/A*(1-B)
对于问题3:
假设:假设M/A*(1-B)>M/(A-B)
则有:A*(1-B)<A-B → A*(1-B)-A<-B → A-A*(1-B)>B → A*B>B → A>1
所以:当A开加速,使速度>1时,B站撸普攻次数最多,当A的速度=1时,B站撸和边走边打的普攻次数相同,当A的速度<1时,B边走边打,普攻次数最多
对于炼金术士,由于移动速度为1格/秒,移动速度提高后,炼金术士的移动速度>1格/秒,所以,暗夜猎手站撸普攻次数最多。
追击问题,同时可以说明,如果你想让一个ADC被近战追时边走边打,这个ADC就必须具备让对手直接减速,或变向减速的能力(比如打架5秒,眩晕对手2秒),或者它的辅助有直接或变向减速的能力。
调用和计算暗夜猎手和炼金术士战斗中属性如下:
分别计算炼金术士和暗夜猎手的技能数据:
通用数据:
设定炼金术士战斗开始后1秒开启【疯狂药剂】,【毒气】释放1次后就会一直开启
设定暗夜猎手战斗开始后立即释放【杀戮时刻】
暗夜猎手-杀戮时刻
【杀戮时刻】释放次数=战斗时间/【杀戮时刻】CD时间,向上取整
【杀戮时刻】持续时间=if(战斗时间-【杀戮时刻】释放次数*【杀戮时刻】技能动作时间-(【杀戮时刻】释放次数-1)*【杀戮时刻】技能CD时间<【杀戮时刻】技能持续时间,(【杀戮时刻】释放次数-1)*【杀戮时刻】技能持续时间)+战斗时间-【杀戮时刻】释放次数*【杀戮时刻】技能动作时间-(【杀戮时刻】释放次数-1)*【杀戮时刻】技能CD时间,【杀戮时刻】技能持续时间*【杀戮时刻】技能释放次数)
暗夜猎手-击退巨箭
没开【杀戮时刻】时【击退巨箭】释放次数=【击退巨箭】在战斗时间内总共释放的次数*没有【杀戮时刻】的时间占战斗时间的比值=(战斗时间/【击退巨箭】CD时间)*(战斗时间-【杀戮时刻】持续时间)/战斗时间,向上取整
没开【杀戮时刻】时【击退巨箭】伤害=没开【杀戮时刻】时【击退巨箭】没射墙造成的伤害+射墙造成的伤害=没开【杀戮时刻】时【击退巨箭】的释放次数*【击退巨箭】眩晕时间修正*没开【杀戮时刻】时【击退巨箭】造成的物理伤害+没开【杀戮时刻】时【击退巨箭】的释放次数*(1-【击退巨箭】眩晕时间修正)*没开【杀戮时刻】时【击退巨箭】造成的射墙物理伤害
开【杀戮时刻】时【翻滚一箭】释放次数=【击退巨箭】在战斗时间内总共释放的次数-没有【杀戮时刻】时【击退巨箭】的释放次数=(战斗时间/【击退巨箭】CD时间)-没有【杀戮时刻】时【击退巨箭】的释放次数
开【杀戮时刻】时【击退巨箭】伤害的计算方式同没开【杀戮时刻】时【击退巨箭】伤害的计算方式,炼金术士防御能力取开【疯狂药剂】后的属性
暗夜猎手-翻滚一箭
没开【杀戮时刻】时【翻滚一箭】释放次数=【翻滚一箭】在战斗时间内释放的总次数*没有【杀戮时刻】的时间占总战斗时间的比值=(战斗时间/【翻滚一箭】技能CD时间)*(战斗时间-【杀戮时刻】持续时间)/战斗时间,向上取整
计算没开【杀戮时刻】时【翻滚一箭】的伤害,取炼金术士开【疯狂药剂】后的防御能力
开【杀戮时刻】时【翻滚一箭】释放次数=【杀戮时刻】持续时间/(【翻滚一箭】技能CD时间*(1-【杀戮时刻】减少【翻滚一箭】CD的百分比)),向上取整
计算开【杀戮时刻】时【翻滚一箭】的伤害,取炼金术士开【疯狂药剂】后的防御能力
暗夜猎手-普攻
没开【杀戮时刻】时普攻释放次数=(战斗时间-【杀戮时刻】持续时间-被【强力黏胶】眩晕的时间-其他技能时间)/普攻动作时间,向下取整
开【杀戮时刻】时普攻释放次数=【杀戮时刻】持续时间/普攻动作时间
按照【杀戮时刻】开启前后的物理攻击分别计算普攻伤害
暗夜猎手-暗夜猎手
【暗夜猎手】释放次数=普攻总次数/3
【暗夜猎手】造成的伤害=【暗夜猎手】释放次数*【暗夜猎手】造成的生命百分比伤害*炼金术士生命值
炼金术士-疯狂药剂
【疯狂药剂】释放次数=战斗时间/【疯狂药剂】CD时间,向上取整
【疯狂药剂】持续时间==if(战斗时间-【疯狂药剂】第一次开启时间-(【疯狂药剂】开启次数-1)*技能CD时间<【疯狂药剂】技能持续时间,战斗时间-【疯狂药剂】第一次开启时间-(【疯狂药剂】开启次数-1)*【疯狂药剂】技能CD时间+(【疯狂药剂】开启次数-1)*【疯狂药剂】技能持续时间,【疯狂药剂】开启次数*【疯狂药剂】技能持续时间)
炼金术士-追击距离
追击距离=暗夜猎手普攻距离+【击退巨箭】释放次数*【击退巨箭】距离+【翻滚一箭】释放次数*【翻滚一箭】距离
炼金术士-追上之前花费时间
追上之前花费时间≈追击距离*没有【疯狂药剂】的时间占比/移动速度+追击距离*有【疯狂药剂】的时间占比/移动速度*(1+【疯狂药剂】对移动速度的加成比例)+【击退巨箭】的眩晕时间=追击距离*(战斗时间-【疯狂药剂】持续)/(战斗时间*移动速度)+追击距离*【疯狂药剂】持续/(战斗时间*移动速度(1+【疯狂药剂】对移动速度的加成比例+【剧毒加速】移动速度加成比例))+【击退巨箭】的眩晕时间
炼金术士-药剂最大有伤害时间
药剂最大有伤害时间=if(战斗时间-追上之前花费时间<药剂持续,战斗时间-追上之前花费时间,药剂持续)
炼金术士-毒气
【毒气】开启一次后就会一直开启,按照药剂最大有伤害时间计算【毒气】造成的魔法伤害
炼金术士-强力黏胶
【强力黏胶】释放次数=战斗时间/【强力黏胶】技能CD时间,向上取整
炼金术士-过肩摔
没开【疯狂药剂】时【过肩摔】释放次数=(战斗时间-【疯狂药剂】持续时间)/【过肩摔】技能CD,结果向上取整
开【疯狂药剂】时【过肩摔】释放次数=【疯狂药剂】持续时间/【过肩摔】技能CD
按照开启【疯狂药剂】前后的魔法攻击分别计算【过肩摔】的魔法伤害
炼金术士-普攻
普攻释放次数=(战斗时间-追上之前花费时间)/普攻技能CD时间
炼金术士-总生命值
炼金术士的总生命值计算时要算上【疯狂药剂】在战斗时间内恢复的生命值
最终计算各种数据如下:
在上文中说过,最终战斗平衡要保证炼金术士和暗夜猎手对打时,穿任何品质装备都能平衡,这里的平衡允许有一定百分比的误差。暗夜猎手和炼金术士穿橙色装备的对打数据如下:
从上图可以看出,20级暗夜猎手和炼金术士穿橙色装备的对打数据,在平衡上有极小的误差,这种小误差不需要修改,因为实际战斗过程中的操作误差就能让这个小误差变得跟没有一样。这个误差表示暗夜猎手在这个阶段比炼金术士强一点点,如果要修正这个误差,就去调整暗夜猎手20级橙色装备的属性,使其有效生命值降低。
暗夜猎手和炼金术士穿紫色装备的对打数据如下:
暗夜猎手和炼金术士穿绿色装备的对打数据如下:
从以上数据可以看出,30级暗夜猎手和炼金术士穿绿色装备的对打数据,在战斗进行到20秒时,暗夜猎手的“生命/总伤害期望值”=0.862,炼金术士的“生命/总伤害期望值”=0.994,看起来误差很大,需要修改,但是在观察战斗进行到第19秒时的数据,如下所示,双方“生命/总伤害期望值”均>1,说明这时候双方都存活,只是下一秒伤害过量的程度不同,所以不需要修改。
暗夜猎手和炼金术士穿白色装备的对打数据如下:
从以上数据可以看出,30级暗夜猎手和炼金术士穿白色装备的对打数据,在战斗进行到第13秒时,暗夜猎手的“生命/总伤害期望值”=0.992,说明此时暗夜猎手已经死亡,而炼金术士的“生命/总伤害期望值”=1.188,表示他在第13秒时依然存活,再看第12秒的对战数据,在第12秒时双方都存活。这就说明30级炼金术士穿白色装备时,战斗能力强于暗夜猎手,这个时候就要调整炼金术士30级白色装备属性,使其装备的有效生命值降低。
最后根据伤害占比去计算各个技能的蓝耗。
这篇文章就写到这里。
暂无关于此日志的评论。