前言
大家好,我是来自祈福-小猫咪能有什么坏心思呢
公会的萨满玩家Momothewolf
在遥远的2020年11月22日,合老师提出了通过wcl的expression过滤器来实现筛选出救急治疗数据的方法
在当时受限于技术和精力,过滤方式出现了bug,然后没有都继续跟进下去,非常遗憾
不过,我在不久前非常有幸参与了wcl的Expression文档翻译工作,对相关功能有了更深入了理解。于是在合老师成果基础上继续进行了演进,并成功筛选出了我想要的数据。
本文将分为两部分:前半部分重点讲述分析思路与使用方法,后半部分讲述一些样板数据下我个人的分析结论。
请文明讨论,无论你怎么看待数据,数据就在那里。
本文采用CC BY 4.0协议
思路与用法
为方便讲解,我并不随意地找了一份WCL日志,并进入匿名模式进行分析:
https://classic.warcraftlogs.com/reports/a:Xrv4dWjLRQh69kfP#boss=-3&difficulty=0&type=healing
无论是合老师的“从日志中找出真正的预读型(救急型)治疗“、”如何区分纯混子和治疗量虽不高,但预读到位,救急有术的治疗”,还是为了明确治疗分工筛选“抬血”和“稳血”数据,或者是为了对一些特定条件触发的治疗特效(如卡拉波)进行预测,都是期望对治疗数据进行以下处理:
1. 设定一个合适的、可配置的阈值
2. 找出治疗生效前,目标血量在阈值内的治疗数据
3. 可以对技能进行筛选
这个需求看似简单,但因为魔兽自开放怀旧以来,战斗日志中对于开始施法的事件没有记录目标,所以无法针对治疗生效前的血量设置条件来筛选
比如在回放中经常看到治疗在发呆,就是这个缘故。没有成功加上去的治疗,在日志中是没有目标的。
因此,首先要解决的问题就是如何抓到治疗生效前的血量问题
参阅,可以发现,要实现这个目的,可以用到的字段包括
resources.hitPoints —— 当前血量
resources.maxHitPoints —— 最大血量
resources.hpPercent —— 当前血量百分比
effectiveHealing —— 有效治疗
因为Expression的本质是面向事件的过滤,因此我们要在造成治疗事件上,计算出治疗生效前的血量,并基于它进行过滤
这很简单,直接用当前血量减去有效治疗就可以了,因此有了以下表达式
Code c:
effectiveHealing != 0 AND (resources.hitPoints - effectiveHealing)/resources.maxHitPoints < 50 AND (resources.hitPoints - effectiveHealing)/resources.maxHitPoints > 0
因为过量治疗的存在,首先要设置effectiveHealing != 0来过滤掉所有过量的事件
然后再计算治疗生效前血量,取0%~50%这个区间 (resources.hitPoints - effectiveHealing)/resources.maxHitPoints < 50 AND (resources.hitPoints - effectiveHealing)/resources.maxHitPoints > 0
大功告成,输入Filter Expression,回车然后点击治疗,就应该可以了。。。。吧?
经过试验以及和wcl的沟通,终于确认了,因为怀旧日志中没有当前血量,因此在治疗事件中,resources.hitPoints 和 resources.maxHitPoints 都为0。上面的表达式只能在正式服工作。
好吧,难怪数据那么异常
但是resources.hpPercent是可以用的,我们可以通过它来推算治疗前的治疗
比如,假设非坦克玩家普遍为10000血,那么如果治疗者造成了5000有效治疗把目标顶满(resources.hpPercent = 100),则可以计算出治疗生效前的血量百分比为50%,没有超过期望阈值
同理,当治疗者造成4000点有效治疗时,极限目标血量百分比为90%
只需要列的条件足够多,就可以筛选出足够的符合条件的数据
因此有了以下公式
effectiveHealing != 0 AND resources.hpPercent > 0 AND target.role != "tank" AND (effectiveHealing > 5000 OR (effectiveHealing > 4000 AND resources.hpPercent < 90) OR (effectiveHealing > 3000 AND resources.hpPercent < 80) OR (effectiveHealing > 2000 AND resources.hpPercent < 70) OR (effectiveHealing > 1000 AND resources.hpPercent < 60) )
一样过滤过量治疗,过滤血量百分比为0即死亡事件。
因为假定目标是非坦克10000血作为模板,因此设置了target.role != "tank"来过滤目标是非坦克的事件
之后如 (effectiveHealing > 4000 AND resources.hpPercent < 90) 这样并列的条件,是为了根据治疗量筛选阈值范围内的事件
只列到了effectiveHealing > 1000 是为了避免被小额治疗数据干扰
输入Filter Expression,回车
同理,如果过滤坦克的受到治疗,可以假定坦克15000血进行计算
分析结论
过滤后的数据还是非常有意思的
以样板数据为例,我们可以分析一下个人发挥
团队救急治疗数据如下
可以看到主要是9号萨满在对团队进行救急,救急目标主要是术士
选择Done To Friendly可以查看治疗目标维度的急救分布
术士27需要急救的缺口特别特别多,规避伤害能力明显有问题或者明显缺爱
狂暴战36主要被链子急救,但最爱他的是15号牧师
坦克救急治疗数据如下
同样可以分析团队治疗协作情况
在已经取得授权的前提下,这里使用Noobs的一次竞速log作为对比参照
https://classic.warcraftlogs.com/reports/7ajRTZLqXkyBt639
团队救急治疗数据如下
综上,通过分析两篇log,个人分析的结论如下:
1. 过滤后总治疗数据越少代表团队水平越高,成熟团队承伤稳定、规避伤害合理、稳血治疗够多,成员血量稳定,以至于不需要太多急救治疗
2. 奶骑是坦克的抬血主力,这和萨满、牧师稳坦克血的特性是互补的。而德鲁伊都可以。同理,因为奶骑这版本的法力甩不了那么多大光,因此需要其他治疗提供足够的支持,减少奶骑大光的使用。
3. 过滤后的数据可以作为评估卡拉波特效数据的参考,比如千雪期望特效就是4%
原帖地址 :
https://bbs.nga.cn/read.php?tid=24295675
Wcl
https://bbs.nga.cn/read.php?tid=24295675
更多总结进入公众号下方菜单查看
热门跟贴