引言

  前面几节,我们讲了AHK是如何控制鼠标键盘的、讲了热键的使用、讲了函数、讲了流程控制等。以上说的这些,足以用来做自动改造了。
  在掌握这些AHK最基本的使用后,我再来聊聊我实现自动改造的思路。写程序,最重要的是学思路。思路有了,功能实现那就是水到渠成的事了。

思路

1. 如何获取装备信息

  这个问题在poe还是非常容易解决的,只要在游戏里对着装备按ctrl + c,即可获得这个装备的全部信息。例如:

  1. 物品类别: 短杖
  2. 度: 稀有
  3. 种裔 冲撞者
  4. 平稳短杖
  5. --------
  6. 短杖
  7. 品质: +28% (augmented)
  8. 物理伤害: 35-52
  9. 攻击暴击率: 6.30%
  10. 每秒攻击次数: 1.45
  11. 武器范围: 11
  12. --------
  13. 需求:
  14. 等级: 60
  15. 力量: 71
  16. 智慧: 102
  17. --------
  18. 插槽: B-R B
  19. --------
  20. 物品等级: 85
  21. --------
  22. 品质不提高物理伤害 (enchant)
  23. 4% 品质使效果区域扩大 1% (enchant)
  24. --------
  25. 元素之相 (implicit)
  26. --------
  27. 使用技能时触发一个插入的法术,它有 4 秒冷却时间
  28. 通过这种方式触发的法术消耗总增 150%
  29. 所有法术技能石等级 +1
  30. 所有物理法术技能石等级 +1
  31. 可以最多拥有 3 个工艺属性 (crafted)
  32. 火焰伤害提高 54% (crafted)
  33. 施法速度提高 20% (crafted)

2. 从装备信息中抽取所有词缀

  我们可以发现,拿到的装备信息很多,词缀只是其中的一部分。那么如何过滤出词缀信息呢?且听我娓娓道来:

  • 有个出现频率很高的--------可以用来做分割,这里就需要用到AHK中的字符串分割函数StrSplit了,它会把一个字符串分割成一个字符串数组
  • 分割成字符串数组后,拿上面的例子来说,数组长度为8,词缀位于数组的最后一个
  • 但事实上,词缀并不是所有时候都是数组最后一个,例如塑界裂界等装备,它最后还有一栏描述,词缀在数组的倒数第二个。所以不能简单地拿最后一个了事。
  • 我目前的方法是根据物品等级那一栏往下,如果:
    • 普通装备没有基底和新赛季刚出的影响词缀,就直接获取下面一栏词缀
    • 如果碰到有基底,或是新赛季影响词缀的,就再往下识别,直到获取真正我们想要的词缀
  • 拿到词缀栏后,再用StrSplit对换行符 `n 进行一次分割
  • 最终拿到的是一个纯词缀的数组

3. 识别词缀

  到了这步,其实就很简单了。我的操作是:

  • 定义两个相同长度的数组
  • 第一个数组存希望roll到的词缀的关键字,注意这里的关键字一定要保证在所有可能roll到的词缀里独一无二
  • 第二个数组在对应的位置存数值(如果有的话),例如:你想要弓上T0的攻速,那么一般去流放编年史上查相关词缀,找到弓上T0的攻速是17% - 19%,所以,你应该在对应位置存上17
  • 最关键的一步来了,如何识别呢?
    • 定义一个变量(target),记录本轮识别中满足的词缀数
    • 首先要来个for循环遍历词缀
    • 在for循环里再嵌套个for循环遍历刚创建的关键字数组
    • 用AHK提供的函数InStr来判断是否roll到
    • 如果roll到了:
      • 如果没有数值判断,直接就可以判断为roll中,target + 1
      • 如果有数值判断,用RegExMatch函数正则匹配数字,和关键字数组对应的数值作比较,满足就target + 1,不满足就放过,进入下一轮词缀的循环
    • 记住,roll到后尽量立即break,这个关键字会让里面的for循环立即跳出。虽然省不了多少时间,但是,能省就省嘛!最主要是,这么精准的流程控制,优雅永不过时~

4. 改造流程

  首先要明确的是:如果要做一个自动改造,它是怎么一个流程呢?拿一个期望改造出三条词缀的装备来说:

  • 白底装备,上蜕变,变成蓝底装备
  • 蓝底装备判断其词缀是否满足需求:
    • 满足两条就上富豪
    • 不满足还要判断:
      • 如果只有一条词缀且是你想要的,就上增幅
      • 否则就上改造
  • 如果富豪成了金底,判断第三条词缀是否是你想要的:
    • 如果是的话,恭喜你,做好了
    • 如果不是,则要重铸,再回到第一步

  还有各种需求,例如只需要两条词缀的,只需要一条词缀的,流程都不同,但是可以整合成一个通用的方法。这就是看你对流程控制的理解了。

再说说一些可以让你写好程序的点

  • 代码一定要规范,至少自己要看懂,还有未来的自己要看懂,否则修改的时候有你好果汁吃
  • 对重复用到的代码一定要封装成函数调用,一方面省去不少代码量,让程序看上去更简洁;一方面更容易让你理清思路,减少bug
  • 流程控制的时候,要学会推算,不会也没关系,试试vscode的debug吧,打上断点,一步步来,加油!