基本战斗公式

伤害值 = 攻击力 * (1 - (敌方防御力 / (敌方防御力 + 1666.67)))

为了这个公式方便表达,我们将伤害缩写为dmg,己方攻击力缩写为atk,敌方防御力缩写为def。

dmg = atk * (1 - (def / (def + 1666.67)))

然后我们尝试用公式描述一场简单1V1战斗。如果把两个单位的战斗简化成回合战斗(即使战斗中的战斗时间也可以看作回合战斗回合数,比如把1s时间当作一个理想回合)。那么战斗的胜负,其实满足这一样一个条件,我们把战斗双方设为A,B。

A生存回合数 = A生命值 / B平均每回合输出
B生存回合数 = B生命值 / A平均每回合输出

那么其实A获胜条件就是:A生存回合数>B生存回合数,B获胜条件反之。

那么A获胜条件就可以写成:

A生命值 / B平均每回合输出 > B生命值 / A平均每回合输出

该不等式进行变形可以得到:

A生命值 * A平均每回合输出 > B生命值 * B平均每回合输出

化简到这一步骤,我们就得到不等式两边都满足:均来自一个单位的属性。我们称:

计算战力 = 生命值 * 平均每回合输出

但是,目前这还不是我们公式的最终版本,游戏中实际有防御力的免伤制约。接下来再来考虑一个场景,我们想一想,假设角色防御力为我们提供了50%的伤害减免,那么打在一个单位身上的原本100伤害,会被降低至50。那么我们在游戏中看到的飘血,就是50。那么100就是我们伤害减免之前的数值,我们称之为本次攻击造成的有效生命值(EHP)消耗。根据我们刚刚的定义:

EHP = 生命值 / 1 - 伤害减免率

伴随EHP概念,我们继续提出EDPS的概念,EDPS(每秒有效输出),EDPS就是未造成伤害减免之前的伤害计算值。这样我们就对上面计算战力的公式,加入了防御因素,计算进入了伤害减免,最终得到公式:

计算战力 = EHP * EDPS

现在,我们得到了游戏中的基础攻防公式和战力计算公式。那么就可以接下来的步骤了。

那么,首先基础战斗公式为什么是一个这样的公式?因为在这样一个公式下,每一点防御力等价的有效生命值是相同的。接下来我将从正面推导和逆向应用两个角度,展开描述如此设计公式的原因。并在最后总结这个公式的好处。(但其实没什么必要,因为该公式实在是在业内被大面积应用的公式,例如王者荣耀,英雄联盟,魔兽世界,原神,崩铁……数不胜数的游戏都应用的该公式。基本上大多数卡牌游戏就直接拿来用了)

先进行逆向应用。根据上面的式子,进行结合,可以得到EHP关于生命值和防御力的关系。

EHP = HP / (1 - def / (def + 1666.67)) = HP * (1 + def / 1666.67)

正向推导,首先,我们的目的是,希望每一个单位的防御力带来的有效生命值(EHP)效果是相同的。那么解决连续变化的变量关系问题,可以应用微分方程来解决问题。因为有效生命值是一个有关生命值的函数。所以可以列出以下的公式。只需要解决该微分方程,就可以得到我们的“乘法公式”

d(EHP)/d(def) = a * HP

上式子意味着每单位防御力变化,EHP增加a×HP,a为常数。根据目的,建立了微分方程,解微分方程可得。

EPH = a * HP * def + C * HP

a和C均为自定义常数。我们只需要根据设计需求和属性投放的值域,确定好常数C为1,常数a为1/1666.67即可。

选择该战斗公式的目的,其实是为了方便属性的投放,利用乘法公式的场合,由于防御力在减伤层面的收益边际递减,所以,策划在做属性投放的时候,防御力这条线存在天然的保险,不会出现不破防的情况;另外就是这样的公式在战斗计算的时候,防御和攻击两个模块是分开的,因此也是最容易调节关卡难度的,只需要关注血量*防御,之后再根据关卡对机制提出的要求,设定怪物的特性(例如装甲类型,特殊效果等等)。

BA的防御力带来的减伤曲线

EHP变化    

EHP的防御部分

不过,我前面说过,ba的数值结构很简单,ba其实在防御力属性的投放相关相当简洁,我们其实可以注意到,ba当中的角色,防御力要么很高,要么就是几乎没有,很少有位于中间态的,防御力属性和角色定位具有严格的相关关系。这是在不考虑装备和技能情况下各个枪械模板下的防御力水平。

BA的防御力属性投放
 
基本上,游戏中防御力分为三档,最高一档主要集中于SG枪,学生满级大概具有800-900的防御力,能有35%左右的伤害减免,而SG枪也是有包人主力军,在包的加成下,这些学生们会拥有2200-2400左右的防御力,再算上后排给予的加成和一些技能提供的影响,能减免55%-65%的伤害,这些也是俗称的防T。

第二档主要集中在MG枪械,MG通常具有400左右的防御力水平。且无包,算上后排的加持,一般来说也就是15%-20%的伤害减免。

输出角色几乎防御力都在100左右浮动,仅减伤5%-10%,几乎可以视作没有。

之所以这样设计的目的,就是让游戏更加简单,让所有学生都更加“对策”。因为BA的养成都是固定养成,没有类似阴阳师的御魂,原神的圣遗物等随机养成机制。从属性投放处就做好大类的区分,方便限制单个角色的出场环境,让角色具有不可替代性,从而促成新卡售卖。

 比如,游戏中常有一些辅助学生的专武2级提供的是生命值属性,这些许生命往往决定了这个角色能否从某些“关键攻击”中存活,例如鸡斯拉的转场,寿司人的宝剑等等。如果有一条可控的养成线让这些学生可以获得防御力,那生存将变得压力骤减,玩家自然没必要再花钱母角色。

上面说到的另一方面,就是让角色的适用面变窄,角色适用面变窄,新卡就能和老卡做出区分,对于不同BOSS玩家在挑战高难场景的时候,很难用同一个角色解决问题,自然是引导付费的手段。举一个不太恰当的例子,比如艾米和狗盾,定位比较相似,但艾米是一个轻甲,狗盾是一个特甲,这就让二者做出了适用场合的区分。

所有数值设计要为商业化需求服务,比如BA很明显走的是单卡坑度很低,也就是纵向养成很低,但是对BOX的要求极高,也就是对横向养成需求极高。这符合大多数二游的路子。因为二游是需要故事美术包装,不断出新角色达到商业化目的的。

EHP的生命部分

构成有效生命值的第二部分就是血量。

BA游戏当中血量设计,考虑到游戏中的实际受击顺序,即无论任何玩法,怪物总会优先攻击离他们近的单位。所以血量是和射程严格相关的。详细关系如下表,具体的成长规则,我将在后面的篇章《属性成长规则》里详细介绍,目前仅提供结论。

血量设计
生命生命的初值和成长值都与射程一一绑定

1000为所有后排角色,需特殊看待。
生命的初值和成长值都与射程一一绑定。

小结

基于上述两个说到的规则,我们就获得了战力计算当中有效生命值(EHP)的计算,回想起计算目的,是希望探求游戏中如何把游戏的战斗时间控制在2-4分而展开的讨论。那么现在回到原来的问题。

在计算了EHP以后,我们只需要遵循此规则,生成怪物进行拉表,在拉表的过程中,实时参考EHP来设定生命和防御即可,怪物的EHP即为对玩家输出的要求,而对玩家输出要求还受着诸多影响,(例如符合等级条件下,玩家的自动通过率,强调护甲克制关系,特殊机制要求,等级压制等等),所以只需要把普通关卡的怪物的EHP设定在Normal对阵Normal计算情况下到合理时间,那么玩家若是遵循克制关系,未被等级压制,则会很轻易通关;而如果逆克制关系,还受到轻微等级压制,则需要手操通过,而如果练度差距较大,自然需要玩家提升等级。