Compare commits

...

257 Commits

Author SHA1 Message Date
MistEO
75253107b6 fix.修复热更新资源错误的问题 2021-12-07 18:00:31 +08:00
MistEO
517a9e09ed feat.更新孤岛风云 复刻活动关卡数据 2021-12-07 17:07:02 +08:00
MistEO
5741bc17f1 Merge branch 'dev' 2021-12-07 00:24:24 +08:00
MistEO
09fc9a4622 chore.更新版本号v2.2.2 2021-12-07 00:17:23 +08:00
MistEO
8293343467 perf.优化下载相关功能 2021-12-07 00:16:57 +08:00
MistEO
dba4bf5dd4 fix.修复重新开始后缓存清不掉的问题 2021-12-06 22:21:18 +08:00
MistEO
ed1ec4c7f4 fix.修复一些有的没的小问题 2021-12-06 21:25:34 +08:00
MistEO
ef656e1c87 docs.fix typos 2021-12-06 19:18:39 +08:00
MistEO
f17bb4d814 docs.文档格式修改 2021-12-06 18:01:35 +08:00
MistEO
048dfd3f41 docs.更新标题级 2021-12-06 16:39:39 +08:00
MistEO
9efdc4d6f8 docs.更新README,更新版本号 2021-12-06 16:28:13 +08:00
MistEO
6ba9fc1f8d fix.简单修复设置界面导航栏定位错误问题 2021-12-06 00:30:29 +08:00
MistEO
b46cc97c71 Merge branch 'dev' 2021-12-06 00:01:43 +08:00
MistEO
d81d53bc15 fix.修复一些小错误 2021-12-05 23:51:20 +08:00
MistEO
d2763683e1 chore.更新版本号v2.2,更新readme 2021-12-05 23:42:44 +08:00
MistEO
2167896df8 feat.支持自定义连接地址、支持蓝叠HyperV配置解析 2021-12-05 23:36:28 +08:00
MistEO
7d0943e63c feat.可拖动列表支持保存顺序 2021-12-05 22:52:20 +08:00
MistEO
b2d24adf3e feat.将随机操作延迟的逻辑做到了全局 2021-12-05 22:22:59 +08:00
MistEO
12a934c9b6 feat.无人机支持自定义产品 2021-12-05 22:13:26 +08:00
MistEO
d2841cb617 fix.尝试修复滑不到头的问题 2021-12-05 18:59:02 +08:00
MistEO
607c13a9c4 fix.修复有见习任务时,日常奖励不领取的问题 2021-12-05 03:34:36 +08:00
MistEO
775ed9318e feat.更新了更新功能(? 2021-12-05 03:14:44 +08:00
MistEO
8926bfa381 chore.一些小修改,更新版本号 2021-12-04 18:07:35 +08:00
MistEO
63f6664338 feat.宿舍自动把人填满 2021-12-04 17:36:42 +08:00
MistEO
1cef359777 refactor.改了下Status的数据类型 2021-12-04 17:36:30 +08:00
MistEO
8d99793318 fix.修复控制中枢选不满人的问题 2021-12-04 13:48:08 +08:00
MistEO
ff1310c6fb docs.更新截图 2021-12-04 03:43:53 +08:00
MistEO
2482fd8a7d chore.更新版本号,更新README 2021-12-04 03:41:26 +08:00
MistEO
613fea3490 feat.尝试支持信用商店关闭弹窗 2021-12-04 03:20:27 +08:00
MistEO
d2bee539eb feat.新增基建对搓玉的识别和换班支持 2021-12-04 03:12:49 +08:00
MistEO
64632fe7fa feat.完成控制中枢换班(精简版) 2021-12-04 02:35:19 +08:00
MistEO
e4facf492e feat.优化公招界面和提示 2021-12-04 00:01:49 +08:00
MistEO
9ad7f29846 refactor.重构公招任务 2021-12-03 23:10:20 +08:00
MistEO
f6e2856696 fix.修复自动公招识别错误时的处理 2021-12-03 11:23:33 +08:00
MistEO
3bac39320a feat.完成界面重构 2021-12-03 01:32:10 +08:00
MistEO
26d61a2a22 feat.增加自动公招选项,自动公招任务优化 2021-12-02 22:35:03 +08:00
MistEO
5f23fd9534 fix.调整自动招募相关阈值 2021-12-02 11:36:39 +08:00
MistEO
6128f5cd89 fix.修复基建的一些小问题 2021-12-02 01:34:39 +08:00
MistEO
364914891a fix.分离公招识别任务和自动公招任务 2021-12-02 01:15:53 +08:00
MistEO
ad9dacc497 feat.界面新增自动公招功能 2021-12-02 01:01:42 +08:00
MistEO
5e33d1ac3a feat.完成自动公招流程的接口 2021-12-02 00:52:09 +08:00
MistEO
781bef0664 fix.修复周常任务不领取的问题 2021-12-01 13:10:28 +08:00
MistEO
d19ca7d7d8 fix.修复同一任务链日志刷屏的问题 2021-12-01 01:39:33 +08:00
MistEO
d8f13329fc perf.部分任务的小优化 2021-12-01 01:32:34 +08:00
MistEO
cba668c147 feat.基建支持先换班,后进宿舍 2021-12-01 01:26:39 +08:00
MistEO
bd0732975b feat.完成自动关机功能 2021-12-01 00:34:12 +08:00
MistEO
5b8258f2d9 feat.任务开始后,停用Settings界面 2021-12-01 00:29:46 +08:00
MistEO
8ac9ba0cbd feat.新增支持自定义企鹅物流汇报ID 2021-12-01 00:19:08 +08:00
MistEO
3f6f01f319 refactor.完成主界面的重构 2021-11-30 23:32:21 +08:00
MistEO
5b3d387fea refactor.完成主界面的重构,接口大幅调整,修复部分乱七八糟的bug 2021-11-30 01:00:21 +08:00
MistEO
12540841ca feat.对配置文件增加一些检查 2021-11-28 04:11:15 +08:00
MistEO
d4864220c1 perf.大幅优化CPU占用(bushi 2021-11-28 04:11:15 +08:00
MistEO
9f9a501be9 perf.对全部流程任务做ROI处理 2021-11-28 04:11:14 +08:00
MistEO
8340f1c903 perf.对基建全部流程任务做ROI处理 2021-11-28 04:11:02 +08:00
MistEO
3a01fe5c4f refactor.完成ProcessTask中运行次数相关的重构,废弃SetParam接口 2021-11-27 21:41:56 +08:00
MistEO
c70b7745ad perf.优化部分任务性能 2021-11-26 23:58:59 +08:00
MistEO
f2edc5354d refactor.整理Task部分接口 2021-11-26 17:00:34 +08:00
MistEO
640659e40f refactor.解耦TaskData 2021-11-26 16:10:50 +08:00
MistEO
999888bc02 refactor.重构任务队列 2021-11-26 01:09:48 +08:00
MistEO
6e04a670a6 Merge branch 'dev' 2021-11-25 22:37:48 +08:00
MistEO
dcd9e5b8dc Merge branch 'master' of https://github.com/MistEO/MeoAssistance-Arknights 2021-11-25 22:37:43 +08:00
MistEO
04bd6b726b fix.修复偶现收完信用点后不购物的问题 2021-11-25 11:04:51 +08:00
MistEO
f501e6d8d5 fix.修复周常任务偶尔不领取的问题 2021-11-24 13:47:38 +08:00
MistEO
5c0b2e41ee fix.修复信用商店没有要买的东西的时候会卡住的问题 2021-11-23 23:14:59 +08:00
MistEO
3eaaf2ff99 fix.修复领取日常奖励的界面有时候关不掉的问题 2021-11-23 22:40:06 +08:00
MistEO
86938e4afe feat.优化激进模式中,对单干员设施的操作逻辑 2021-11-23 22:34:26 +08:00
MistEO
77c1481d7c feat.添加对不满级制造、贸易站换班干员计算的支持 2021-11-23 22:16:27 +08:00
MistEO
380e0ad241 Merge branch 'master' of https://github.com/Jie-Qiao/MeoAssistance-Arknights into dev 2021-11-23 22:03:01 +08:00
MistEO
7183676d60 fix.修复不吃理智药后卡住的问题 2021-11-23 13:56:16 +08:00
MistEO
dd604a4103 Merge branch 'master' into dev 2021-11-23 13:53:16 +08:00
Jie-Qiao
bb4ce31277 解决低等级制造站与贸易站的识别问题 2021-11-23 12:14:54 +08:00
MistEO
97619d269f fix.修复任务全部完成的回调 2021-11-23 01:26:18 +08:00
MistEO
35ad87ad1a fix.修复理智任务不点返回按钮的问题 2021-11-23 01:19:46 +08:00
MistEO
80669906be chore.改改文案 2021-11-23 00:40:37 +08:00
MistEO
11bb579012 feat.一键长草 2021-11-23 00:35:10 +08:00
MistEO
f806b4a090 refactor.解耦添加任务与开始任务 2021-11-22 23:17:00 +08:00
MistEO
bd590a9f54 chore.删除一个多余的接口 2021-11-22 21:44:12 +08:00
MistEO
d155a392da feat.新增领取日常任务奖励的processtask 2021-11-22 21:40:16 +08:00
MistEO
f02a680fe1 Merge pull request #43 from Jie-Qiao/master
解决低等级宿舍无法识别问题
2021-11-22 20:16:35 +08:00
MistEO
10c9fefe47 Merge branch 'Jie-Qiao-master' 2021-11-22 20:15:53 +08:00
Jie-Qiao
d0af8e0ebc 解决低等级宿舍无法识别问题 2021-11-22 12:35:21 +08:00
MistEO
c73d0b69a3 docs.更新README及截图 2021-11-21 01:29:59 +08:00
MistEO
a5f3038934 chore.更新版本号v1.3.6 2021-11-21 01:11:37 +08:00
MistEO
936bf74a5c feat.为干员识别添加错误检查 2021-11-21 01:10:16 +08:00
MistEO
b55648e590 fix.尝试修复会客室结束线索交流后不使用线索的问题 2021-11-21 00:54:36 +08:00
MistEO
29bc0f8e72 fix.修复选干员时可能出现的一个crash 2021-11-21 00:52:28 +08:00
MistEO
d46f58cc07 perf.优化掉基建一些不必要的滑动 2021-11-21 00:26:46 +08:00
MistEO
1cc4123fbc feat.添加部分基建容错机制 2021-11-21 00:14:25 +08:00
MistEO
8c9254c1fd fix.修复选择干员时容错机制失效的问题;修复办公室和发电站偶尔截图错误的问题 2021-11-18 23:17:22 +08:00
MistEO
1f3c408673 feat.支持处理基建会客室线索交流结束的提示 2021-11-18 23:17:01 +08:00
MistEO
1b1233e0df perf.优化会客室处理速度,减少不必要的截图次数 2021-11-18 23:16:40 +08:00
MistEO
9beef3a676 fix.修复电站和宿舍数量不足时卡住的问题 2021-11-18 21:49:38 +08:00
MistEO
6c586eb81e chore.整理了一下debug接口 2021-11-18 21:01:32 +08:00
MistEO
b73c3ce5d1 fix.修复基建不进入干员选择页面的bug 2021-11-18 20:34:32 +08:00
MistEO
7f7eeb494d fix.修复上传企鹅物流的错误 2021-11-16 23:53:04 +08:00
MistEO
e549e1ee0b perf.优化识别逻辑 2021-11-16 23:52:28 +08:00
MistEO
050e9b0374 refactor.重构基建技能相关结构,调整干员hash算法 2021-11-16 01:02:20 +08:00
MistEO
adb6cb857c refactor.重构基建类 2021-11-15 00:30:20 +08:00
MistEO
810ffaa621 chore.添加日志打印 2021-11-14 03:19:42 +08:00
MistEO
59682a962c perf.优化hash阈值的读取方式 2021-11-14 03:14:54 +08:00
MistEO
25fa9b433b fix.修复宿舍计算hash崩溃的问题 2021-11-14 03:02:26 +08:00
MistEO
abaa4f6981 fix.再次修复组合的正则效率,计算不正确的问题 2021-11-14 02:51:00 +08:00
MistEO
9434484680 chore.更新版本号v1.3.3 2021-11-14 02:05:19 +08:00
MistEO
57f64c1370 feat.新增干员名hash识别,现在水月组可以正确的识别标准化技能了 2021-11-14 02:04:48 +08:00
MistEO
52ccd87c47 perf.更新干员hash计算方式为干员名hash 2021-11-14 00:42:35 +08:00
MistEO
9174aedb1e perf.优化一些ImageAnalyzer的调用方式(并没有什么用 2021-11-13 22:52:19 +08:00
MistEO
c8143501c1 Merge branch 'dev' of https://github.com/MistEO/MeoAssistance-Arknights into dev 2021-11-13 22:14:58 +08:00
MistEO
3c16fccca9 feat.进一步的异形屏流程任务适配,修复一些bug 2021-11-13 22:14:34 +08:00
MistEO
c79124f7c4 fix.再次修复贸易站无人机使用不完的问题 2021-11-12 10:53:20 +08:00
MistEO
d434d423e3 feat.优化对非16:9屏幕的支持 2021-11-11 23:31:13 +08:00
MistEO
f66c1e1c59 style.修改json为utf-8 2021-11-11 22:24:22 +08:00
MistEO
3b03f50a4a Merge branch 'master' of https://github.com/MistEO/MeoAssistance-Arknights 2021-11-11 22:18:40 +08:00
MistEO
0ca13ae16a fix.修复帕斯拉技能识别错误的问题 2021-11-11 22:17:41 +08:00
MistEO
ae020bda5d Merge branch 'dev' 2021-11-11 22:05:46 +08:00
MistEO
9cf5c351f3 chore.更新版本号 2021-11-11 22:05:29 +08:00
MistEO
574ec830a0 fix.修复贸易站无人机用不完的问题 2021-11-11 22:04:59 +08:00
MistEO
6e8e5e80d2 fix.修复清流效率计算错误的问题 2021-11-11 21:42:04 +08:00
MistEO
27c228e355 fix.修复两电站时的效率计算错误 2021-11-11 20:41:28 +08:00
MistEO
273c2b19ad fix.修复温和模式不清除原有干员的问题 2021-11-11 20:32:47 +08:00
MistEO
29d14f5a7b docs.Update README 2021-11-11 02:15:41 +08:00
MistEO
94cccfe424 docs.更新README 2021-11-11 01:18:27 +08:00
MistEO
ad1704df0d feat.更新基建界面 2021-11-11 00:39:34 +08:00
MistEO
bf6d929e80 feat.新增基建界面提示 2021-11-11 00:13:09 +08:00
MistEO
67036398bd fix.修复adb连接问题,优先连接addresses字段中的地址 2021-11-10 22:23:34 +08:00
MistEO
4a8c20c604 style.格式化所有json文件 2021-11-09 22:18:21 +08:00
MistEO
b6c6d46362 Revert "chore.升级项目配置至VS2022",由于appveyor不支持v143,暂时先回退了
This reverts commit 6bbc2c5615.
2021-11-09 22:12:06 +08:00
MistEO
c36c2c74ff fix.修复工具编译不过去的问题 2021-11-09 22:04:44 +08:00
MistEO
ed9e017ebb style.代码风格统一格式化 2021-11-09 22:04:03 +08:00
MistEO
762f701593 chore.更新editorconfig 2021-11-09 22:03:50 +08:00
Liam Sho
254f34a50d feat.添加 EditorConfig 和 ClangFormat 用于 C++ 项目
Visual Studio 对 C++ 项目的代码格式化支持好像不是特别的好,因此可能还是会有点问题
2021-11-09 21:30:19 +08:00
Liam Sho
9f5564522d feat.添加 EditorConfig 用于 C# 项目 2021-11-09 21:29:54 +08:00
MistEO
6bbc2c5615 chore.升级项目配置至VS2022 2021-11-09 21:14:19 +08:00
MistEO
34c50898d5 perf.优化ADB端口识别 2021-11-09 01:40:26 +08:00
MistEO
736244162c chore.暂时屏蔽偏激模式,修改版本号 2021-11-08 22:37:53 +08:00
MistEO
dbec3ae7ed feat.完成基建激进换班模式 2021-11-08 22:24:16 +08:00
MistEO
1395ec46b6 feat.打通基建工作模式设置相关接口 2021-11-08 21:09:59 +08:00
MistEO
27fc4a6bf6 chore.Update LICENSE 2021-11-07 23:46:24 +08:00
MistEO
33f7e677d7 chore.修改版本号,更新截图的脚本 2021-11-07 23:31:54 +08:00
MistEO
716d1971c9 Merge branch 'dev' 2021-11-07 23:30:32 +08:00
MistEO
bbaf8cdf80 fix.修复会客室线索空位识别问题 2021-11-05 20:55:34 +08:00
MistEO
09cb5b271a perf.添加一些日志,优化部分简单逻辑 2021-11-05 00:31:48 +08:00
MistEO
7f1eff2188 chore.完成自动打包脚本 2021-11-04 23:34:25 +08:00
MistEO
70a1428fa3 perf.优化基建停止按钮的响应速度 2021-11-04 22:43:35 +08:00
MistEO
0dd6524da9 chore.更新版本号v1.3-alpha7 2021-11-04 00:45:05 +08:00
MistEO
92c53f4a8b fix.帮雷电模拟器修复截图错误的bug 2021-11-04 00:44:36 +08:00
MistEO
51f51f4d3b fix.修复基建已选择干员的识别错误 2021-11-04 00:28:52 +08:00
MistEO
5722ca6191 perf.优化开启线索交流后的操作逻辑 2021-11-04 00:20:02 +08:00
MistEO
08d80e34b0 perf.优化已选择干员的识别算法,改用hsv计算蓝色像素点数量 2021-11-04 00:09:28 +08:00
MistEO
99f837ad7b fix.修复雷电、夜神模拟器连接问题 2021-11-03 22:30:57 +08:00
MistEO
35de8f5796 Merge branch 'dev' 2021-11-03 21:46:00 +08:00
MistEO
805b7d9d78 chore.删除一些错误添加到项目中的问题 2021-11-03 21:45:09 +08:00
MistEO
96f0d45680 Merge branch 'dev' 2021-11-03 10:06:27 +08:00
MistEO
32bfed1826 docs.更新招募广告( 2021-11-03 10:05:42 +08:00
MistEO
5b12678dcd chore.删除一些错误添加到项目中的问题 2021-11-03 10:04:06 +08:00
MistEO
7aec6eb49c chore.更新版本号 2021-11-02 23:44:59 +08:00
MistEO
c3fb83b241 fix.修复会客室线索空位识别不正确的问题 2021-11-02 23:13:00 +08:00
MistEO
808ae2307b fix.修复滑动延时错误的问题 2021-11-02 22:15:58 +08:00
MistEO
1bbc1b41cb chore.更新关卡掉落数据,更新版本号 2021-11-02 21:41:39 +08:00
MistEO
908cd9fe72 chore.更新关卡掉落数据,更新版本号 2021-11-02 15:23:11 +08:00
MistEO
7e935aaaea chore.更新关卡掉落数据,更新版本号 2021-11-02 15:21:30 +08:00
MistEO
c334b323aa fix.尝试修复贸易站无人机用不完的问题 2021-11-02 10:52:10 +08:00
MistEO
08230c2731 fix.修复发电站进不去的问题 2021-11-02 10:51:54 +08:00
MistEO
8d30393596 fix.修复滑动过程中乱选人的问题 2021-11-02 10:51:37 +08:00
MistEO
ab62f28a15 docs.基建换班模式,画饼(bushi 2021-11-02 00:10:20 +08:00
MistEO
7df3cdc8c8 perf.为滑动选择干员增加容错操作 2021-11-01 23:30:41 +08:00
MistEO
929a8fb1e1 feat.换班界面新增每个设施的开关 2021-11-01 22:49:58 +08:00
MistEO
ff91fc1d70 fix.修复公招关闭设置时间不生效的问题 2021-11-01 22:14:11 +08:00
MistEO
d6d0af43b4 chore.更新公招资源,更新版本号 2021-11-01 19:04:36 +08:00
MistEO
909d123f8f chore.更新公招资源,更新版本号 2021-11-01 18:44:13 +08:00
MistEO
10283bf72a chore.更新企鹅物流关卡json,11月1日活动 2021-11-01 16:24:11 +08:00
MistEO
c8a2fe3099 chore.更新企鹅物流关卡json,11月1日活动 2021-11-01 16:01:54 +08:00
MistEO
5c75fc169f chore.更新版本号 2021-10-31 22:43:40 +08:00
MistEO
b7280bec75 feat.完成会客室换班 2021-10-31 22:41:19 +08:00
MistEO
afd79f7b53 feat.增加对会客室线索空位的识别 2021-10-31 19:40:53 +08:00
MistEO
77bad6da38 fix.修复宿舍的小bug 2021-10-31 03:33:07 +08:00
MistEO
376b9f1c94 chore.更新版本号v1.3-alpha.3 2021-10-31 03:04:47 +08:00
MistEO
7983614e9d feat.界面增加了一些报错提示 2021-10-31 03:04:02 +08:00
MistEO
a24bbfe9d5 fix.再次修复adb滑动bug,改成往回滑额外距离 2021-10-31 03:01:29 +08:00
MistEO
19d0c1b311 feat.完成对效率正则和基建组合条件的计算 2021-10-31 02:31:44 +08:00
MistEO
cad1876656 fix.修复基建点击确认按钮后,网络不佳导致的识别错误 2021-10-30 22:39:51 +08:00
MistEO
035554c21d Merge branch 'dev' 2021-10-30 16:36:29 +08:00
MistEO
f7cab0f982 Merge branch 'dev' of https://github.com/MistEO/MeoAssistance-Arknights into dev 2021-10-30 13:53:33 +08:00
MistEO
157c600e14 fix.修复制造/贸易站偶尔不进干员页的问题,修复无人机不使用的问题 2021-10-30 13:48:50 +08:00
MistEO
dad58d45cb docs.修正笔误 2021-10-30 03:12:57 +08:00
MistEO
72907a09ca chore.暂时删除雷电模拟器的补丁,准备重构adb连接逻辑 2021-10-30 02:11:27 +08:00
MistEO
3d013fcd7a docs.更新README基建部分介绍 2021-10-30 02:07:53 +08:00
MistEO
f005f479fc Merge branch 'master' into dev 2021-10-30 01:56:49 +08:00
MistEO
2b08fb791f feat.基建界面新增按钮,并修改对应接口 2021-10-30 01:47:18 +08:00
MistEO
41731d8ddd fix.尝试修复识别“干员被选择”时偶现的崩溃问题 2021-10-29 21:52:19 +08:00
MistEO
23e905fd20 perf.增加一些对adb connect的检查 2021-10-29 17:42:35 +08:00
MistEO
0a4bd19887 fix.修复进驻信息按钮识别错误的问题,改用OCR识别 2021-10-29 17:04:02 +08:00
MistEO
15d92a68b5 chore.删除错误添加的临时文件 2021-10-28 23:36:41 +08:00
MistEO
8c59b5b735 merge.合并基建换班GUI,修改部分界面 2021-10-28 23:36:23 +08:00
MistEO
467091d1d3 fix.修复一些滑动的bug 2021-10-28 23:03:41 +08:00
MistEO
d35cbfa8e3 feat.完成办公室换班流程 2021-10-28 22:38:15 +08:00
MistEO
fdfedab771 fix.修复发电站把已有干员又换下来了的问题 2021-10-28 22:04:40 +08:00
MistEO
6511aaaed8 fix.尝试修复生产设施中,最优干员被选中后又被取消选中的问题 2021-10-28 21:55:13 +08:00
MistEO
a954f77529 perf.优化部分识别roi位置 2021-10-28 21:22:50 +08:00
MistEO
69cf05b867 fix.修复宿舍工作状态识别错误的问题 2021-10-28 15:06:28 +08:00
MistEO
327c5b5f81 chore.更新版本号v1.3-a 2021-10-28 01:10:08 +08:00
MistEO
1f2b659abf fix.修复发电站不返回,以及无人机的小bug 2021-10-28 01:05:02 +08:00
MistEO
83da170697 feat.完成发电站换班逻辑 2021-10-28 01:00:33 +08:00
MistEO
c36e97c44a perf.优化宿舍换班流程,优化生产设施识别逻辑 2021-10-27 23:43:36 +08:00
MistEO
d24ddd8278 fix.修复基建宿舍进入干员页的识别错误 2021-10-27 19:06:48 +08:00
MistEO
5b88461c5f fix.修复adb滑动的问题,修复贸易站tab识别问题 2021-10-26 01:07:56 +08:00
MistEO
f7f8a59ca9 feat.完成制造站换班任务 2021-10-24 23:10:08 +08:00
MistEO
ba88b0a3ac fix.修复进驻宿舍任务的一些配置问题 2021-10-24 20:45:01 +08:00
MistEO
40ed5ade5d feat.初步完成宿舍进驻逻辑。重构部分任务 2021-10-24 02:04:21 +08:00
MistEO
5fdbb6a49a feat.完成基建设施的识别 2021-10-23 22:42:51 +08:00
MistEO
d69626aace fix.尝试修复界面启动时崩溃的问题 2021-10-23 18:51:30 +08:00
MistEO
172d68a041 docs.更新REAMDE中优势相关内容 2021-10-23 02:06:50 +08:00
MistEO
bfe5ff242b feat.完成心情进度条的识别 2021-10-22 23:22:11 +08:00
MistEO
56a11a245d fix.降低滑动速度,临时规避掉adb的滑动bug 2021-10-22 20:54:57 +08:00
MistEO
7389d27bc3 fix.修复一处技能识别错误 2021-10-22 17:26:38 +08:00
MistEO
db1f660c9b feat.更新贸易站技能配置,调整部分阈值 2021-10-22 17:23:19 +08:00
MistEO
5b6aa2abb6 fix.修复模拟器路径不保存问题;临时修复雷电连接方式;添加一些日志 2021-10-22 00:50:26 +08:00
MistEO
d4241deab2 feat.完成基建单制造站换班逻辑 2021-10-22 00:27:43 +08:00
MistEO
bc0ce24572 fix.修复基建技能识别问题,添加一些日志 2021-10-21 19:12:02 +08:00
MistEO
008e977f70 chore.添加CatchFake调试接口,添加一些日志打印 2021-10-21 19:11:25 +08:00
MistEO
9fe4d8d6d0 feat.完成基建最优解计算策略 2021-10-21 01:13:26 +08:00
MistEO
ab4c6e23cc feat.初步完成基建干员配置,及资源管理 2021-10-20 21:40:32 +08:00
MistEO
3a692186b9 chore.添加基建贸易站技能图片、配置文件字段 2021-10-20 21:39:33 +08:00
MistEO
61ec484634 docs.README排版更新 2021-10-20 20:54:12 +08:00
MistEO
98398fa7dd Merge branch 'master' of https://github.com/MistEO/MeoAssistance-Arknights 2021-10-20 17:49:21 +08:00
MistEO
c830b7b8ec docs.更新README 2021-10-20 17:48:54 +08:00
MistEO
3ae9f6e279 chore.更新v1.2-beta.2版本号 2021-10-20 00:59:33 +08:00
MistEO
7f9d9083d5 Merge pull request #24 from EricSolshkov/master
a missing "=" expression added.
2021-10-19 23:43:27 +08:00
EricPu
1a54b55e79 a missing "=" expression added. 2021-10-19 23:41:10 +08:00
MistEO
d0221e2650 Merge pull request #23 from EricSolshkov/master
fix. Leidian Connection Problem Patch
2021-10-19 21:11:23 +08:00
EricPu
a5a1851411 Leidian Connection Problem Patch 2021-10-19 20:55:41 +08:00
MistEO
450df4a0d3 fix.修复偶现界面启动时崩溃的问题 2021-10-19 19:03:38 +08:00
MistEO
e0ca599855 fix.修复流程任务,OCR已出现区域会无限增长的问题 2021-10-18 12:49:24 +08:00
MistEO
51517f6ef7 fix.修复流程任务,OCR已出现区域会无限增长的问题 2021-10-18 12:46:52 +08:00
MistEO
e30b505a23 fix.修复图片转换工具编译错误的问题 2021-10-18 12:39:46 +08:00
MistEO
20c0cab1e4 feat.新增基建干员技能hash计算,保证干员唯一性(目前是计算立绘人脸) 2021-10-18 12:39:07 +08:00
MistEO
a6c91898da fix.修复基建同类技能识别不准确的问题(例如标准化b识别成了标准化a) 2021-10-17 21:19:25 +08:00
MistEO
73559816c3 fix.修复一些编译warning 2021-10-17 04:27:43 +08:00
MistEO
04c1d90a51 fix.修复一些智能指针的不当使用 2021-10-17 04:15:22 +08:00
MistEO
a20542bf15 fix.修复信用商店延时错误的问题 2021-10-17 03:11:38 +08:00
MistEO
f255556cca fix.修复信用商店延时错误的问题 2021-10-17 03:11:02 +08:00
MistEO
d2013626a1 fix.修复模板匹配ROI不生效的问题 2021-10-17 02:14:58 +08:00
MistEO
fa7650f70d feat.初步完成基建技能目标识别 2021-10-17 02:10:35 +08:00
MistEO
6c5202e1a0 feat.完成基建制造站配置及资源 2021-10-16 23:49:21 +08:00
MistEO
f79c97ea89 docs.更新README 2021-10-16 22:14:39 +08:00
MistEO
bd6f771eca feat.完成基建技能目标检测 2021-10-16 21:42:33 +08:00
MistEO
b36bde547a feat.完成基建干员笑脸识别 2021-10-16 00:45:25 +08:00
MistEO
27b84b93b9 feat.新增maskRange字段,修复一些bug 2021-10-16 00:44:20 +08:00
MistEO
de3928523f chore.更新企鹅数据相关配置字段 2021-10-15 22:36:06 +08:00
MistEO
c85448f0a8 fix.修复返回局部变量引用的问题 2021-10-15 22:06:26 +08:00
MistEO
3a25c0a9bf Merge branch 'master' into dev 2021-10-15 20:10:46 +08:00
MistEO
5dc98667f4 chore.更新企鹅物流关卡JSON,更新雷电的连接方式 2021-10-15 17:39:02 +08:00
MistEO
998d8fe8bc Merge pull request #22 from EricSolshkov/master
fix.改进了雷电模拟器的adb命令使得单开情况下兼容性提高。
2021-10-13 19:58:13 +08:00
EricPu
eb498150fb 改进了雷电模拟器的adb命令使得单开情况下兼容性提高。 2021-10-13 19:39:14 +08:00
MistEO
64f53a78cb docs.更新模拟器支持相关内容 2021-10-08 15:03:29 +08:00
MistEO
d015af3a92 fix.开始行动按钮改用ocr识别,修复[issues#20](https://github.com/MistEO/MeoAssistance-Arknights/issues/20) 2021-10-07 19:33:29 +08:00
yh
d3f076616d add基建页面 2021-09-14 20:15:26 +08:00
tcyh035
7f49045c5a Merge pull request #1 from MistEO/master
update
2021-09-12 20:16:43 +08:00
371 changed files with 57330 additions and 44803 deletions

4
.gitignore vendored
View File

@@ -427,4 +427,6 @@ FodyWeavers.xsd
*.sln.iml
screen.png
adb_screen.png
adb_screen.png
tools/*.png
resource/infrast

BIN
3rdparty/bin/aria2c.exe vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,462 @@
///
/// @file calculator.hpp
/// @brief calculator::eval(const std::string&) evaluates an integer
/// arithmetic expression and returns the result. If an error
/// occurs a calculator::error exception is thrown.
/// <https://github.com/kimwalisch/calculator>
/// @author Kim Walisch, <kim.walisch@gmail.com>
/// @copyright Copyright (C) 2013-2018 Kim Walisch
/// @license BSD 2-Clause, https://opensource.org/licenses/BSD-2-Clause
/// @version 1.4
///
/// == Supported operators ==
///
/// OPERATOR NAME ASSOCIATIVITY PRECEDENCE
///
/// | Bitwise Inclusive OR Left 4
/// ^ Bitwise Exclusive OR Left 5
/// & Bitwise AND Left 6
/// << Shift Left Left 9
/// >> Shift Right Left 9
/// + Addition Left 10
/// - Subtraction Left 10
/// * Multiplication Left 20
/// / Division Left 20
/// % Modulo Left 20
/// ** Raise to power Right 30
/// e, E Scientific notation Right 40
/// ~ Unary complement Left 99
///
/// The operator precedence has been set according to (uses the C and
/// C++ operator precedence): https://en.wikipedia.org/wiki/Order_of_operations
/// Operators with higher precedence are evaluated before operators
/// with relatively lower precedence. Unary operators are set to have
/// the highest precedence, this is not strictly correct for the power
/// operator e.g. "-3**2" = 9 but a lot of software tools (Bash shell,
/// Microsoft Excel, GNU bc, ...) use the same convention.
///
/// == Examples of valid expressions ==
///
/// "65536 >> 15" = 2
/// "2**16" = 65536
/// "(0 + 0xDf234 - 1000)*3/2%999" = 828
/// "-(2**2**2**2)" = -65536
/// "(0 + ~(0xDF234 & 1000) *3) /-2" = 817
/// "(2**16) + (1 << 16) >> 0X5" = 4096
/// "5*-(2**(9+7))/3+5*(1 & 0xFf123)" = -109221
///
/// == About the algorithm used ==
///
/// calculator::eval(std::string&) relies on the ExpressionParser
/// class which is a simple C++ operator precedence parser with infix
/// notation for integer arithmetic expressions.
/// ExpressionParser has its roots in a JavaScript parser published
/// at: http://stackoverflow.com/questions/28256/equation-expression-parser-with-precedence/114961#114961
/// The same author has also published an article about his operator
/// precedence algorithm at PerlMonks:
/// http://www.perlmonks.org/?node_id=554516
///
#ifndef CALCULATOR_HPP
#define CALCULATOR_HPP
#include <stdexcept>
#include <string>
#include <sstream>
#include <stack>
#include <cstddef>
#include <cctype>
namespace calculator
{
/// calculator::eval() throws a calculator::error if it fails
/// to evaluate the expression string.
///
class error : public std::runtime_error
{
public:
error(const std::string& expr, const std::string& message)
: std::runtime_error(message),
expr_(expr)
{ }
#if __cplusplus < 201103L
~error() throw() { }
#endif
std::string expression() const
{
return expr_;
}
private:
std::string expr_;
};
template <typename T>
class ExpressionParser
{
public:
/// Evaluate an integer arithmetic expression and return its result.
/// @throw error if parsing fails.
///
T eval(const std::string& expr)
{
T result = 0;
index_ = 0;
expr_ = expr;
try
{
result = parseExpr();
if (!isEnd())
unexpected();
}
catch (const calculator::error&)
{
while(!stack_.empty())
stack_.pop();
throw;
}
return result;
}
/// Get the integer value of a character.
T eval(char c)
{
std::string expr(1, c);
return eval(expr);
}
private:
enum
{
OPERATOR_NULL,
OPERATOR_BITWISE_OR, /// |
OPERATOR_BITWISE_XOR, /// ^
OPERATOR_BITWISE_AND, /// &
OPERATOR_BITWISE_SHL, /// <<
OPERATOR_BITWISE_SHR, /// >>
OPERATOR_ADDITION, /// +
OPERATOR_SUBTRACTION, /// -
OPERATOR_MULTIPLICATION, /// *
OPERATOR_DIVISION, /// /
OPERATOR_MODULO, /// %
OPERATOR_POWER, /// **
OPERATOR_EXPONENT /// e, E
};
struct Operator
{
/// Operator, one of the OPERATOR_* enum definitions
int op;
int precedence;
/// 'L' = left or 'R' = right
int associativity;
Operator(int opr, int prec, int assoc) :
op(opr),
precedence(prec),
associativity(assoc)
{ }
};
struct OperatorValue
{
Operator op;
T value;
OperatorValue(const Operator& opr, T val) :
op(opr),
value(val)
{ }
int getPrecedence() const
{
return op.precedence;
}
bool isNull() const
{
return op.op == OPERATOR_NULL;
}
};
/// Expression string
std::string expr_;
/// Current expression index, incremented whilst parsing
std::size_t index_;
/// The current operator and its left value
/// are pushed onto the stack if the operator on
/// top of the stack has lower precedence.
std::stack<OperatorValue> stack_;
/// Exponentiation by squaring, x^n.
static T pow(T x, T n)
{
T res = 1;
while (n > 0)
{
if (n % 2 != 0)
{
res *= x;
n -= 1;
}
n /= 2;
if (n > 0)
x *= x;
}
return res;
}
T checkZero(T value) const
{
if (value == 0)
{
std::string divOperators("/%");
std::size_t division = expr_.find_last_of(divOperators, index_ - 2);
std::ostringstream msg;
msg << "Parser error: division by 0";
if (division != std::string::npos)
msg << " (error token is \""
<< expr_.substr(division, expr_.size() - division)
<< "\")";
throw calculator::error(expr_, msg.str());
}
return value;
}
T calculate(T v1, T v2, const Operator& op) const
{
switch (op.op)
{
case OPERATOR_BITWISE_OR: return v1 | v2;
case OPERATOR_BITWISE_XOR: return v1 ^ v2;
case OPERATOR_BITWISE_AND: return v1 & v2;
case OPERATOR_BITWISE_SHL: return v1 << v2;
case OPERATOR_BITWISE_SHR: return v1 >> v2;
case OPERATOR_ADDITION: return v1 + v2;
case OPERATOR_SUBTRACTION: return v1 - v2;
case OPERATOR_MULTIPLICATION: return v1 * v2;
case OPERATOR_DIVISION: return v1 / checkZero(v2);
case OPERATOR_MODULO: return v1 % checkZero(v2);
case OPERATOR_POWER: return pow(v1, v2);
case OPERATOR_EXPONENT: return v1 * pow(10, v2);
default: return 0;
}
}
bool isEnd() const
{
return index_ >= expr_.size();
}
/// Returns the character at the current expression index or
/// 0 if the end of the expression is reached.
///
char getCharacter() const
{
if (!isEnd())
return expr_[index_];
return 0;
}
/// Parse str at the current expression index.
/// @throw error if parsing fails.
///
void expect(const std::string& str)
{
if (expr_.compare(index_, str.size(), str) != 0)
unexpected();
index_ += str.size();
}
void unexpected() const
{
std::ostringstream msg;
msg << "Syntax error: unexpected token \""
<< expr_.substr(index_, expr_.size() - index_)
<< "\" at index "
<< index_;
throw calculator::error(expr_, msg.str());
}
/// Eat all white space characters at the
/// current expression index.
///
void eatSpaces()
{
while (std::isspace(getCharacter()) != 0)
index_++;
}
/// Parse a binary operator at the current expression index.
/// @return Operator with precedence and associativity.
///
Operator parseOp()
{
eatSpaces();
switch (getCharacter())
{
case '|': index_++; return Operator(OPERATOR_BITWISE_OR, 4, 'L');
case '^': index_++; return Operator(OPERATOR_BITWISE_XOR, 5, 'L');
case '&': index_++; return Operator(OPERATOR_BITWISE_AND, 6, 'L');
case '<': expect("<<"); return Operator(OPERATOR_BITWISE_SHL, 9, 'L');
case '>': expect(">>"); return Operator(OPERATOR_BITWISE_SHR, 9, 'L');
case '+': index_++; return Operator(OPERATOR_ADDITION, 10, 'L');
case '-': index_++; return Operator(OPERATOR_SUBTRACTION, 10, 'L');
case '/': index_++; return Operator(OPERATOR_DIVISION, 20, 'L');
case '%': index_++; return Operator(OPERATOR_MODULO, 20, 'L');
case '*': index_++; if (getCharacter() != '*')
return Operator(OPERATOR_MULTIPLICATION, 20, 'L');
index_++; return Operator(OPERATOR_POWER, 30, 'R');
case 'e': index_++; return Operator(OPERATOR_EXPONENT, 40, 'R');
case 'E': index_++; return Operator(OPERATOR_EXPONENT, 40, 'R');
default : return Operator(OPERATOR_NULL, 0, 'L');
}
}
static T toInteger(char c)
{
if (c >= '0' && c <= '9') return c -'0';
if (c >= 'a' && c <= 'f') return c -'a' + 0xa;
if (c >= 'A' && c <= 'F') return c -'A' + 0xa;
T noDigit = 0xf + 1;
return noDigit;
}
T getInteger() const
{
return toInteger(getCharacter());
}
T parseDecimal()
{
T value = 0;
for (T d; (d = getInteger()) <= 9; index_++)
value = value * 10 + d;
return value;
}
T parseHex()
{
index_ = index_ + 2;
T value = 0;
for (T h; (h = getInteger()) <= 0xf; index_++)
value = value * 0x10 + h;
return value;
}
bool isHex() const
{
if (index_ + 2 < expr_.size())
{
char x = expr_[index_ + 1];
char h = expr_[index_ + 2];
return (std::tolower(x) == 'x' && toInteger(h) <= 0xf);
}
return false;
}
/// Parse an integer value at the current expression index.
/// The unary `+', `-' and `~' operators and opening
/// parentheses `(' cause recursion.
///
T parseValue()
{
T val = 0;
eatSpaces();
switch (getCharacter())
{
case '0': if (isHex())
val = parseHex();
else
val = parseDecimal();
break;
case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9':
val = parseDecimal();
break;
case '(': index_++;
val = parseExpr();
eatSpaces();
if (getCharacter() != ')')
{
if (!isEnd())
unexpected();
throw calculator::error(expr_, "Syntax error: `)' expected at end of expression");
}
index_++; break;
case '~': index_++; val = ~parseValue(); break;
case '+': index_++; val = parseValue(); break;
case '-': index_++; val = parseValue() * static_cast<T>(-1);
break;
default : if (!isEnd())
unexpected();
throw calculator::error(expr_, "Syntax error: value expected at end of expression");
}
return val;
}
/// Parse all operations of the current parenthesis
/// level and the levels above, when done
/// return the result (value).
///
T parseExpr()
{
stack_.push(OperatorValue(Operator(OPERATOR_NULL, 0, 'L'), 0));
// first parse value on the left
T value = parseValue();
while (!stack_.empty())
{
// parse an operator (+, -, *, ...)
Operator op(parseOp());
while (op.precedence < stack_.top().getPrecedence() || (
op.precedence == stack_.top().getPrecedence() &&
op.associativity == 'L'))
{
// end reached
if (stack_.top().isNull())
{
stack_.pop();
return value;
}
// do the calculation ("reduce"), producing a new value
value = calculate(stack_.top().value, value, stack_.top().op);
stack_.pop();
}
// store on stack_ and continue parsing ("shift")
stack_.push(OperatorValue(op, value));
// parse value on the right
value = parseValue();
}
return 0;
}
};
template <typename T>
inline T eval(const std::string& expression)
{
ExpressionParser<T> parser;
return parser.eval(expression);
}
template <typename T>
inline T eval(char c)
{
ExpressionParser<T> parser;
return parser.eval(c);
}
inline int eval(const std::string& expression)
{
return eval<int>(expression);
}
inline int eval(char c)
{
return eval<int>(c);
}
} // namespace calculator
#endif

View File

@@ -5,93 +5,93 @@
namespace json
{
static std::string unescape_string(std::string&& str)
{
std::string replace_str;
std::string escape_str = std::move(str);
static std::string unescape_string(std::string&& str)
{
std::string replace_str;
std::string escape_str = std::move(str);
for (size_t pos = 0; pos < escape_str.size(); ++pos)
{
switch (escape_str[pos]) {
case '\"':
replace_str = R"(\")";
break;
case '\\':
replace_str = R"(\\)";
break;
case '\b':
replace_str = R"(\b)";
break;
case '\f':
replace_str = R"(\f)";
break;
case '\n':
replace_str = R"(\n)";
break;
case '\r':
replace_str = R"(\r)";
break;
case '\t':
replace_str = R"(\t)";
break;
default:
continue;
break;
}
escape_str.replace(pos, 1, replace_str);
++pos;
}
return escape_str;
}
for (size_t pos = 0; pos < escape_str.size(); ++pos)
{
switch (escape_str[pos]) {
case '\"':
replace_str = R"(\")";
break;
case '\\':
replace_str = R"(\\)";
break;
case '\b':
replace_str = R"(\b)";
break;
case '\f':
replace_str = R"(\f)";
break;
case '\n':
replace_str = R"(\n)";
break;
case '\r':
replace_str = R"(\r)";
break;
case '\t':
replace_str = R"(\t)";
break;
default:
continue;
break;
}
escape_str.replace(pos, 1, replace_str);
++pos;
}
return escape_str;
}
static std::string unescape_string(const std::string& str)
{
return unescape_string(std::string(str));
}
static std::string unescape_string(const std::string& str)
{
return unescape_string(std::string(str));
}
static std::string escape_string(std::string&& str)
{
std::string escape_str = std::move(str);
static std::string escape_string(std::string&& str)
{
std::string escape_str = std::move(str);
for (size_t pos = 0; pos + 1 < escape_str.size(); ++pos)
{
if (escape_str[pos] != '\\') {
continue;
}
std::string replace_str;
switch (escape_str[pos+1]) {
case '"':
replace_str = "\"";
break;
case '\\':
replace_str = "\\";
break;
case 'b':
replace_str = "\b";
break;
case 'f':
replace_str = "\f";
break;
case 'n':
replace_str = "\n";
break;
case 'r':
replace_str = "\r";
break;
case 't':
replace_str = "\r";
break;
default:
return std::string();
break;
}
escape_str.replace(pos, 2, replace_str);
}
return escape_str;
}
for (size_t pos = 0; pos + 1 < escape_str.size(); ++pos)
{
if (escape_str[pos] != '\\') {
continue;
}
std::string replace_str;
switch (escape_str[pos + 1]) {
case '"':
replace_str = "\"";
break;
case '\\':
replace_str = "\\";
break;
case 'b':
replace_str = "\b";
break;
case 'f':
replace_str = "\f";
break;
case 'n':
replace_str = "\n";
break;
case 'r':
replace_str = "\r";
break;
case 't':
replace_str = "\t";
break;
default:
return std::string();
break;
}
escape_str.replace(pos, 2, replace_str);
}
return escape_str;
}
static std::string escape_string(const std::string& str)
{
return escape_string(std::string(str));
}
static std::string escape_string(const std::string& str)
{
return escape_string(std::string(str));
}
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

143
LICENSE
View File

@@ -1,5 +1,5 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
@@ -7,17 +7,15 @@
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
@@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
@@ -72,7 +60,7 @@ modification follow.
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
@@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
@@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
GNU Affero General Public License for more details.
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View File

@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30717.126
# Visual Studio Version 17
VisualStudioVersion = 17.0.31912.275
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MeoAssistance", "src\MeoAssistance\MeoAssistance.vcxproj", "{362D1E30-F5AE-4279-9985-65C27B3BA300}"
EndProject
@@ -17,30 +17,51 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MeoAsstGui", "src\MeoAsstGu
{362D1E30-F5AE-4279-9985-65C27B3BA300} = {362D1E30-F5AE-4279-9985-65C27B3BA300}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TransparentImageCvt", "tools\TransparentImageCvt\TransparentImageCvt.vcxproj", "{093A3174-A27E-4D23-B64E-16F9448AD5AC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|x64 = Release|x64
Release|x86 = Release|x86
RelWithDebInfo|x64 = RelWithDebInfo|x64
RelWithDebInfo|x86 = RelWithDebInfo|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{362D1E30-F5AE-4279-9985-65C27B3BA300}.Release|x64.ActiveCfg = Release|x64
{362D1E30-F5AE-4279-9985-65C27B3BA300}.Release|x64.Build.0 = Release|x64
{362D1E30-F5AE-4279-9985-65C27B3BA300}.Release|x86.ActiveCfg = Release|x64
{362D1E30-F5AE-4279-9985-65C27B3BA300}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{362D1E30-F5AE-4279-9985-65C27B3BA300}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
{362D1E30-F5AE-4279-9985-65C27B3BA300}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
{63B4F1A2-291C-4C85-91E1-A1F6DAE30D64}.Release|x64.ActiveCfg = Release|x64
{63B4F1A2-291C-4C85-91E1-A1F6DAE30D64}.Release|x64.Build.0 = Release|x64
{63B4F1A2-291C-4C85-91E1-A1F6DAE30D64}.Release|x86.ActiveCfg = Release|x64
{63B4F1A2-291C-4C85-91E1-A1F6DAE30D64}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64
{63B4F1A2-291C-4C85-91E1-A1F6DAE30D64}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64
{63B4F1A2-291C-4C85-91E1-A1F6DAE30D64}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64
{FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.Release|x64.ActiveCfg = Release|Any CPU
{FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.Release|x64.Build.0 = Release|Any CPU
{FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.Release|x86.ActiveCfg = Release|Any CPU
{FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.Release|x86.Build.0 = Release|Any CPU
{FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|Any CPU
{FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|Any CPU
{FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|Any CPU
{FFDC8F49-8EAF-45BE-B0A8-7EF0DB9875A2}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|Any CPU
{093A3174-A27E-4D23-B64E-16F9448AD5AC}.Release|x64.ActiveCfg = Release|x64
{093A3174-A27E-4D23-B64E-16F9448AD5AC}.Release|x64.Build.0 = Release|x64
{093A3174-A27E-4D23-B64E-16F9448AD5AC}.Release|x86.ActiveCfg = Release|Win32
{093A3174-A27E-4D23-B64E-16F9448AD5AC}.Release|x86.Build.0 = Release|Win32
{093A3174-A27E-4D23-B64E-16F9448AD5AC}.RelWithDebInfo|x64.ActiveCfg = Release|x64
{093A3174-A27E-4D23-B64E-16F9448AD5AC}.RelWithDebInfo|x64.Build.0 = Release|x64
{093A3174-A27E-4D23-B64E-16F9448AD5AC}.RelWithDebInfo|x86.ActiveCfg = Release|Win32
{093A3174-A27E-4D23-B64E-16F9448AD5AC}.RelWithDebInfo|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{63B4F1A2-291C-4C85-91E1-A1F6DAE30D64} = {6C4B8D52-51D1-45F8-AAEC-808035443FD6}
{093A3174-A27E-4D23-B64E-16F9448AD5AC} = {6C4B8D52-51D1-45F8-AAEC-808035443FD6}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4F2C0E4B-4FE9-47C6-A878-6BD2FAD8B9B2}

264
README.md
View File

@@ -1,188 +1,188 @@
# MeoAssistance
<div>
<img alt="C++" src="https://img.shields.io/badge/c++-17-%2300599C?logo=cplusplus">
<img alt="VS" src="https://img.shields.io/badge/VisualStudio-19-%235C2D91?logo=visualstudio">
</div>
<div>
<img alt="platform" src="https://img.shields.io/badge/platform-Windows%2064bit-%230078D6?logo=windows">
</div>
<div>
<img alt="license" src="https://img.shields.io/github/license/MistEO/MeoAssistance-Arknights">
<img alt="commit" src="https://img.shields.io/github/commit-activity/m/MistEO/MeoAssistance-Arknights?color=%23ff69b4">
<img alt="stars" src="https://img.shields.io/github/stars/MistEO/MeoAssistance-Arknights?style=social">
</div>
<br>
A game assistance for Arknights
一款明日方舟的游戏辅助供PC端安卓模拟器使用也勉强兼容安卓手机龟速开发中……
一款明日方舟的游戏助手,自动刷理智、智能基建换班、公招识别等,一键完成所有日常,全自动长草!!!
![界面截图](images/gui.png)
![公招截图](images/openRecruit.png)
纯图像识别,非内存挂,全图形化界面,兼容模拟器和安卓设备,开罐即食,绝赞开发中!✿✿ヽ(°▽°)ノ✿
<br>
## 功能介绍
废话不多说,看图!
![界面截图1](images/gui.png)
![界面截图2](images/settings1.png)
![界面截图3](images/settings2.png)
## 下载地址
[稳定版](https://github.com/MistEO/MeoAssistance/releases/latest)
[测试版](https://github.com/MistEO/MeoAssistance/releases)
## 功能介绍
## 模拟器支持
- 自动刷理智
- **新功能:支持刷完自动上传[企鹅物流数据统计](https://penguin-stats.cn/)**(测试版)
- **新功能:界面支持统计掉落数量**(测试版)
- 可设置是否吃完理智药及数量
- 可设置是否吃石头及数量
- 可设置刷的次数(用来刷剿灭啥的)
- 可设置刷完自动关机
- 支持剿灭模式
- 支持打完升级了的情况
- 支持代理失败的情况,会自动放弃本次行动
- 支持刷完自动截图
- 支持掉线后重连,继续刷上次的图
- 支持凌晨4点更新后重连继续刷上次的图
- 全自动公开招募
- 自动识别当前招募页所有Tags
- 自动计算可能出的干员组合并显示
- 自动帮你点击最优解Tags
- 自动帮你点击时间9小时
- 出5、6星干员弹窗提示
- 最新版本已支持夏活新增的`煌``灰喉`等干员
- 不会帮你点击确定按钮请自行检查辅助选择的是否正确若出现识别错误遗漏了高星干员作者概不负责哦__(:з」∠)_
- 自动访问好友
- 访问完了还会贴心的帮你点进信用商店~
- 可设置访问完自动买信用商店的材料
- 其他优势
- 所有点击操作,都是点击按钮内随机位置,并模拟泊松分布(按钮偏中间位置点的概率大,越往旁边点到的概率越小)
- 刷理智及访问好友的点击操作,支持设置随机延时,没有封号风险~
- 模拟器窗口可以被遮挡、可以最小化、甚至可以老板键隐藏!即使全屏看视频、玩游戏,也完全不影响辅助运行
- 软件支持自动更新✿✿ヽ(°▽°)ノ✿
- 支持多款主流模拟器
- 勉强兼容安卓手机USB调试、无线调试
- 自适应分辨率及屏幕缩放
- 未来更多功能见[Todo](#Todo)
### 模拟器支持
#### 蓝叠模拟器
### 蓝叠模拟器
完美支持。需要在模拟器`设置`-`引擎设置`中打开`允许ADB连接`
#### 蓝叠模拟器国际版
### 蓝叠模拟器国际版
完美支持。需要在模拟器`设定`-`进阶`中打开`Android调试桥`
#### 夜神模拟器
### 夜神模拟器
完美支持
#### MuMu模拟器
### MuMu模拟器
完美支持
### 雷电模拟器
勉强支持。雷电总有莫名其妙的问题,可以试试看,不保证能用(
### 逍遥模拟器
支持
#### 雷电模拟器
### 腾讯手游助手
不支持。新版本的腾讯好像也是自研引擎了没开放ADB端口但是测试是能响应Win32 Api的有需求再做
### MuMu手游助手星云引擎
不支持。星云引擎这个版本不支持adb控制甚至不响应Win32 Api鼠标消息无解_(:з」∠)_
### Win11 WSA
不支持WSA 目前没有实现 AOSP screencap 需要的接口,无法进行截图。等微软支持后会尝试适配
### 蓝叠模拟器Hyper-V版本
支持
#### 逍遥模拟器
1. 在模拟器`设定`-`进阶`中打开`Android调试桥`
2. 下载[ADB](https://dl.google.com/android/repository/platform-tools-latest-windows.zip),将`platform-tools`文件夹解压到`MeoAsstGui.exe`的同级目录
3. 在软件`设置`-`连接设置`中填写蓝叠安装目录下`bluestacks.conf`文件的完整路径
支持
### 其他模拟器、安卓手机/平板、自定义设备
#### 腾讯手游助手
部分支持
不支持新版本的腾讯好像也是自研引擎了没开放ADB端口。但是测试是能响应Win32 Api的有需求再做
#### MuMu手游助手星云引擎
不支持星云引擎这个版本不支持adb控制甚至不响应Win32 Api鼠标消息无解_(:з」∠)_
#### 其他模拟器
若有其他需要,欢迎给我提[ISSUE](https://github.com/MistEO/MeoAssistance/issues),会根据情况尽量适配~
#### 安卓手机/平板
部分功能支持,正在开发中……
需要下载[谷歌官方ADB](https://dl.google.com/android/repository/platform-tools-latest-windows.zip),将`platform-tools`文件夹解压到`MeoAsstGui.exe`的同级目录
- 下载[ADB](https://dl.google.com/android/repository/platform-tools-latest-windows.zip),将`platform-tools`文件夹解压到`MeoAsstGui.exe`的同级目录
- 进入软件`设置`-`连接设置`填写自定义地址需要填写IP+端口,例如`127.0.0.1:5555`
- 目前非`16:9`分辨率下刷理智、访问好友、信用商店、公招识别、领任务等功能已初步可用基建功能暂不可用正在进一步适配中。但仍推荐使用16:9分辨率经过的测试验证最多也最稳定。
## 使用说明
### 基本说明
1. 根据上面模拟器支持情况,进行对应的`ADB`相关操作
1. 根据上面模拟器支持情况,进行对应的操作
2. 解压压缩包,到**没有中文或特殊符号**的文件夹路径
3. 第一次运行辅助**请使用管理员权限**打开`MeoAsstGui.exe`。运行过一次后,后续不再需要管理员权限(之后的版本会尝试完全去掉管理员权限)
4. 运行期间,模拟器窗口可以最小化,全屏玩游戏、看视频等,完全不影响
3. 第一次运行软件**请使用管理员权限**打开`MeoAsstGui.exe`。运行过一次后,后续不再需要管理员权限
4. 开始运行后,所有设置均不可再修改
### 刷理智
1. 明日方舟打开**蓝色开始行动按钮**界面
2. 根据你的需要勾选"吃理智药"和"吃石头"
3. 点击"开始刷理智",开始后上面的选项也可以随时修改
4. 刷完了会自动停止的
- 若游戏处于**蓝色开始按钮**界面,则会刷当前关卡。否则会前往上次作战的关卡!
- 主界面上的`吃理智``吃石头``指定次数`三个选项为短路开关,即三个选项中的任一条件达到,均会视为任务完成,停止刷理智。
- 举例1设置`吃理智药`:`999``吃石头`:`10``指定次数`:`1`。则在刷完**一次**后,由于满足了`指定次数`:`1`的条件,视为任务完成,停止刷理智。
- 举例2不勾选`吃理智药`、不勾选`吃石头`,设置`指定次数`:`100`。则在当前可用理智全部刷完后(可能只刷了几次),由于满足了`不吃理智药``不吃石头`的条件,视为任务完成,停止刷理智。
- 其他优势
- 支持刷完自动上传 [企鹅物流数据统计](https://penguin-stats.cn/)
- 支持企鹅物流自定义ID
- 支持统计掉落数量
- 支持剿灭模式
- 支持打完升级了的情况
- 支持代理失败的情况,会自动放弃本次行动
- 支持掉线后重连,继续刷上次的图
- 支持凌晨4点更新后重连继续刷上次的图
### 基建换班
#### 换班策略
自动计算并选择**单设施内的最优解**,支持所有通用类技能和特殊技能组合;支持识别经验书、赤金、原石碎片、芯片,分别使用不同的干员组合!
#### 宿舍入驻心情阈值
识别心情进度条的百分比;心情小于该阈值的干员,不会再去上班,直接进驻宿舍
#### 特殊说明
- 基建换班目前均为单设施最优解,但非跨设施的全局最优解。例如:`巫恋 龙舌兰``红云 稀音`等这类单设施内的组合,都是可以正常识别并使用的;`迷迭香``红松骑士团`这类多个设施间联动的体系,目前都是不支持的
- 会客室仅缺一个线索时,会选择对应流派的干员;否则会选择通用干员
- 会客室暂不支持送出线索,当线索满时可能会处理异常。建议自动换班完成后自己再去看下会客室的情况
- 控制中枢策略太过复杂,目前只考虑`阿米娅``诗怀雅``凯尔希``彩虹小队`及其他心情+0.05的干员,后续逐步优化
### 信用商店随缘买
从左到右依次买,但不会买`碳``家具零件`。有需要的同学可自行修改`resource\tasks.json``CreditShop-NotToBuy`.`text`字段,自定义不买的物品。后续版本会尝试开放界面选项
### 公开招募识别
1. 明日方舟打开公开招募有Tag选择的界面
2. 辅助勾选你需要的选项,点击"开始识别"
3. 请检查识别结果是否正确,自行判断是否确定开始招募
- 公招识别和自动公招是两个独立的功能!
- 公招识别需要手动打开有公招Tag选择的界面再使用
再次强调本辅助仅会帮你选择最优Tags和时间不会帮你点击确定按钮请自行检查辅助选择的是否正确若出现识别错误遗漏了高星干员作者概不负责哦__(:з」∠)_
### 其他乱七八糟的说明
### 访问好友
1. 明日方舟处于任意界面均可,会自动帮你点过去
2. 根据需要勾选`信用商店随缘买`,点击"访问好友"
3. 达到10次上限或者所有可访问的好友都访问完了就会自动停的
4. 然后会贴心的帮你跳转到信用商店,顺便收了当天信用~
5. 信用商店随缘买,就是从左到右依次买,但不会买`碳``家具零件`
### 不使用模拟器而是USB连接安卓手机
1. 下载[ADB程序](https://dl.google.com/android/repository/platform-tools-latest-windows.zip),将`platform-tools`文件夹解压到`MeoAsstGui.exe`的同级目录
2. 使用USB有线连接安卓手机和电脑
3. 请在手机`设置`-`开发者选项`中打开`USB调试``USB调试安全设置`两个选项。具体操作方式不同品牌手机各不相同,请自行百度查询
4. 请手动修改`resource\config.json`文件中,`options`.`connectType``1`。文件保存后请重新打开程序
5. 当前仅兼容刷理智、公招计算功能,且公招计算暂时无法设置时间
### 不使用模拟器,而是无线连接安卓手机
1. 下载[ADB程序](https://dl.google.com/android/repository/platform-tools-latest-windows.zip),将`platform-tools`文件夹解压到`MeoAsstGui.exe`的同级目录
2. 请保证安卓手机和电脑处于同一局域网中
3. 请在手机`设置`-`开发者选项`中打开`USB调试``USB调试安全设置``无线调试`三个选项。具体操作方式不同品牌手机各不相同,请自行百度查询
4. 请手动修改`resource\config.json`文件中,`options`.`connectType``2`
5. 请手动修改`resource\config.json`文件中,`options`.`connectRemoteAddress`为无线调试的IP地址和端口号。文件保存后请重新打开程序
6. 当前仅兼容刷理智、公招计算功能,且公招计算暂时无法设置时间
**警告:`无线调试`是非常危险的选项若局域网中存在其他攻击性设备或程序可能导致手机数据泄露或丢失请勿在公共的WLAN中使用该功能**
### 设置操作延时
刷理智、访问好友时,每次点击之前,均随机延时一定的时间,降低封号风险
该功能默认是关闭的,需要的话请手动打开:请手动修改`resource\config.json`文件中,`options`.`controlDelayRange`字段的值,格式为`[最小延时, 最大延时]`单位为毫秒例如想设置3~5秒的随机延时即设置为`[ 3000, 5000]` 即可。文件保存后请重新打开程序。
![图例](images/controlDelayRange.png)
- 公招出5、6星会有弹窗提示
- 主界面上要执行的任务,是可以拖动改变顺序的。同样设置中基建换班的顺序,也是可以拖动改变的
- 活动关卡掉落识别到的`未知材料`,一般就是活动商店的票据
- 新的活动关卡刚上线的时候可能无法正常识别一般一两天内软件会自动OTA更新资源更新后即可正常识别
- 所有点击操作,都是点击按钮内随机位置,并模拟泊松分布(按钮偏中间位置点的概率大,越往旁边点到的概率越小)
- `resource\config.json`中有一些自定义选项,可以尝试根据自己的需要进行修改
- 底层算法纯C++开发并设计了多重的缓存技术最大限度降低CPU和内存占用
- 软件支持自动更新✿✿ヽ(°▽°)ノ✿ 推荐非杠精的同学使用测试版一般来说更新快且bug少什么MIUI (╯‵□′)╯︵┻━┻
- [反馈问题](https://github.com/MistEO/MeoAssistance-Arknights/issues)最好可以带上目录下的`asst.log`日志文件,并说下使用模拟器版本,感谢!
## Todo
- [ ] 彻底去掉管理员权限
- [x] 支持设置吃理智药数量
- [x] 信用商店`看着买`功能
- [x] 支持所有主流模拟器
- [ ] 基建智能换班功能
- [ ] 图形化界面
- [x] 干员及精英化识别
- [ ] 干员识别准确率提高到100%
- [x] 任务队列功能
- [ ] 常用关卡选关
- [x] 自动收任务功能
- [x] 基建智能换班功能
- [x] 图形化界面
- [x] 干员技能识别
- [x] 干员识别准确率提高到100%
- [x] 宿舍心情识别及入驻
- [x] 制造站、贸易站智能换班
- [x] 发电站、办公室换班
- [x] 使用无人机
- [ ] 控制中枢智能换班
- [ ] 会客室智能换班
- [ ] 会客室智能线索交流
- [x] 控制中枢智能换班
- [x] 会客室智能换班
- [x] 会客室智能线索交流
- [ ] 支持`迷迭香`等复杂基建体系
- [ ] `激进换班模式`
- [x] `激进换班模式`
- [ ] 自定义换班(手动修改配置文件)
- [ ] 宿舍换班支持加速心情的干员识别
- [x] 贸易站无人机支持设置给经验书还是赤金
- [ ] 使用GPU进行识别的版本
- [x] 关卡掉落识别
- [x] 企鹅物流上传
- [x] 关卡掉落显示到界面上,并统计
- [x] 企鹅物流汇报自定义ID
- [ ] 指定刷某种材料xx个
- [ ] `config`中部分选项做成图形化界面
- [x] 图形化界面部分控件状态保存
- [x] 支持掉线重连,继续刷理智
- [x] 支持凌晨4点更新后重连继续刷理智
- [x] 支持连安卓手机
- [x] 界面拖动顺序保存
- [ ] 进一步的异形屏支持
- [x] 后台自动更新
- [x] 忽略当前版本更新
- [ ] 提供log接口以及界面log
- [ ] 更换OCR库提高公开招募识别率
- [x] 终极目标!全自动长草机!!!
## 致谢
@@ -192,9 +192,11 @@ A game assistance for Arknights
- 文字识别库:[chineseocr_lite](https://github.com/DayBreak-u/chineseocr_lite.git)
- 关卡掉落识别:[企鹅物流识别](https://github.com/KumoSiunaus/penguin-stats-recognize-v3)
- C++ JSON库[meojson](https://github.com/MistEO/meojson.git)
- C++ 运算符解析器:[calculator](https://github.com/kimwalisch/calculator)
- WPF MVVW框架[Stylet](https://github.com/canton7/Stylet)
- WPF控件库[HandyControl](https://github.com/HandyOrg/HandyControl)
- C# JSON库: [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)
- 下载器:[aria2](https://github.com/aria2/aria2)
### 数据源
@@ -207,10 +209,16 @@ A game assistance for Arknights
- 非常感谢 [tcyh035](https://github.com/tcyh035) 帮忙设计重构图形界面
- 非常感谢 [GengGode](https://github.com/GengGode) 和 [DbgDebug](https://github.com/DbgDebug) 提供图像算法思路并协助验证
- 非常感谢 [LoveLoliii](https://github.com/LoveLoliii) 提供公开招募算法及数据、部分功能逻辑思路
- 感谢 [内卷地狱](https://jq.qq.com/?_wv=1027&k=ypbzXcA2) 的大佬们提供的各种协助支持
- 感谢 [LmeSzinc](https://github.com/LmeSzinc) 提供的界面样式参考,~~虽然我抄了个四不像orz~~
- 感谢参与软件测试、提bug的小伙伴们~
- ~~感谢[B站直播间](https://live.bilibili.com/2808861)的小伙伴们陪我弹幕吹水~~
- ~~感谢 [B站直播间](https://live.bilibili.com/2808861) 的小伙伴们陪我弹幕吹水~~
## 广告
[B站直播间](https://live.bilibili.com/2808861):每晚直播敲代码,近期很长一段时间应该都是在写本助软件
[QQ群](https://jq.qq.com/?_wv=1027&k=ypbzXcA2):欢迎加入~
[B站直播间](https://live.bilibili.com/2808861):每晚直播敲代码,近期很长一段时间应该都是在写本助软件
[QQ群:内卷地狱](https://jq.qq.com/?_wv=1027&k=ypbzXcA2):欢迎加入~
如果觉得软件对你有帮助帮忙点个Star吧~(网页最上方右上角的小星星),这就是对我最大的支持了!
PS作者前端苦手现在的界面WPF基本是现学现卖的写得很烂希望有大佬能帮忙提点PR修改修改感激不尽_(:з」∠)_

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 516 KiB

BIN
images/settings1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
images/settings2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -13,19 +13,24 @@ extern "C" {
bool MEOAPI AsstCatchDefault(void* p_asst);
bool MEOAPI AsstCatchEmulator(void* p_asst);
bool MEOAPI AsstCatchUSB(void* p_asst);
bool MEOAPI AsstCatchRemote(void* p_asst, const char* address);
bool MEOAPI AsstCatchCustom(void* p_asst, const char* address);
bool MEOAPI AsstCatchFake(void* p_asst);
bool MEOAPI AsstStartSanity(void* p_asst);
bool MEOAPI AsstStartVisit(void* p_asst, bool with_shopping);
bool MEOAPI AsstStartProcessTask(void* p_asst, const char* task);
bool MEOAPI AsstStartRecruiting(void* p_asst, const int required_level[], int required_len, bool set_time);
//bool MEOAPI AsstStartIndertifyOpers(void* p_asst);
//bool MEOAPI AsstStartInfrast(void* p_asst);
bool MEOAPI AsstStartDebugTask(void* p_asst);
bool MEOAPI AsstAppendFight(void* p_asst, int max_mecidine, int max_stone, int max_times);
bool MEOAPI AsstAppendAward(void* p_asst);
bool MEOAPI AsstAppendVisit(void* p_asst);
bool MEOAPI AsstAppendMall(void* p_asst, bool with_shopping);
//bool MEOAPI AsstAppendProcessTask(void* p_asst, const char* task);
bool MEOAPI AsstAppendInfrast(void* p_asst, int work_mode, const char** order, int order_size, const char* uses_of_drones, double dorm_threshold);
bool MEOAPI AsstAppendRecruit(void* p_asst, int max_times, const int required_level[], int required_len, const int confirm_level[], int confirm_len, bool need_refresh);
bool MEOAPI AsstAppendDebug(void* p_asst);
void MEOAPI AsstStop(void* p_asst);
bool MEOAPI AsstSetParam(void* p_asst, const char* type, const char* param, const char* value);
bool MEOAPI AsstStartRecruitCalc(void* p_asst, const int required_level[], int required_len, bool set_time);
bool MEOAPI AsstStart(void* p_asst);
bool MEOAPI AsstStop(void* p_asst);
bool MEOAPI AsstSetPenguinId(void* p_asst, const char* id);
//bool MEOAPI AsstSetParam(void* p_asst, const char* type, const char* param, const char* value);
MEOAPI_PORT const char* MEO_CALL AsstGetVersion();
#ifdef __cplusplus

View File

@@ -1,25 +1,27 @@
{
"version": "0.7",
{
"version": "0.9",
"options": {
"connectType": 0,
"connectType_Doc": "连接类型0-连接电脑上的模拟器1-连接USB连接的安卓设备2-连接局域网中的安卓设备。默认0",
"connectRemoteAddress": "",
"connectRemoteAddress_Doc": "连接局域网中的安卓设备的地址仅在connectType为2时生效。格式举例192.168.1.123:5678",
"taskDelay": 1000,
"taskDelay_Doc": "识别的延迟越快识别频率越快但会增加CPU消耗。单位毫秒默认1000",
"connectType_Doc": "连接类型0-连接电脑上的模拟器1-连接自定义端口,请手动修改'emulator.Custom'中的相关字段。默认0",
"taskDelay": 2000,
"taskDelay_Doc": "识别的延迟越快识别频率越快但会增加CPU消耗。单位毫秒默认2000",
"printWindow": false,
"printWindow_Doc": "截图功能开启后每次结算界面会截图到screenshot目录下。true-开启false-关闭,默认true",
"uploadToPenguin": true,
"uploadToPenguin_Doc": "上传企鹅物流https://penguin-stats.cn/:每次到结算界面,是否上传企鹅物流数据统计网站。true-开启false-关闭默认true",
"penguinApi": "https://penguin-stats.cn/PenguinStats/api/v2/report",
"penguinApi_Doc": "企鹅物流汇报接口",
"printWindow_Doc": "截图功能开启后每次结算界面会截图到screenshot目录下。true-开启false-关闭,默认false",
"penguinReport": true,
"penguinReport_Doc": "企鹅数据汇报:每次到结算界面,是否汇报掉落数据至企鹅数据 https://penguin-stats.cn/。true-开启false-关闭默认true",
"penguinReportCmdLine": "curl -H \"Content-Type: application/json\" -d \"[body]\" \"https://penguin-stats.cn/PenguinStats/api/v2/report\" [extra]",
"penguinReportCmdLine_Doc": "企鹅数据汇报的命令,想打印详细信息可以尝试添加 -v -i",
"controlDelayRange": [
0,
0
],
"controlDelayRange_Doc": "点击随机延时:每次点击操作会进行随机延时,降低封号风险(好像也没听说过谁被封号的)。格式为 [ 最小延时, 最大延时 ]单位为毫秒。例如想设置3~5秒延时即修改为[ 3000, 5000 ]默认0~0",
"ocrThreadNumber": 4,
"ocrThreadNumber_Doc": "文字识别库OcrLite的线程数量理论上开的高点识别会快点但是会更卡。默认4"
"ocrThreadNumber_Doc": "文字识别库OcrLite的线程数量理论上开的高点识别会快点但是会更卡。默认4",
"adbExtraSwipeDist": 50,
"adbExtraSwipeDist_Doc": "额外的滑动距离adb有bug同样的参数偶尔会划得非常远。额外做一个短程滑动把之前的停下来",
"adbExtraSwipeDuration": 1000,
"adbExtraSwipeDuration_Doc": "额外的滑动持续时间adb有bug同样的参数偶尔会划得非常远。额外做一个短程滑动把之前的停下来。若小于0则关闭额外滑动功能"
},
"emulator_Doc": "下面的和模拟器窗口捕获逻辑有关,不需要修改",
"emulator": {
@@ -30,12 +32,15 @@
},
"adb": {
"path": "[EmulatorPath]Engine\\ProgramFiles\\HD-Adb.exe",
"connect": "[Adb] connect 127.0.0.1:5555",
"click": "[Adb] -s 127.0.0.1:5555 shell input tap [x] [y]",
"swipe": "[Adb] -s 127.0.0.1:5555 shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s 127.0.0.1:5555 shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayRegex": "cur=%dx%d",
"screencap": "[Adb] -s 127.0.0.1:5555 exec-out screencap -p"
"addresses": [ "127.0.0.1:5555" ],
"devices": "[Adb] devices",
"addressRegex": "(.+)\tdevice",
"connect": "[Adb] connect [Address]",
"click": "[Adb] -s [Address] shell input tap [x] [y]",
"swipe": "[Adb] -s [Address] shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s [Address] shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayFormat": "cur=%dx%d",
"screencap": "[Adb] -s [Address] exec-out screencap -p"
}
},
"BlueStacksInternational": {
@@ -45,12 +50,15 @@
},
"adb": {
"path": "[EmulatorPath]HD-Adb.exe",
"connect": "[Adb] connect 127.0.0.1:5555",
"click": "[Adb] -s 127.0.0.1:5555 shell input tap [x] [y]",
"swipe": "[Adb] -s 127.0.0.1:5555 shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s 127.0.0.1:5555 shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayRegex": "cur=%dx%d",
"screencap": "[Adb] -s 127.0.0.1:5555 exec-out screencap -p"
"addresses": [ "127.0.0.1:5555" ],
"devices": "[Adb] devices",
"addressRegex": "(.+)\tdevice",
"connect": "[Adb] connect [Address]",
"click": "[Adb] -s [Address] shell input tap [x] [y]",
"swipe": "[Adb] -s [Address] shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s [Address] shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayFormat": "cur=%dx%d",
"screencap": "[Adb] -s [Address] exec-out screencap -p"
}
},
"MuMuEmulator": {
@@ -60,27 +68,33 @@
},
"adb": {
"path": "[EmulatorPath]..\\vmonitor\\bin\\adb_server.exe",
"connect": "[Adb] connect 127.0.0.1:7555",
"click": "[Adb] -s 127.0.0.1:7555 shell input tap [x] [y]",
"swipe": "[Adb] -s 127.0.0.1:7555 shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s 127.0.0.1:7555 shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayRegex": "cur=%dx%d",
"screencap": "[Adb] -s 127.0.0.1:7555 exec-out screencap -p"
"addresses": [ "127.0.0.1:7555" ],
"devices": "[Adb] devices",
"addressRegex": "(.+)\tdevice",
"connect": "[Adb] connect [Address]",
"click": "[Adb] -s [Address] shell input tap [x] [y]",
"swipe": "[Adb] -s [Address] shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s [Address] shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayFormat": "cur=%dx%d",
"screencap": "[Adb] -s [Address] exec-out screencap -p"
}
},
"LDPlayer": {
"handle": {
"class": "LDPlayerMainFrame",
"window": "雷电模拟器"
"window": ""
},
"adb": {
"path": "[EmulatorPath]adb.exe",
"connect": "[Adb] connect emulator-5554",
"click": "[Adb] -s emulator-5554 shell input tap [x] [y]",
"swipe": "[Adb] -s emulator-5554 shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s emulator-5554 shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayRegex": "cur=%dx%d",
"screencap": "[Adb] -s emulator-5554 shell screencap -p"
"addresses": [ "127.0.0.1:5555", "emulator-5554" ],
"devices": "[Adb] devices",
"addressRegex": "(.+)\tdevice",
"connect": "[Adb] connect [Address]",
"click": "[Adb] -s [Address] shell input tap [x] [y]",
"swipe": "[Adb] -s [Address] shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s [Address] shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayFormat": "cur=%dx%d",
"screencap": "[Adb] -s [Address] shell screencap -p"
}
},
"Nox": {
@@ -90,12 +104,15 @@
},
"adb": {
"path": "[EmulatorPath]nox_adb.exe",
"connect": "[Adb] connect 127.0.0.1:62001",
"click": "[Adb] -s 127.0.0.1:62001 shell input tap [x] [y]",
"swipe": "[Adb] -s 127.0.0.1:62001 shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s 127.0.0.1:62001 shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayRegex": "cur=%dx%d",
"screencap": "[Adb] -s 127.0.0.1:62001 exec-out screencap -p"
"addresses": [ "127.0.0.1:62001", "127.0.0.1:59865" ],
"devices": "[Adb] devices",
"addressRegex": "(.+)\tdevice",
"connect": "[Adb] connect [Address]",
"click": "[Adb] -s [Address] shell input tap [x] [y]",
"swipe": "[Adb] -s [Address] shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s [Address] shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayFormat": "cur=%dx%d",
"screencap": "[Adb] -s [Address] exec-out screencap -p"
}
},
"XYAZ": {
@@ -105,46 +122,36 @@
},
"adb": {
"path": "[EmulatorPath]adb.exe",
"connect": "[Adb] connect 127.0.0.1:21503",
"click": "[Adb] -s 127.0.0.1:21503 shell input tap [x] [y]",
"swipe": "[Adb] -s 127.0.0.1:21503 shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s 127.0.0.1:21503 shell dumpsys window displays | grep init=",
"displayRegex": " init=%dx%d",
"screencap": "[Adb] -s 127.0.0.1:21503 shell screencap -p"
"addresses": [ "127.0.0.1:21503" ],
"devices": "[Adb] devices",
"addressRegex": "(.+)\tdevice",
"connect": "[Adb] connect [Address]",
"click": "[Adb] -s [Address] shell input tap [x] [y]",
"swipe": "[Adb] -s [Address] shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s [Address] shell dumpsys window displays | grep init=",
"displayFormat": " init=%dx%d",
"screencap": "[Adb] -s [Address] shell screencap -p"
}
},
"Remote": {
"Custom": {
"handle": {
"class": "Remote Class",
"window": "Remote Window",
"class": "Custom Class",
"window": "Custom Window",
"Doc": "这俩不是用来捕获窗口的,是为了兼容现有的捕获模拟器的字段,随手写的,这两个字段实际不会使用到"
},
"adb": {
"Doc": "1.请将Adb解压到'path'中的路径(或者修改'path'2.请修改addresses为指定地址若不填写则使用devices自动查找",
"path": "[ExecDir]platform-tools\\adb.exe",
"addresses": [],
"devices": "[Adb] devices",
"addressRegex": "(.+)\tdevice",
"connect": "[Adb] connect [Address]",
"click": "[Adb] -s [Address] shell input tap [x] [y]",
"swipe": "[Adb] -s [Address] shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] -s [Address] shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayRegex": "cur=%dx%d",
"displayFormat": "cur=%dx%d",
"screencap": "[Adb] -s [Address] exec-out screencap -p"
}
},
"USB": {
"handle": {
"class": "USB Class",
"window": "USB Window",
"Doc": "这俩不是用来捕获窗口的,是为了兼容现有的捕获模拟器的字段,随手写的,这两个字段实际不会使用到"
},
"adb": {
"Doc": "USB连接暂时不兼容多设备的情况",
"path": "[ExecDir]platform-tools\\adb.exe",
"connect": "[Adb] devices",
"click": "[Adb] shell input tap [x] [y]",
"swipe": "[Adb] shell input swipe [x1] [y1] [x2] [y2] [duration]",
"display": "[Adb] shell dumpsys window displays | grep init= | awk ' { print $3 } '",
"displayRegex": "cur=%dx%d",
"screencap": "[Adb] exec-out screencap -p"
}
}
}
}

2106
resource/infrast.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
[
[
{
"name": "Lancet-2",
"type": "医疗",
@@ -1317,5 +1317,49 @@
"hidden": false,
"name-en": "Ambriel",
"new": true
},
{
"name": "阿",
"type": "特种",
"level": 6,
"sex": "男",
"tags": [
"远程位",
"支援",
"输出",
"高级资深干员"
],
"hidden": false,
"name-en": "Aak",
"new": true
},
{
"name": "吽",
"type": "重装",
"level": 5,
"sex": "男",
"tags": [
"近战位",
"防护",
"治疗",
"资深干员"
],
"hidden": false,
"name-en": "Hung",
"new": true
},
{
"name": "正义骑士号",
"type": "狙击",
"level": 1,
"sex": "女",
"tags": [
"远程位",
"支援",
"支援机械"
],
"hidden": false,
"name-en": "Unknown",
"new": true
}
]

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Some files were not shown because too many files have changed in this diff Show More