先看魔兽多功能模拟器SimC中文简易教程(fhsvengetta个人汉化的简体中文版)
前言
随着团队副本对DPS的压榨程度越来越高, 想要在副本中表现存在感的DK们就越来越绞尽脑汁的去不断适应新版本变化, 进而压榨自己的想象力. 尤其自5.4以来, 诸多的重铸规则, 2T16苛刻的要求, 各种满天飞的言论和各种适合不适合自己手法的EP值充斥着DK们的视线, 为了找出适合自身现有装备的重铸方案以及窥探自身极限, SimC这一便利的模拟工具也越来越多的进入到了人们的视线. "没事重铸完跑下SimC"成为了人们打木桩之余又一新兴乐趣. 然而由于邪DK特殊的机制, 复杂的属性权重和SimC自身的局限性, SimC本身很难做到对DK高仿真的模拟, 以至于5.4伊始SimC对邪DK各项属性EP值模拟结果一出满区哗然(冰DK相对会好很多). 现在SimC也在慢慢自我更新, 由最近属性权重的变化也可窥得其内核已有革新, 然而有关邪DK优先级默认的那一堆令人感到有些发笑的代码却还是那样没变. 我在这里试图根据邪DK输出的总体精神, 来改进SimC邪DK的输出代码. 由于本人代码能力有限, 因此并没有使用什么太有深度的语句, 无非是根据输出经验列出各种条件判断, 最后多跑几遍取最优解.
改进的SimC代码精神
由近几周的raid人们看出, 实际上
脓疮流并没有死, 保持高AP疾病仍然是邪DK输出的核心精神之一. 然而这种精神并不是SimC代码中一句1.1倍AP补疾病这么简单了事. 因此本改进代码本着体现以下几条精神的原则来进行:
- 权衡疾病AP与疾病剩余时间的价值, 在疾病持续时间过低时采用较高AP而不是最高AP的状态补出30秒疾病, 以保证后续足够的天打数量.
- 高AP天打, 低AP脓疮以保证天打质量, 此外在疾病持续时间较低时选择优先脓疮延时而不是无脑天打使疾病自然跳尽.
- 取消吸病和虫群语句: 取消吸病是因为吸病和邪DK输出精神相悖, 大概也只有补病的时候需要吸病以取得微弱优势, 但是一旦吸了疾病便无法用SimC语句表示补病的条件; 取消虫群的原因是虫群需要在使用后最高AP时取消虫群buff, 而SimC不仅无法做到cancelaura宏的效果(至少我不知道), 也无法做到判断加力量的buff结束前一秒的条件.
- SimC能判断目标身上疾病的AP值, 却不能判断疾病的精通和暴击值, 这使得2T16精通层数判断和浸血护符暴击层数判断上病在SimC中无法模拟... 因此AP成了判断补病与否的唯一标准.
- 单体取消死亡凋零, 其实加上也可以, 只不过条件和天打要保持一致会比较麻烦, 而且凋零需要boss不移动来吃伤害, 而天打打一下就是实打实的伤害. 嘛其实加上凋零也高不了几点DPS..(可以看到在我保留的SimC默认血转优先级里依然有关于死亡凋零的判断条件.. 你丫有心情把血转和凋零做这么细为什么不肯做一下脓疮流的补病条件和脓疮优先级?)
- 使药水/工程手套/血性狂暴与补病同步.
- 使天鬼与邪恶狂热同步.
改进的邪DK的SimC代码
使用方法: 新建一个文本文档, 将以下这些代码先复制到文本文档上, 再复制到SimC代码的相应位置并替换, 即以"actions=auto_attack"起, 到"actions.single_target+=/empower_rune_weapon"止.
红色部分是代码:
actions=auto_attack
actions+=/antimagic_shell,damage=100000
actions+=/blood_fury,if=(stat.attack_power>dot.blood_plague.attack_power*1.35)|((stat.attack_power>dot.blood_plague.attack_power*1.1)&(dot.blood_plague.remains<40))|((stat.attack_power>=dot.blood_plague.attack_power*0.9)&(dot.blood_plague.remains<20))|((stat.attack_power>=dot.blood_plague.attack_power*0.8)&(dot.blood_plague.remains<10))
actions+=/berserking
actions+=/arcane_torrent
actions+=/use_item,slot=hands,if=(stat.attack_power>dot.blood_plague.attack_power*1.35)|((stat.attack_power>dot.blood_plague.attack_power*1.1)&(dot.blood_plague.remains<40))|((stat.attack_power>=dot.blood_plague.attack_power*0.9)&(dot.blood_plague.remains<20))|((stat.attack_power>=dot.blood_plague.attack_power*0.8)&(dot.blood_plague.remains<10))
actions+=/mogu_power_potion,,if=(stat.attack_power>dot.blood_plague.attack_power*1.35)|((stat.attack_power>dot.blood_plague.attack_power*1.1)&(dot.blood_plague.remains<40))|((stat.attack_power>=dot.blood_plague.attack_power*0.9)&(dot.blood_plague.remains<20))|((stat.attack_power>=dot.blood_plague.attack_power*0.8)&(dot.blood_plague.remains<10))
actions+=/run_action_list,name=aoe,if=active_enemies>=5
actions+=/run_action_list,name=single_target,if=active_enemies<5
actions.aoe=mogu_power_potion,if=buff.dark_transformation.up&target.time_to_die<=60
actions.aoe+=/blood_fury
actions.aoe+=/use_item,slot=hands
actions.aoe+=/unholy_blight,if=talent.unholy_blight.enabled
actions.aoe+=/plague_strike,if=!dot.blood_plague.ticking|!dot.frost_fever.ticking
actions.aoe+=/pestilence,if=dot.blood_plague.ticking&talent.plague_leech.enabled,line_cd=28
actions.aoe+=/pestilence,if=dot.blood_plague.ticking&talent.unholy_blight.enabled&cooldown.unholy_blight.remains<49,line_cd=28
actions.aoe+=/unholy_frenzy
actions.aoe+=/summon_gargoyle
actions.aoe+=/dark_transformation
actions.aoe+=/blood_tap,if=talent.blood_tap.enabled&buff.shadow_infusion.stack=5
actions.aoe+=/blood_boil,if=blood=2|death=2
actions.aoe+=/death_and_decay,if=unholy=1
actions.aoe+=/soul_reaper,if=unholy=2&target.health.pct-3*(target.health.pct%target.time_to_die)<=35
actions.aoe+=/scourge_strike,if=unholy=2
actions.aoe+=/blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>10
actions.aoe+=/death_coil,if=runic_power>90|buff.sudden_doom.react|(buff.dark_transformation.down&rune.unholy<=1)
actions.aoe+=/blood_boil
actions.aoe+=/icy_touch
actions.aoe+=/soul_reaper,if=unholy=1&target.health.pct-3*(target.health.pct%target.time_to_die)<=35
actions.aoe+=/scourge_strike,if=unholy=1
actions.aoe+=/death_coil
actions.aoe+=/blood_tap,if=talent.blood_tap.enabled
actions.aoe+=/plague_leech,if=talent.plague_leech.enabled&unholy=1
actions.aoe+=/horn_of_winter
actions.aoe+=/empower_rune_weapon
actions.single_target=outbreak,if=(stat.attack_power>dot.blood_plague.attack_power*1.35)|((stat.attack_power>dot.blood_plague.attack_power*1.1)&(dot.blood_plague.remains<40))|((stat.attack_power>=dot.blood_plague.attack_power*0.9)&(dot.blood_plague.remains<20))|((stat.attack_power>=dot.blood_plague.attack_power*0.8)&(dot.blood_plague.remains<10))|(!dot.blood_plague.ticking|!dot.frost_fever.ticking)
actions.single_target+=/plague_strike,if=((stat.attack_power>dot.blood_plague.attack_power*1.35)|((stat.attack_power>dot.blood_plague.attack_power*1.1)&(dot.blood_plague.remains<40))|((stat.attack_power>=dot.blood_plague.attack_power*0.9)&(dot.blood_plague.remains<20))|((stat.attack_power>=dot.blood_plague.attack_power*0.8)&(dot.blood_plague.remains<10))|(!dot.blood_plague.ticking|!dot.frost_fever.ticking))&(cooldown.outbreak.remains>0)
actions.single_target+=/blood_tap,if=talent.blood_tap.enabled&(buff.blood_charge.stack>10&runic_power>=32)
actions.single_target+=/festering_strike,if=dot.blood_plague.remains<8
actions.single_target+=/soul_reaper,if=target.health.pct-3*(target.health.pct%target.time_to_die)<=35
actions.single_target+=/blood_tap,if=talent.blood_tap.enabled&((target.health.pct-3*(target.health.pct%target.time_to_die)<=35&cooldown.soul_reaper.remains=0))
actions.single_target+=/unholy_frenzy,if=unholy<2&blood<2&frost<2
actions.single_target+=/summon_gargoyle,if=unholy<2&blood<2&frost<2
actions.single_target+=/dark_transformation,if=blood<2&frost<2
actions.single_target+=/death_coil,if=runic_power>90
actions.single_target+=/death_and_decay,if=unholy=2
actions.single_target+=/blood_tap,if=talent.blood_tap.enabled&(unholy=2&cooldown.death_and_decay.remains=0)
actions.single_target+=/festering_strike,if=blood=2&frost=2
actions.single_target+=/scourge_strike,if=unholy=2
actions.single_target+=/blood_tap,if=talent.blood_tap.enabled&cooldown.death_and_decay.remains=0
actions.single_target+=/death_coil,if=buff.sudden_doom.react|(buff.dark_transformation.down&rune.unholy<=1)
actions.single_target+=/death_and_decay,if=stat.attack_power>dot.blood_plague.attack_power*0.5|dot.blood_plague.remains>50
actions.single_target+=/scourge_strike,if=stat.attack_power>dot.blood_plague.attack_power*0.5|dot.blood_plague.remains>50
actions.single_target+=/festering_strike
actions.single_target+=/death_and_decay
actions.single_target+=/scourge_strike
actions.single_target+=/horn_of_winter
actions.single_target+=/death_coil,if=buff.dark_transformation.down|(cooldown.summon_gargoyle.remains>8&buff.dark_transformation.remains>8)
actions.single_target+=/blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>=8
actions.single_target+=/empower_rune_weapon
一些注解(SimC代码带注解复制无效... 所以只好多贴一遍)
下面部分是注解
actions=auto_attack
actions+=/antimagic_shell,damage=100000
actions+=/blood_fury,if=(stat.attack_power>dot.blood_plague.attack_power*1.35)|((stat.attack_power>dot.blood_plague.attack_power*1.1)&(dot.blood_plague.remains<40))|((stat.attack_power>=dot.blood_plague.attack_power*0.9)&(dot.blood_plague.remains<20))|((stat.attack_power>=dot.blood_plague.attack_power*0.8)&(dot.blood_plague.remains<10)) //血性狂暴与补病条件同步
actions+=/berserking
actions+=/arcane_torrent
actions+=/use_item,slot=hands,if=(stat.attack_power>dot.blood_plague.attack_power*1.35)|((stat.attack_power>dot.blood_plague.attack_power*1.1)&(dot.blood_plague.remains<40))|((stat.attack_power>=dot.blood_plague.attack_power*0.9)&(dot.blood_plague.remains<20))|((stat.attack_power>=dot.blood_plague.attack_power*0.8)&(dot.blood_plague.remains<10)) //工程手套与补病条件同步
actions+=/mogu_power_potion,,if=(stat.attack_power>dot.blood_plague.attack_power*1.35)|((stat.attack_power>dot.blood_plague.attack_power*1.1)&(dot.blood_plague.remains<40))|((stat.attack_power>=dot.blood_plague.attack_power*0.9)&(dot.blood_plague.remains<20))|((stat.attack_power>=dot.blood_plague.attack_power*0.8)&(dot.blood_plague.remains<10)) //药水与补病条件同步
actions+=/run_action_list,name=aoe,if=active_enemies>=5
actions+=/run_action_list,name=single_target,if=active_enemies<5
//公共部分为使邪恶狂热与天鬼条件一致, 取消了邪恶狂热语句
//AOE部分不是重点内容, 并且AOE方式随怪物数量及战斗机制不同有较大变化, 这里仍大致沿用SimC默认的代码(相信也没人专门用SimC模拟邪DK的AOE吧..), 不同之处就是补上了公共部分的血性狂暴药水工程手套和石像鬼, 这里不再赘述
actions.single_target=outbreak,if=(stat.attack_power>dot.blood_plague.attack_power*1.35)|((stat.attack_power>dot.blood_plague.attack_power*1.1)&(dot.blood_plague.remains<40))|((stat.attack_power>=dot.blood_plague.attack_power*0.9)&(dot.blood_plague.remains<20))|((stat.attack_power>=dot.blood_plague.attack_power*0.8)&(dot.blood_plague.remains<10))|(!dot.blood_plague.ticking|!dot.frost_fever.ticking) //细化补病条件, 权衡疾病AP与疾病剩余时间的价值, 分为4个阶段, 其中1.35倍AP为视当前目标身上疾病未收到任何饰品药水buff加成所以无视疾病剩余时间(事实上正常循环也很少有能把疾病打上45秒的吧..) 补病优先使用爆发
actions.single_target+=/plague_strike,if=((stat.attack_power>dot.blood_plague.attack_power*1.35)|((stat.attack_power>dot.blood_plague.attack_power*1.1)&(dot.blood_plague.remains<40))|((stat.attack_power>=dot.blood_plague.attack_power*0.9)&(dot.blood_plague.remains<20))|((stat.attack_power>=dot.blood_plague.attack_power*0.8)&(dot.blood_plague.remains<10))|(!dot.blood_plague.ticking|!dot.frost_fever.ticking))&(cooldown.outbreak.remains>0) //细化补病条件, 爆发CD时使用暗打补病
actions.single_target+=/blood_tap,if=talent.blood_tap.enabled&(buff.blood_charge.stack>10&runic_power>=32) //血转使用条件保留SimC默认优先级
actions.single_target+=/festering_strike,if=dot.frost_fever.remains<8|dot.blood_plague.remains<8 //提高需要避免疾病提前结束的脓疮的优先级至最高
actions.single_target+=/soul_reaper,if=target.health.pct-3*(target.health.pct%target.time_to_die)<=35
actions.single_target+=/blood_tap,if=talent.blood_tap.enabled&((target.health.pct-3*(target.health.pct%target.time_to_die)<=35&cooldown.soul_reaper.remains=0))
actions.single_target+=/unholy_frenzy,if=unholy<2&blood<2&frost<2
actions.single_target+=/summon_gargoyle,if=unholy<2&blood<2&frost<2 //狂热与石像鬼同步,加入符文条件限制
actions.single_target+=/dark_transformation,if=blood<2&frost<2 //黑暗突变施放时加入符文条件限制
actions.single_target+=/death_coil,if=runic_power>90
actions.single_target+=/blood_tap,if=talent.blood_tap.enabled&(unholy=2&cooldown.death_and_decay.remains=0)
actions.single_target+=/festering_strike,if=blood=2&frost=2
actions.single_target+=/scourge_strike,if=unholy=2
actions.single_target+=/blood_tap,if=talent.blood_tap.enabled&cooldown.death_and_decay.remains=0
actions.single_target+=/death_coil,if=buff.sudden_doom.react|(buff.dark_transformation.down&rune.unholy<=1)
actions.single_target+=/death_and_decay,if=stat.attack_power>dot.blood_plague.attack_power*0.5|dot.blood_plague.remains>50 //凋零判断条件同天打, 但优先级略高于天打, 下同
actions.single_target+=/scourge_strike,if=stat.attack_power>dot.blood_plague.attack_power*0.5|dot.blood_plague.remains>50 //高AP天打, 0.5倍血病AP保证了当疾病是双饰品疾病时, 十字军触发的状态; 而当疾病AP过低时, 0.5AP也可保证低AP下天打优先级高于脓疮. 此外疾病时间过长时尽量使用天打
actions.single_target+=/festering_strike //低AP下脓疮优先级高于天打
actions.single_target+=/death_and_decay
actions.single_target+=/scourge_strike //低AP下天打优先级低于脓疮
actions.single_target+=/horn_of_winter
actions.single_target+=/death_coil,if=buff.dark_transformation.down|(cooldown.summon_gargoyle.remains>8&buff.dark_transformation.remains>8)
actions.single_target+=/blood_tap,if=talent.blood_tap.enabled&buff.blood_charge.stack>=8
actions.single_target+=/empower_rune_weapon
改进后的代码对于重铸思路的变更
- 使用改进后的代码, DPS根据装等及装备重铸风格不同大约会普遍高出3000~7000的样子, 同时带来的改变是急速EP值上升, 精通价值下降. 由此可见无脑压急速并不可取.
- 而当重铸急速高于精通时, 2T16触发急速, 急速价值会大幅下降, 但依然高于精通. 值得一提的是, 这里不是一个"急速价值高就要重铸急速高于精通"的问题, 而是"急速高于精通后会使急速价值降低"的问题, 并且不要忘了疾病伤害会放大触发性的精通值. 而究竟哪边偏的更多一点, 目前两种流派都有存在. 装等较低时重铸急速高于精通应该会获得更多收益, 但当装等上去以后即使重铸精通高于急速, 装备本身自带的急速应该也已足够.
- 如果有人用SimC自带的T16H模型以我的代码进行模拟会发现提升并不是很大, 这是因为SimC默认的T16H模型重铸后只有2000+急速, 这是SimC在5.4的第一版本对急速的评价过低所致... 过低的急速使得为保持高AP疾病所打出的脓疮过多, 并不符合邪DK应有的流派, 同时也并不符合目前装备的实际. 若按照新思路重新选取带急速的BIS装相信会有更大提升.
- 还是那句老话: 邪DK的3种绿字属性差异并没有你想的那么大, 过分精细的重铸还是不如一张洗干净的脸. 属性难平衡, 重铸需适度..
- 虽然有这句老话, 但仍要得出一个不是结论的结论的话... 就是低装等下首要重铸暴击, 其次急速, 最后精通; 而当装等高时首要重铸暴击, 急速精通接近相等且精通略高于急速, 前提是此时仍能保证接近9000甚至更高的急速.
写在最后的话
本文所给出的代码并不是邪DK最优解, 比如如果能把现版本能入手的饰品及其触发buff分门别类写成条件的话会准确很多. 另外由于SimC不支持提取当前疾病的精通和暴击值, 因此不知其计算疾病时是否只是按当前精通算伤害, 甚至有没有考虑触发性精通被疾病放大的EP值; 以及我在修改代码时所发现的SimC类似于逻辑上的bug, 比如一些优先级调换后明显会影响DPS的技能, 实际调换后却对DPS影响不大, 又或者对疾病剩余时间的判断极其诡异, 有些无关痛痒的技能把疾病剩余时间条件限的很宽甚至会大幅提高DPS, 诸如此类bug本文代码皆已剔除, 一切以实际为准. 这就是前一段吵得沸沸扬扬的SimC程序的局限性. 虽然本文给出了模拟的近似代码, 但在这里还希望大家重铸后多打木桩, 一来熟悉手法寻找适合自己的属性, 二来也的确只有实践才能出真知.