Skip to main content

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.pyscript.py。而gui.py会根据配置文件config.json来实例化不同的script,script就是某个具体的脚本过程。

4、脚本任务的组成

oas在设计任务有着严格的一套设计范式,具体的三大核心为用户选项控制设备过程元素。在这里做一个简要介绍:

用户选项表征用户对于该配置的自定义的设置,这些选项允许用户在特定情况下进行选择。这些选项可以以stringintfloat等等形式出现,供用户选择合适的选项来影响脚本的执行过程或或者用户配置。

控制设备指的是一种模拟游戏运行环境的工具,它可以模拟游戏中的各种设备和控制方式,以便进行脚本任务的实现。主要有四大功能,模拟器的控制、游戏的启动关闭、模拟器的截屏、模拟器的操作(如点击、滑动),通过控制设备,可以模拟用户的操作行为,这需要依赖前面提到的用户选项,当然你可以不用担心,oas 以及为此搭建了一个通用的操作。

过程元素是脚本任务中的关键流程元素,考虑这样的场景:在某个固定的坐标下需要识别每一个图片,或者是在某个范围下识别图片,手动输入坐标是一件极其低效的操作,如何高效稳定的配置这些脚本运行过程中所需要的参数,oas 建立了自身的一套assets管理系统,借助GUI的配置可以快速的生成任务所需的过程元素。

info

由于历史原因导致控制设备严重依赖用户选项

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 行。

不允许出现:

  • 使用中文或者是拼音