diff --git a/.gitignore b/.gitignore index 6704566..a6b984d 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,4 @@ dist # TernJS port file .tern-port +.DS_Store diff --git a/README.md b/README.md index e2e9aa8..84b8365 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,13 @@ 主要功能使用指南:https://github.com/csvwolf/fgo-auto-scripts/wiki ## 说明 -安卓 App FGO 自动刷图(使用前请开启技能确认功能)。 +安卓 App FGO 自动刷图(使用前请**开启技能确认**功能)。 **不保证都能用,坐标偏移不修(可能是不同设备分辨率之类的奇怪的问题)** 确定可以的测试设备: -- MI 10(MiUI 12.5) +- MI 10(MIUI 12.5) +- MI 8(MIUI Global 12.0.1) ### Features #### 刷图 diff --git a/assets/friends/caster/1.jpg b/assets/friends/caster/1.jpg new file mode 100644 index 0000000..25d8b51 Binary files /dev/null and b/assets/friends/caster/1.jpg differ diff --git a/assets/friends/caster/2.jpg b/assets/friends/caster/2.jpg new file mode 100644 index 0000000..98bf696 Binary files /dev/null and b/assets/friends/caster/2.jpg differ diff --git a/assets/friends/caster/3.jpg b/assets/friends/caster/3.jpg new file mode 100644 index 0000000..cdb374b Binary files /dev/null and b/assets/friends/caster/3.jpg differ diff --git a/assets/friends/caster/4.jpg b/assets/friends/caster/4.jpg new file mode 100644 index 0000000..ee018ff Binary files /dev/null and b/assets/friends/caster/4.jpg differ diff --git a/attack.js b/attack.js index dee3124..e3e6655 100644 --- a/attack.js +++ b/attack.js @@ -8,6 +8,7 @@ if (!requestScreenCapture(true)) { sleep(300) var utils = require('./utils') +var finder = require('./finder') var defaults = require('./default') var getCommands = require('./commands') @@ -16,6 +17,7 @@ setScreenMetrics(1080, 2340) var click1 = utils.click var sleep1 = utils.sleep var readImage = utils.readImage +var findServant = finder.findServant // autojs 这个 node 版本 const 分析的不对,没办法还是用 var 吧 var findButton = utils.findButton @@ -32,18 +34,17 @@ const Card1= [475,764] const Card2 = [855,764] const NextImage = readImage('./assets/next.jpg') -const HelpImage = readImage('./assets/help-v2.jpg') const GoldAppleImage = readImage('./assets/gold_apple.jpg') const Attack = readImage('./assets/attack.jpg') function fight() { - click1(Battle[0],Battle[1]) + click1(Battle[0],Battle[1], true) sleep1(1500) - click1(CardSP[0],CardSP[1]) + click1(CardSP[0],CardSP[1], true) sleep1(500) - click1(Card1[0],Card1[1]) + click1(Card1[0],Card1[1], true) sleep1(500) - click1(Card2[0],Card2[1]) + click1(Card2[0],Card2[1], true) sleep1(20000) } @@ -81,9 +82,9 @@ function eatApple() { console.log('别吃啊!!!') return false } - click1(1365, 471) + click1(1365, 471, true) sleep1(300) - click1(1603,835) + click1(1603,835, true) console.log('吃屎啦你') } else { toast('不用吃苹果') @@ -92,22 +93,7 @@ function eatApple() { } function clickRefresh() { - let p = findButton(HelpImage, {maxTimes:10, threshold: 0.7}) - while (!p) { - click1(1566,183) - sleep1(300) - click1(1576,842) - sleep1(3000) - p = findButton(HelpImage, {maxTimes:100, threshold: 0.7}) - if (p) { - break - } - sleep1(15000) - toast('接着找') - } - click1(p[0],p[1]) - toast('找到啦') - sleep1(3000) + findServant('caster') } @@ -124,11 +110,11 @@ function nextTurn() { toast('完成') let p = null while (!p) { - click1(1920,993) + click1(1920,993, true) sleep1(300) p = findButton(NextImage, {maxTimes:1}) } - click(1564, 852) + click1(1564, 852, true) } @@ -159,7 +145,6 @@ var i = 0 events.on('exit', function() { toast('共刷 ' + i + ' 轮') NextImage.recycle() - HelpImage.recycle() GoldAppleImage.recycle() Attack.recycle() }) diff --git a/commands.js b/commands.js index 1dab63e..6eb345f 100644 --- a/commands.js +++ b/commands.js @@ -1,10 +1,9 @@ - var utils = require('./utils') setScreenMetrics(1080, 2340) -const click2 = utils.click -const sleep2 = utils.sleep +var click2 = utils.click +var sleep2 = utils.sleep const SkillY = 880 const MasterSkillY = 479 @@ -48,7 +47,7 @@ const ChangeS6 = [2008, ChangeY] const ChangeConfirm = [1353, 958] function useMasterSkill(i) { - click2(MasterSkillStart[0], MasterSkillStart[1]) + click2(MasterSkillStart[0], MasterSkillStart[1], true) sleep2(150) use(i) } @@ -56,28 +55,28 @@ function useMasterSkill(i) { function use(t) { var i = t[0] var avatar = t[1] - click2(i[0],i[1]) + click2(i[0],i[1], true) sleep2(200) - click2(Confirm[0],Confirm[1]) + click2(Confirm[0],Confirm[1], true) sleep2(100) - click2(avatar[0],avatar[1]) + click2(avatar[0],avatar[1], true) sleep2(3000) } // t: [from, to] function changeServant(t) { - click2(MasterSkillStart[0], MasterSkillStart[1]) + click2(MasterSkillStart[0], MasterSkillStart[1], true) sleep2(150) // 换人服是三技能 - click2(MasterSkill3[0], MasterSkill3[1]) + click2(MasterSkill3[0], MasterSkill3[1], true) sleep2(200) - click2(Confirm[0],Confirm[1]) + click2(Confirm[0],Confirm[1], true) sleep2(100) - click2(t[0][0], t[0][1]) + click2(t[0][0], t[0][1], true) sleep2(100) - click2(t[1][0], t[1][1]) + click2(t[1][0], t[1][1], true) sleep2(100) - click2(ChangeConfirm[0], ChangeConfirm[1]) + click2(ChangeConfirm[0], ChangeConfirm[1], true) sleep2(3000) } diff --git a/finder.js b/finder.js new file mode 100644 index 0000000..f91336c --- /dev/null +++ b/finder.js @@ -0,0 +1,90 @@ +// 查找助战 + +var servants = { + caster: 4 +} + +var utils = require('./utils') +var swipe1 = utils.swipe +var click1 = utils.click +var sleep1 = utils.sleep +var readImage = utils.readImage +// autojs 这个 node 版本 const 分析的不对,没办法还是用 var 吧 +var findButton = utils.findButton +var images = {} + +function initImages () { + for (let key in servants) { + images[key] = [] + for (let i = 1; i <= servants[key]; i++) { + images[key].push(readImage(getWholePath(key, i))) + } + } +} + +function getWholePath(servant, idx) { + return './assets/friends/' + servant + '/' + idx + '.jpg' +} + +function findServant(servant) { + const imageList = images[servant] + let p = null + for (let i = 0; i < imageList.length; i++) { + // 就搜一次就够了 + p = findButton(imageList[i], {maxTimes: 1, threshold: 0.9}) + if (p) { + return p + } + } + return p +} + +function findServantAndSwipe(servant) { + let p = null + for (let i = 0; i < 5; i++) { + p = findServant(servant) + sleep(300) + if (p) { + return p + } + swipe1(1600, 1000, 1600, 500, 600, true) + sleep(200) + } + return p +} + +function find(servant) { + p = findServantAndSwipe(servant) + + while (!p) { + click1(1566,183, true) + sleep1(300) + click1(1576,842, true) + sleep1(3000) + + p = findServantAndSwipe(servant) + if (p) { + break + } + sleep1(15000) + toast('接着找') + } + click1(p[0],p[1], false) + toast('找到啦 ' + p[0] + ',' + p[1]) + sleep1(3000) +} + +events.on('exit', function() { + for (let key in images) { + for (let i = 0; i <= images[key].length; i++) { + if (images[key][i]) { + images[key][i].recycle() + } + } + } +}) + +// 直接初始化一波 +initImages() + +exports.findServant = find diff --git a/friend_pool.js b/friend_pool.js index 6659d0d..9bca22e 100644 --- a/friend_pool.js +++ b/friend_pool.js @@ -13,7 +13,7 @@ var readImage = utils.readImage var click1 = utils.click var sleep1 = utils.sleep -setScreenMetrics(1080, 2340) +// setScreenMetrics(1080, 2340) const Blank = [2016, 821] const Confirm = [1564, 855] @@ -32,13 +32,13 @@ toast('开抽') while (true) { while (!findButton(Continue10Image, { maxTimes: 1 })) { - click1(Blank[0], Blank[1]) + click1(Blank[0], Blank[1], true) } toast('抽完了一次!') - click1(Continue[0], Continue[1]) + click1(Continue[0], Continue[1], true) sleep1(300) - click1(Confirm[0], Confirm[1]) + click1(Confirm[0], Confirm[1], true) // 在这里才开始 i++ diff --git a/project.json b/project.json index df54e2c..0f939e3 100644 --- a/project.json +++ b/project.json @@ -36,5 +36,5 @@ }, "scripts": {}, "versionCode": 1, - "versionName": "0.0.8" + "versionName": "0.0.9" } diff --git a/utils.js b/utils.js index b131186..d709d96 100644 --- a/utils.js +++ b/utils.js @@ -1,7 +1,24 @@ -var click1 = function(x, y) { - const _x = x+random(-10,10) - const _y = y+random(-10,10) - console.log(_x, _y) +// 自动缩放不好使 +// setScreenMetrics(1080, 2340) + +// 人工缩放坐标系 +var resize = function(x, y) { + return [Math.floor(x / 2340 * device.height), Math.floor(y / 1080 * device.width)] +} + +/** + * + * @param {*} x + * @param {*} y + * @param {*} r resize or not + */ +var click1 = function(x, y, r) { + let p = [x, y] + if (r) { + p = resize(x, y) + } + const _x = p[0] + random(-10,10) + const _y = p[1] + random(-10,10) click(_x, _y) } @@ -9,6 +26,30 @@ var sleep1 = function(t) { sleep(t + random(0, 80)) } +/** + * + * @param {*} x1 + * @param {*} y1 + * @param {*} x2 + * @param {*} y2 + * @param {*} duration + * @param {*} r resize or not + */ +var swipe1 = function(x1, y1, x2, y2, duration, r) { + var p1 = [x1, y1] + var p2 = [x2, y2] + if (resize) { + p1 = resize(x1, y1) + p2 = resize(x2, y2) + } + const _x1 = p1[0] + random(-10, 10) + const _x2 = p2[0] + random(-10, 10) + const _y1 = p1[1] + random(-10, 10) + const _y2 = p2[1] + random(-10, 10) + const _duration = duration + random(-100, 100) + swipe(_x1, _y1, _x2, _y2, _duration) +} + var readImage = function(img) { const b = images.read(img) return b @@ -20,11 +61,15 @@ var findButton = function (b, options) { const threshold = options ? options.threshold || 0.7 : 0.7 for (let i = 0; i < maxTimes; i++) { - const point = findImage(captureScreen(), b, { threshold: threshold }) - if (point) { - return [point.x, point.y] - } - sleep1(interval) + const point = findImage(captureScreen(), b, { threshold: threshold }) + + if (point) { + return [ + Math.floor(point.x + b.getWidth() / 2), + Math.floor(point.y + b.getHeight() / 2) + ] + } + sleep1(interval) } return false } @@ -41,3 +86,4 @@ exports.sleep = sleep1 exports.readImage = readImage exports.findButton = findButton exports.stopExecution = stopExecution +exports.swipe = swipe1