Preamble
这一部分是 oas 的开发文档,会讲述 oas 的框架和设计模式,介绍常用组件,带初来乍到的开发者熟悉项目。但是这里不会把每一个函数的功能都复读一遍,如果你希望了解具体某个函数是如何使用的,最好去翻阅源码。
1、应用场景
不同于其他一般的阴阳师脚本,oas 更倾向于全程接管阴阳师。市面上的阴阳师脚本通常是针对于某种大量重复的的任务,当然 oas 会有更多的选择来支持其多样化,oas 借鉴于 Alas 的设计思路将其设定为长期运行的一款自动化辅助工具,甚至是 7*24 运行而设计的。
oas 在设计之初放弃了对安卓真机的支持,同时也放弃了对除 1280x720 以外的分辨率的支持。
2、设计思路
多实例化:多开游戏或者游戏任务配置多开会极大提升游戏体验,为了支持这一个功能, oas 引入了
config
用户全部配置文件,由其来驱动每一个实例化脚本的执行。全程接管:oas 不认可需要繁琐的设置脚本的启动运行,只需一键即可运行
游戏通用:在参考Alas时发现其同碧蓝航线有很强的耦合性,于此设计该项目将减少同阴阳师的耦合,因此你可以fork该项目使用到你的游戏脚本上,我们约定属于
module
文件下的为通用的,而tasks
文件夹下的为同游戏强耦合的。
3、设计架构
- 部署方式:batchfile + python(env+pip) + git 。具体的说就是,需要先下载一个安装包里面包含一个最小python和git环境,运行后下拉仓库,完事后安装依赖,再完事后启动gui。
- GUI实现: 用的是这个库FluentUI for QML 。其同python语言通信主要依靠qt所提供的机制:上下文注入和类型注册
- 程序入口: 有两个根目录下的
gui.py
和script.py
。而gui.py
会根据配置文件config.json
来实例化不同的script,script就是某个具体的脚本过程。
4、脚本任务的组成
oas
在设计任务有着严格的一套设计范式,具体的三大核心为用户选项
、控制设备
和过程元素
。在这里做一个简要介绍:
用户选项表征用户对于该配置的自定义的设置,这些选项允许用户在特定情况下进行选择。这些选项可以以string
、int
、float
等等形式出现,供用户选择合适的选项来影响脚本的执行过程或或者用户配置。
控制设备指的是一种模拟游戏运行环境的工具,它可以模拟游戏中的各种设备和控制方式,以便进行脚本任务的实现。主要有四大功能,模拟器的控制、游戏的启动关闭、模拟器的截屏、模拟器的操作(如点击、滑动),通过控制设备,可以模拟用户的操作行为,这需要依赖前面提到的用户选项,当然你可以不用担心,oas 以及为此搭建了一个通用的操作。
过程元素是脚本任务中的关键流程元素,考虑这样的场景:在某个固定的坐标下需要识别每一个图片,或者是在某个范围下识别图片,手动输入坐标是一件极其低效的操作,如何高效稳定的配置这些脚本运行过程中所需要的参数,oas 建立了自身的一套assets管理系统,借助GUI的配置可以快速的生成任务所需的过程元素。
由于历史原因导致控制设备严重依赖用户选项
5、基本运作模式
在低级的脚本中,往往充斥着这样的代码:
click(XXXX)
sleep(2)
click(YYYY)
sleep(3)
这样的代码稳定性很差,如果游戏卡顿,或者脚本需要对低配设备优化,就得延长等待的间隔,最后等待变得越来越长。很多时候,脚本慢,并不是因为截图慢,语言运行慢,而是因为开发者写了大量的固定时长的等待。
针对快慢设备的兼容问题,oas 使用了这样的运作模式,也希望开发者使用它,以减少对 sleep()
的依赖。这种模式在高配电脑上可以运行得很快,在低配电脑上也有很好的兼容性,它可以在点击失败时自动重试,我们也不再需要关心点击的执行顺序。
while 1:
self.screenshot()
if self.appear_then_click(self.I_AREA_BOSS, threshold=0.6, interval=2):
continue
if self.appear_then_click(self.I_BATTLE_1, interval=1):
continue
if self.appear(self.I_FILTER, threshold=0.6):
break
这段代码非常通俗易懂,具体的说在某一个点击操作下判断是否出现某一个按钮并点击,如果出现了其他的当前界面所没有的按钮,则调出界面进入下一个环节。值得注意的是在阴阳师中并不会追求极致的快,这是因为大量的点击是不符合正常玩家的操作习惯的,很显然这些数据是异常的,我们更倾向给其设定一个interval
来防止这些频繁的操作。
6、处理死循环
在上面示例代码中,如果陷入死循环,oas 会抛出异常。
GameStuckError
无操作连续截图超过 1 分钟。战斗中和客户端启动中,将延长至 5 分钟。GameTooManyClickError
最后 15 次操作中,有一项操作 >= 12 次,或有两项操作都 >= 6 次。
这两个异常只会在最顶层捕获。捕获后,oas 会将 log 和最近截图保存在单独的文件夹,并处理其中可能会暴露用户身份的信息,包括混淆路径名称,遮挡游戏昵称等。处理完成后 oas 停止。
7、代码细节
使用Pycharm默认的注释模板,例如:
"""
Description of the function or method.
:param parameter_name: Description of the parameter.
:return: Description of the return value.
"""
你一般不需要在注释中说明输入输出的类型,这是因为我们强制要求使用类型注解。
尽量做到:
- 一个函数的注释占 1/3 ~ 1/2
- 一个函数不超过一个屏幕
- 一个 .py 文件不超过 500 行。
不允许出现:
- 使用中文或者是拼音