侧边导航 拖动可排序

词条1.1.7版本全机制剖析

兔兔酱  2018-08-13 16:43:14  [历史记录] 936

目录:

0、写在前面

1、游戏进行的方式

2、技能的本质

3、死亡的方式

4、回合的本质

5、伤害的计算

6、反击的互动

7、BUFF


0、写在前面:

本帖是从头到尾以编程的思想、代码的实现为基础,对游戏现象进行丰富想象力并加以实验验证出来的机制分析贴。一句话:在没有进行内存追踪之前,一切分析都是猜想,是假设,且随时可能出现个例来打脸。废话不多说,进入正题。

编程里,有一个叫做“对象”的类,它很抽象,什么东西都可以称为对象。拿万象物语打比方,出战角色是一个对象,怪物是一个对象,它们都有共同的特点:有血量、有护盾,有BUFF槽。

每个对象都很像,但每个对象有它自己的特点。比如说,它们各自有各自的外貌、它们各自有各自的技能。它们内置的一些东西也不一样。当内置的某些东西变化后,会发生一些事情。另外,因为内置变量是可操作的,所以有时会出现CD为0的角色进行CD-1,减完之后CD还是0。

以上是大家阅读本帖需要知道的基础编程知识。


1、游戏进行的方式

整个游戏以队列的方式进行,若某个单位要进行某动作,执行的原理是将这个动作加入队列,然后依次执行。因此不存在大家概念中的“同时进行”,即使是同一阶段触发的行动,也一定是有分次序来入队的。比如触发雪尔森参谋时,会按照前排到后排(无论是我方金位-黑位-白位,还是敌方怪物)的顺序依次添加入队列。


2、技能的本质

每个单位都有自己的技能,包括怪物。我们拿蒂卡举例,蒂卡有多少条技能代码呢?我的答案是4个。大家可能都能接受这点,但如果我说出哪四个,大家可能就接受不了了:

技能1:作为参谋时,我方治愈技能提升30%

技能2(白1):治愈一名队友并赋予其2回合强化

技能3(白2):单体攻击并消除1个白芯。如果从记录末端数起有连续的白2的记录且数量是单数,则再加2个技能3进入队列中

技能4(白4):治愈指定队友并赋予其3回合减伤

以上有括号的技能代码是消魂与技能之间的反馈结果。技能3是白2消的反馈结果,意思是,你使用白2消后,技能3进入序列,白2消进入记录。如果你使用仙鳄组合,真人金2消进入记录,那么蒂卡永远检测的上一个消魂技能都是金2,combo打不出来的原因如上。


同样可能让大家难以接受的还有SP纳杰尔、SP黯月这样的多段攻击。实际上,每一段攻击都是独立的技能代码。拿SP黯月举例,她有9个技能代码:

技能1:敌方并非落单时,我方施展技能后获得灵巧,每名角色每回合限一次

技能2(白1):治愈我方全体一次。如果我方没有角色生命值大于50%,则技能3入队

技能3:治愈我方全体一次。

技能4(白2):高倍率破甲敌方全体,如果敌方没有角色生命值小于50%,则技能5入队

技能5:中倍率破甲敌方全体,如果敌方没有角色生命值小于50%,则技能6入队

技能6:低倍率破甲敌方全体

技能7(白4)…………


在防止鞭尸前,SP纳杰尔和兔姐一样,在释放技能时就已经选定好了所有目标。修改后,SP纳杰尔改成了每一段攻击都是独立代码,变成了和SP黯月一样的实时判断。目前的SP纳杰尔有7条代码:

技能1:作为参谋时,给予所有我方单位“击杀目标后获得领袖”的被动。上场时,给予自身“击杀目标后获得领袖”的被动

技能2(黑1):攻击敌方首位,将3技能加入队列,目标为敌方末位

技能3:攻击

技能4(黑2):判断敌方血量最低的角色,将其作技能5的目标加入队列。攻击敌方血量最高的角色

技能5:攻击

技能6(黑4):判断敌方护盾最低的角色,将其作技能7的目标加入队列。攻击敌方护盾最高的角色

技能7:攻击

这也是为什么SP纳杰尔二消的第二段攻击不算二消攻击的原因(这个也是官方已经声称出来的bug了)。


说到技能,还有一些有趣的现象,比如娜雅。目前娜雅只有3条技能代码。

技能1:(无论是参谋还是上场)以指针目标作为目标,造成伤害并赋予2回合易伤

技能2:如果随机数结果为暴击,则4魂技能入队而不造成伤害。否则造成伤害。

技能3:如果随机数结果为暴击,则造成大量伤害。否则造成少量伤害。

在1.1.7以前,有一个2消技能伤害+50%的宝箱。 在当时,娜雅2消变成4消是吃这个宝箱的加成的,并且当时娜雅2消变4消不能对院长造成伤害。因此我们推测当时的娜雅2消变4消只是单纯地在2消技能代码中更改倍率和动画效果。现在娜雅2消变4消可以对院长造成伤害了,原因是代码从单纯的改倍率变成了插入4消,但也因此,在旷日持久战中出现娜雅2消变4消会使蒂卡判定娜雅连续行动的bug,原理如上。


3、死亡的方式

当角色生命值到达0或者0以下时,直接在队列里加入该角色的死亡过程。

比如说,罗杰4消,它触发的技能代码是这样的:

Attack(…………一些参数…………)

罗杰.die(……一些参数……)

又比如红诺瓦4消,它触发的代码是这样的:

For遍历所有其他我方单位

If 该单位未死 {该单位.die}

正是因为当角色生命值到达0或者0以下时,队列里已有该角色的死亡代码,因此即使在后续结算中恢复了血量也难逃一死,例如旷日持久战中的蒂卡。但是,在死亡代码结算前的攻击仍然能正常结算,比如雪尔森自动队。从代码来看,属于正常,但从玩家角度而言,死掉的怪物仍然能攻击,给玩家带来的感受实在是诡异……

另外强调一点:死亡是每个单位内置的一个过程,基本大家都一样,但也有不一样的。比如死亡喷火蛇,它在die的过程中还会额外向队列插入一条喷火的技能。

而SP迪兰独一无二的斩杀是另外一回事。SP迪兰的斩杀实际是造成伤害(因为参数问题而导致的无视免疫),有兴趣的朋友可以试试SP希欧+SP迪兰,强化SP迪兰,使用黑4消,会发现被斩杀的怪物会被上一层撕裂。斩杀死亡喷火的蛇更是会从统计面板中看到它受到了撕裂伤害。


4、回合的本质

*以下内容可能颠覆认知,请谨慎阅读:

说给对机制有一定研究的吧友:严格来说,我认为1.1.6版本只有玩家的回合,没有怪物的回合。因为CD归零立即入队的处理,导致根本不需要怪物回合来检测怪物是否行动,但也因此出现了很多相关的bug。在1.1.7回合中,怪物回合的监测机制回归。鳄鱼、贾汗依旧是归0,但是被归零的怪物是在怪物回合检测之后才入队的,所以认为所谓归0实际是归1也可以,没有差别。但从UI显示的行动回合为0来看,我认为说它是归0更贴切实际一点。

说给对机制处于萌新认知的吧友:怪物行动优先于玩家行动


以下是1.1.7版本,回合阶段的顺序。

敌方回合: 全体CD-1,然后检测是否有CD为0的单位,若有,依次入队

回合开始阶段:真人、雪尔森

等待响应阶段:玩家消块→左上角回合数+1→执行消块结果(加入队列)

回合结束阶段:白黯月


1.1.6版本:

回合开始阶段:敌方全体CD-1、真人、雪尔森

等待响应阶段:玩家消块→左上角回合数+1→执行消块结果(加入队列)

回合结束阶段:白黯月

1.1.6版本初,双黑队白4消bug是这样的:

执行白4消,金4消和黑4消入队,敌方全体CD归零,立即插入队列最顶端

敌方全体行动,CD重置

执行金4消,黑4消入队

执行黑4消

执行黑4消

后来,官方修改了归零的时机,也就是剪贴了一下代码,改成了和雪尔森类似的,当黑位行动完毕,再归零敌方CD,于是变成了这样:

执行白4消,金4消和黑4消入队

执行金4消,黑4消入队

执行黑4消,敌方全体CD归零(如果这个时候敌方已经被黑4消打死,就不会有敌方行动加入队列。这也就是官方说的,第一下打死就没事,第二下才打死就会诈尸。他们为了防止这个诈尸,给上了眩晕……),敌方全体行动立即插入队列最顶端

敌方行动(但是因为眩晕没有行动出来)

执行黑4消

在回合开始时CD-1,敌方行动重新进入序列


到了现在的1.1.7版本:

执行白4消,金4消和黑4消入队

执行金4消,黑4消入队

执行黑4消,敌方全体CD归零

执行黑4消

我方回合结束

敌方回合,CD-1,判断,并入队

对于回合和怪物行动,想说的基本都表达完了,可能有些细节一时间没有码出来,以后再说吧。

可能有的吧友还是不明白1.1.6和1.1.7版本的区别,我在这里再举两个例子加以说明:

1.1.6版本,怪物的CD一旦归零,则会强制入队一次。而1.1.7版本,怪物的CD即使归零,也只在怪物的回合开始时,经过检测之后才会入队。

举例:金雪尔森+鳄鱼

在1.1.6版本中,鳄鱼1消归零敌方首位,敌方立即入队,之后再被雪尔森触发入队,一共攻击两次;1.1.7版本中,鳄鱼1消敌方归零但不入队,后经雪尔森触发入队,一共只攻击一次

举例:英雄挑战1 希欧

在1.1.6版本中,鳄鱼1消,处于免疫状态的希欧归零,希欧立即入队,攻击完毕后CD重置为1但不免疫。下个回合开始,希欧CD-1,CD为零再次立即行动进入免疫状态。而1.1.7版本中鳄鱼1消希欧归零,下个回合开始检测到CD为零才入队


5、伤害的结算

这条是临时插入的,因为一开始在写目录的时候漏掉了这条。

众所周知,这个游戏有三种伤害类型:普通、破甲和穿透。那么,伤害是怎么结算的呢?从程序角度来讲,主要还是靠调用函数和传递参数来实现的。

目前我分析一共有这么几个参数:

1:伤害类型:普通/破甲/穿透/固定普通。向函数传递伤害类型后,函数再根据伤害来源的buff(诺瓦被动、强化等)、伤害目标的debuff(易伤、不堪一击等)、这类伤害的特殊加成(鳄鱼参谋、红豹参谋、兔姐参谋)、这类技能的特殊加成(2消加成、杨波参谋)计算最终倍率

2:伤害数值:一般来说传递的是基础的技能伤害数值。但也有例外,例如兔姐的被动是经乘法运算再传递参数的

3:伤害来源:包括造成伤害的单位和造成伤害的技能

4:伤害目标

5:缺省参数

可能大家看完之后大概都能理解,但可能大家会发现在第一项伤害类型里提到固定普通伤害,什么是固定普通伤害呢?

细心的玩家可能注意到,罗杰1消对自己造成当前生命20%伤害、红诺瓦2消对所有己方单位造成总生命值33%的伤害……这些都是不吃强化、减伤易伤这些加成的,但它们确实是伤害,能触发蓝尼参谋,能触发sp猫眼支援。因此,我们认为有一种伤害类型,属于普通伤害,但数值被固定,不吃任何倍率。


6、反击的互动

也是大家都说烂了的东西,鳄鱼、贾汗,一回合只能反击一次。在7月18日官方发布的声明中明确指出一个大回合包含敌方回合和我方回合,敌方回合和我方回合各算一个回合。

而在早期测试中,我通过鳄鱼和纳杰尔的互动,发现反击限制存在两个刷新的时间点。使用仙鳄队,boss是4-6的纳杰尔,具体如图

c7ba480928381f30a9e29f46a5014c086c06f0f8.jpg

可见官方给出的反击机制的解释是正确的。但有两个机制我们群里面一直讨论不清,或者说根本不敢讨论。一个是14-17豹女和绿熊大的无限反击互动,一个是尸偶圆舞曲的无限反击。本次官方声明后,发现14-17豹女的详细说明已经改成了“强力反击”,目测周四尸偶圆舞曲boss也会做出相应的修改。


7、BUFF

在7月18号官方正式声明+扳机测试后,基本得出以下结论:

首先,buff是以buff纪录叠加来实现的。buff纪录有三种属性:buff类型、buff回合数和buff层数。每一次给予buff,实际上是在新增纪录,然后将纪录里每种buff的种类分别显示出来,其中持续回合数取纪录中最大的回合数,层数为各同种纪录相加的结果。

而buff回合数(以下简称为count)实际上与字面理解的有些不一样。以蒂卡举例。

蒂卡1消给金位强化,此时金位的buff新增一条纪录:“count5、buff1的强化”。

此时回合结束,buff扳机触发,count计数,金位的纪录变成“count4、buff1的强化”

接下来是敌方回合。敌方回合结束,buff扳机触发,count计数,金位的纪录变成“count3、buff1的强化”。然后轮到玩家消块,蒂卡再次1消给金位,金位buff新增纪录“count5、buff1的强化”。玩家回合结束,buff扳机触发;怪物回合结束,buff扳机再触发。

此时一共有两条纪录,一条一层强化的count1,一条一层强化的count3。此时是玩家的回合,消块前玩家可以长按角色,发现显示一共两层强化,持续(3除以2,向上取整=2)回合。

有的吧友可能感到奇怪,为什么蒂卡的buff持续时间是2回合,buffcount却是5呢?那我们接下来再举一个例子。

接下来要讲的是丽莎参谋。使用丽莎参谋,也就是给予金黑白位角色各一条“count4、buff3的强化”的纪录。历时长为玩家回合结束、怪物回合结束、玩家回合结束、怪物回合结束一共4次count。大家可以使用鳄鱼+丽莎参谋,在强化的第二回合如果受到怪物的攻击,鳄鱼会带着三层强化反击,然后敌方回合结束,强化buff立即消失。

也就是说,如果是上场角色的技能赋予的buff,那么它的count是(2*回合数+1)。而参谋赋予的count是(2*回合数)。这一点设计的初衷很好理解,大概就是为了使1回合强化buff可以延续到下回合玩家能继续使用这样子,比如碎牙1消。

讲完buff的计算原理,再谈谈buff count的扳机。利用白黯月进行测试,发现这个扳机发生在白黯月之前,也在泉之前。那么,泉能攻击落单免疫怪物是什么原理呢?答案是泉的扳机问题。通过描述,我们可以得知落单免疫怪“在玩家回合开始时”获得一条buff纪录“count2、buff1的免疫”。因此,白黯月触发时,怪物仍然拥有“count1、buff1的免疫”纪录。但泉实际上是在敌方回合结束时触发的,而此时buff纪录因为count降为0已经消失,于是泉可以对落单免疫怪造成伤害。然后马上开始玩家的回合,怪物再次获得免疫。


原作者:月光照心上

没用(0)

0人点赞

创建于2018-08-13 15:56:03 举报帖子

  • 选择关注的人

贡献值

声望值

粉丝

  • 选择关注的人
我哪里做的不好,你可以告诉我么?

为作者打赏K币

选择赞助方式

请使用微信扫一扫