仇恨

(重定向自仇恨公式

游戏中的各类“索敌”机制往往都依赖于仇恨这一系统,而仇恨排序、筛选的过程分为两个部分:权重计算和规则排序。而权重计算又分为“仇恨值计算”与“仇恨过滤器(postFilter)规则计算”两步。

仇恨值

每个单位的仇恨值都会根据自身的实体类型选用不同的计算式:

  • 敌人类可以在地图上游走的单位,包括一般的敌人、中立单位等目标的仇恨值 = 1000 * 嘲讽等级 - 路径距离
    • 若所在地块可到达目标路径点,则路径距离为:终点距离(以所在地块的坐标为起点,直接串联所有路径点的到终点曼哈顿寻路距离之和,“传送门”之间的距离除外)+修正值(先取“自身所在具体坐标→当前地块中心”的向量V,然后取前进方向上这个向量V的投影值(可负))。单位为“格”,
    • 若所在地块不可到达目标路径点,或自身处于地图外,则路径距离为:当前坐标至当前目标路径点的直线距离。单位为“格”,
    • 通俗易懂的来讲,这一仇恨值计算方式可以理解为“自身离终点/路径点越近,仇恨值越高”。
  • 角色类可以在地图上以格为最小单位部署的单位,包括一般的我方单位、召唤物、装置(包括敌方装置)等目标的仇恨值 = 10000 * 嘲讽等级 + 创建时间
    • 创建时间为从“战斗开始”到计算的该单位创建时取得的当前战斗计时,其上下限为[0,10000],每个单位一经取值则不再变化。单位为秒由于游戏内时间处理相关的机制几乎无法精确到比帧更短的时间,因此可以将其理解为战斗计时每游戏帧更新一次(+0.033)
      由于角色类的仇恨值在无嘲讽的情况下等同于其创建时间,而创建时间具有上限,因此可以认为10000s(≈2.78h)之后部署的所有角色类单位是“同时部署”的,在相同嘲讽等级情况下拥有相同的仇恨值。
    • 通俗易懂的来讲,这一仇恨值计算方式可以理解为“越晚部署/出现,仇恨值越高”。
  • 仇恨值的类型为32bit的float型变量。

仇恨过滤器(索敌方式)

  • 仇恨过滤器(postFilter)即为最常说的“索敌方式”,每次索敌往往都需要框定所有可选索敌目标单位,列成一份列表(默认为实体创建顺序),对列表进行一次过滤器排序;仇恨过滤器可能会对仇恨值进行二次计算,可能根据仇恨值(或根据其他数值)对目标列表进行排序、筛选、甚至打乱。
  • 仇恨过滤器最近一次更新时,参考的游戏客户端版本号为1.8.01(简体中文版客户端)。该版本客户端中共有45个仇恨过滤器,5个二次过滤器。其中有10个占位用的仇恨过滤器(未实装进游戏或从未被使用过)。
  • 下面提到的“参考值”为一个32bit的float型变量,若无特殊说明,使用到参考值进行排序时,将根据列表中每个单位的参考值,对索敌列表进行一次稳定性排序(逻辑类似插入排序法),最后列表中最靠前(即参考值最小)的一个或数个单位将会被此次仇恨过滤器筛出,成为此次“索敌”的目标。
因为排序算法具有稳定性,并不会改变同值项的顺序,所以在情况下目标之间的顺序将会保持为默认的实体创建顺序,故这一情况下,索敌者将无关乎具体数值,优先选择更早创建(通常是部署)的单位。
过滤器在比较两个参考值时默认省略小数点后第3位之后的小数,因此参考值较为接近的情况下可能会因此被过滤器视为参考值相同。虽然默认为保留到第3位,但大部分过滤器更常用的是保留到第1位放在角色类身上往往表现为每过去整整0.1s参考值才多+0.1,而这也就是大家所说的“游戏开始后每个3帧内部署的干员视为同帧部署”的根本原因
  • 由于仇恨过滤器之间的差距过大,此处会将它们分章节而非列表格进行介绍。


全部

ID: 0 | ALL
不进行排序,直接使用默认的实体创建顺序。
典型使用者:各类群体攻击、无差别攻击。

终点距离升序

ID: 1 | DIST_TO_EXIT_ASC
不使用仇恨值,直接使用单位的终点距离(见上方“仇恨值”部分)作为参考值进行排序。
即“终点距离越短越容易被选中”。
暂未被使用。

生命值比例升序

ID: 2 | HP_RATIO_ASC
不使用仇恨值,直接使用单位的生命值百分比作为参考值。
即“生命值(百分比)越低越容易被选中”。
典型使用者:苦艾一技能、始海穿刺者富营养的穿刺者

生命值比例升序(满生命值除外)

ID: 3 | HP_RATIO_NOT_FULL_ASC
排除所有满生命值单位。
不使用仇恨值,直接使用单位的生命值百分比作为参考值。
即“除满生命值外,生命值(百分比)越低越容易被选中”。
典型使用者:各类医疗干员的普通治疗、各类治疗技能等。

仇恨降序

ID: 4 | HATRED_DES
参考值为仇恨值的相反数
即“仇恨值越高越容易被选中”。
典型使用者:一般的攻击、技能索敌、甚至一小部分群体攻击都是这个

仅生命值未满目标

ID: 5 | HP_RATIO_NOT_FULL
排除所有满生命值单位。
不进行排序,直接使用默认的实体创建顺序。
典型使用者:(待补充)

优先飞行单位,仇恨降序

ID: 6 | HATRED_DES_FLY_FIRST
参考值为仇恨值的相反数;若为非飞行单位,参考值+1000000
即“飞行单位更容易被选中,然后仇恨值越高越容易被选中”。
安德切尔使用,一般的速射手不会使用这一仇恨过滤器。

优先远程单位,仇恨降序

ID: 7 | HATRED_DES_RANGED_FIRST
参考值为仇恨值的相反数;若为非“图鉴中【攻击方式】包含远程的敌人”,参考值+1000000
即“远程单位更容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:(待补充)

防御降序

ID: 8 | DEF_DES
参考值为 防御值 * (-1000) - 仇恨值
即“防御值越高越容易被选中,然后仇恨值越高越容易被选中”。
史都华德刻俄柏二技能

防御升序

ID: 9 | DEF_ASC
参考值为 防御值*1000-仇恨值
即“防御值越低越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:神射手

距离来源距离降序

ID: 10 | DIST_TO_SOURCE_DES
不使用仇恨值,直接取单位与自身的距离平方的相反数作为参考值。
即“距离自身越远越容易被选中”。
典型使用者:钩索师

距离来源距离升序

ID: 11 | DIST_TO_SOURCE_ASC
不使用仇恨值,直接取单位与自身的距离平方作为参考值。
即“距离自身越近越容易被选中”。
典型使用者:推击手工程蓄水炮

只选未眩晕目标,仇恨降序

ID: 12 | NOT_STUNNED_HATRED_DES
排除所有晕眩异常效果: 晕眩
状态机尝试切换至STUN
(无法攻击、阻挡、释放技能)
的单位。
参考值为 仇恨值的相反数。
即“除眩晕单位外,仇恨值越高越容易被选中”。
典型使用者:萨卡兹术师的捆绑技能

距离来源垂直距离升序

ID: 13 | DIRECTIONAL_DIST_TO_SOURCE_ASC
不使用仇恨值,计算“来源→单位”的向量V,取向量V在来源朝向方向上的投影值作为参考值进行排序。
可以粗略的理解为“横坐标(左右朝向)上或纵坐标上(上下朝向),距离自身越近越容易被选中”。
典型使用者:食铁兽二技能

随机

ID: 14 | RANDOM
不使用仇恨值,不进行排序,随机打乱。 典型使用者:刻刀一技能;艾雅法拉的3技能与阿米娅的2技能不使用这个。

生命值降序

ID: 15 | HP_DES
参考值为 生命值 * (-1000) - 仇恨值。
即“生命值(数值)越高越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:W三技能

生命值升序

ID: 16 | HP_ASC
参考值为 生命值 * 1000 - 仇恨值。
即“生命值(数值)越低越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:(待补充)

攻击力降序

ID: 17 | ATK_DES
参考值为 攻击力 * (-1000) - 仇恨值。
即“攻击力越高越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:(待补充)

攻击力升序

ID: 18 | ATK_ASC
参考值为 攻击力 * 1000 - 仇恨值。
即“攻击力越低越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:(待补充)

最大血量降序

ID: 19 | MAX_HP_DES
参考值为 最大生命值 * (-1000) - 仇恨值。
即“最大生命越高越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:鼠王唱沙

最大血量升序

ID: 20 | MAX_HP_ASC
参考值为 最大生命值 * 1000 - 仇恨值。
即“最大生命越低越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:鼠王沙暴

优先正前方,曼哈顿距离升序

ID: 21 | FORWARD_FIRST_MANHATTAN_ASC
对于自身朝向的“正前方”的单位:参考值为 1000*曼哈顿距离[1] - 仇恨值。
对于除此之外的单位:参考值为 1000000*曼哈顿距离 - 仇恨值。
可以粗略的理解为“先看正前方的单位,距离越近越容易被选中,然后仇恨值越高越容易被选中;然后再看其他单位,距离越近越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:的两个爆发剂技能

优先未阻挡目标,仇恨降序

ID: 22 | HATRED_DES_UNBLOCKED_FIRST
参考值为仇恨值的相反数;被阻挡单位参考值+1000000
即“被阻挡的单位优先,然后仇恨值越高越容易被选中”。
典型使用者:刻俄柏1技能

生命值未满目标中随机

ID: 23 | HP_NOT_FULL_RANDOM
排除所有生命值未满的单位
不使用仇恨值,不进行排序,排除后随机打乱。
典型使用者:清流二技能

优先隐形目标,仇恨降序

ID: 24 | HATRED_DES_INVISIBLE_FIRST
参考值为仇恨值的相反数;不持有隐匿异常效果: 隐匿
无法被敌对阵营选中(可选性效果)
※隐匿与“阻挡时解除”没有直接关系,该机制通常由其他效果实现
单位参考值+1000000。
即“持有隐形的单位优先,然后仇恨值越高越容易被选中”。
典型使用者:极境二技能

优先最远,仇恨降序

ID: 25 | HATRED_DES_DIST_FARTHER_FIRST
计算来源与单位之间的直线距离,参考值为 -1000000 * 直线距离 - 仇恨值。
即“距离来源越远越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:爱国者投枪 |

优先最近,仇恨降序

ID: 26 | HATRED_DES_DIST_NEARER_FIRST
计算来源与单位之间的直线距离,参考值为 1000000 * 直线距离 - 仇恨值。
即“距离来源越近越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:(待补充)

重量降序

ID: 27 | MASS_DES
参考值为 重量等级 * (-1000) - 仇恨值。
即“重量越高越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:攻城手

重量升序

ID: 28 | MASS_ASC
参考值为 重量等级 * 1000 - 仇恨值。
即“重量越低越容易被选中,然后仇恨值越高越容易被选中”。
典型使用者:(待补充)

优先沉睡单位,仇恨降序

ID: 29 | HATRED_DES_SLEEPING_FIRST
参考值为仇恨值的相反数;不持有沉睡异常效果组合: 沉睡
这是一个异常组合,包含了以下异常效果
无法行动+无敌+不可阻挡
单位参考值+1000000。
即“持有沉睡的单位优先,然后仇恨值越高越容易被选中”。
典型使用者:瑕光

生命值百分比升序,具有可抵抗状态者优先

ID: 30 | HP_RATIO_ASC_CONTAINS_STATUS_RESISTABLE_BUFF_FIRST
不使用仇恨值。以剩余血量比例为参考值进行排序;不具有可抵抗状态的单位参考值+1000000。 即“仇恨值越高越容易被选中,具有可抵抗状态者优先”。
典型使用者:絮雨

忽略免疫睡眠目标,仇恨降序

ID: 31 | HATRED_DES_IMMUNE_SLEEPING_EXCLUDE
排除持有沉睡抗性异常效果组合: 沉睡
这是一个异常组合,包含了以下异常效果
无法行动+无敌+不可阻挡
沉睡免疫: 使自身的沉睡失效,但不会清除相关BUFF
或是沉睡免疫异常效果组合: 沉睡
这是一个异常组合,包含了以下异常效果
无法行动+无敌+不可阻挡
沉睡免疫: 使自身的沉睡失效,但不会清除相关BUFF
的目标。
参考值为 仇恨值的相反数;未被阻挡单位+1000000权重
即“除免疫睡眠的目标外,仇恨值越高越容易被选中”。
典型使用者:爱丽丝2技能

元素值降序

ID: 32 | EP_DES
不使用仇恨值,以全种类元素中的最低值降序为参考值进行排序。
即“显示的元素值越低越容易被选中”。
典型使用者:首言者侵蚀液泡

仇恨降序,被阻挡优先

ID: 33 | HATRED_DES_BLOCKED_FIRST
参考值为 仇恨值的相反数;未被阻挡单位+1000000权重
即“仇恨值越高越容易被选中,被阻挡的单位优先”。
典型使用者:歌蕾蒂娅2技能

创建时间降序

ID: 34 | CREATED_TIME_DES
不使用仇恨值,直接使用单位的创建时间(见上方“仇恨值”部分)作为参考值进行排序。
即“越晚部署的越容易被选中”。
典型使用者:(待补充)

创建时间升序

ID: 35 | CREATED_TIME_ASS
不使用仇恨值,直接使用单位的创建时间(见上方“仇恨值”部分)的相反数作为参考值进行排序。
即“越早部署的越容易被选中”。
典型使用者:(待补充)

满生命值目标以外,血量比例升序,优先我与我的召唤物

ID: 36 | HP_RATIO_NOT_FULL_ASC_MY_TOKEN_OR_ME_FIRST
排除所有生命值均为满的单位。
若自身的召唤物处于范围内(且生命值不为满),排序前将自身的召唤物强制加入到列表末尾(无视禁疗异常效果: 禁疗
无法成为治疗类能力的目标(可选性效果),受到的治疗量变为0
※增减“生命自然回复速度”的效果不属于治疗类能力
)。
不使用仇恨值,以生命值百分比为参考值;自身与自身的召唤物以外的单位参考值+1000000。
即“生命值(百分比)最低者更容易被选中,优先治疗”
典型使用者:凯尔希(其召唤物为Mon3tr

元素值升序,生命值百分比升序优先,仅不全满

ID: 37 | EP_MIN_ASC_HP_RATIO_ASC_FIRST_NOT_ALL_FULL
排除所有元素值(全种类)与生命值均为满的单位。
不使用仇恨值,不处理参考值,根据“全种类元素值中的最低值”升序排序,出现同值时单位之间以生命值百分比升序排序。
即“显示元素值最低者更容易被选中,然后生命值(百分比)最低者更容易被选中”
典型使用者:行医通常状态下的治疗

生命值百分比升序,元素值升序优先,仅不全满

ID: 38 | HP_RATIO_ASC_EP_MIN_ASC_FIRST_NOT_ALL_FULL
排除所有元素值(全种类)与生命值均为满的单位。
不使用仇恨值,不处理参考值,根据生命值百分比升序排序,出现同值时单位之间以“全种类元素值中的最低值”升序排序。
即“生命值(百分比)最低者更容易被选中,然后显示元素值最低者更容易被选中”
典型使用者:行医的技能

血量百分比升序,创建时间降序优先

ID: 39 | HP_RATIO_ASC_CREATED_TIME_DES_FIRST
未知
典型使用者:琴柳2技能

仇恨降序,寒冷者优先,然后未冻结者

ID: 40 | HATRED_DES_COLD_FIRST_THEN_NOT_FROZEN
未知
典型使用者:灵知3技能

网格位置,行小,列大

ID: 41 | GRIDPOS_BY_SMALL_COL_BIG_ROW
未知

阻挡数降序

ID: 42 | BLOCK_COUNT_DES
未知

血量百分比升序,仅持有可抵抗状态者

ID: 43 | HP_RATIO_ASC_CONTAINS_STATUS_RESISTABLE_BUFF
未知

重量降序,沉睡者优先

ID: 44 | MASS_DES_SLEEPING_FIRST
未知


二次过滤器

在进行完过滤器排序后,可能还会进行规则排序;有时会使用到二次过滤器(secondaryFilter):

ID 名称  解释
0 FLY_FIRST 优先飞行(所有的对空狙击)
1 RANGED_APPLYWAY_FIRST 优先“图鉴中【攻击方式】包含远程的敌人”(安德切尔
2 SPECIFIED_FILTER_TAG XXtag优先(需要配合filterTag变量填写对应的tag,例如格劳克斯)
3 SPECIFIED_BUFF 优先含有指定Buff(以BuffKey为识别目标)的单位
4 SPECIFIED_BUFF_PAIR_OR 优先含有复数指定Buff(以BuffKey为识别目标)的单位
  1. 两点在南北方向上的距离加上在东西方向上的距离,即两点的横坐标之差的绝对值+纵坐标之差的绝对值。