diff --git a/DoroHelper.ahk b/DoroHelper.ahk index fcfd513..83a78f8 100644 --- a/DoroHelper.ahk +++ b/DoroHelper.ahk @@ -5,16 +5,20 @@ CoordMode "Pixel", "Client" CoordMode "Mouse", "Client" ;操作间隔(单位:毫秒) sleepTime := 1500 -scrRatio := 1.0 ;consts currentScale := A_ScreenDPI / 96 ;确定缩放比例 stdScreenW := 3840 stdScreenH := 2160 waitTolerance := 50 colorTolerance := 15 -currentVersion := "v1.0.0-beta.1" +currentVersion := "v1.0.0-beta.2" usr := "kyokakawaii" repo := "DoroHelper" +;初始化 +title := "ahk_exe nikke.exe" +nikkeID := WinGetIDLast(title) +WinGetClientPos &NikkeX, &NikkeY, &NikkeW, &NikkeH, nikkeID +scrRatio := NikkeW / stdScreenW ;颜色判断 IsSimilarColor(targetColor, color) { tr := Format("{:d}", "0x" . substr(targetColor, 3, 2)) @@ -150,13 +154,13 @@ GoBack() { Recruit() { AddLog("结算招募") Text := "|*119$57.k1z7wT7k0w07kz1kw0100S7kS7U0003ky7kw003sS7Vy7Vy0T3ksTkwDk3zy63y7Vy0TzkkzkwDk07y47y7Vy00Dk0zkw00k0S03y7U07U3k0Tkw01zsS11y7U0Tz3kQDkwDz3sS7Uy7VzsT3ky7kwDz00S7kS7Vzs03kz3kwDz00S7wC7Vzy07kzVkwDzU" - while !(ok := FindText(&X := "wait", &Y := 1, 2389 - 150000, 81 - 150000, 2389 + 150000, 81 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { ;如果没找到SKIP就一直点左下角(加速动画) + while !(ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { ;如果没找到SKIP就一直点左下角(加速动画) Confirm } FindText().Click(X, Y, "L") ;找到了就点 Sleep sleepTime Text := "|<确认>*143$52.zzXzzzzby0C7zwTwDk0E1zkzkz0303z1z7z0M0Dy3wTyDVVzwDlzsw01zzz7zXU01zzwTwA0060zlzk000M1z3y00llU7wDs0U07kTkz0200Tlz3w6801z7s7kMU27wTUT1WAMTly1y6801z7s3wM007wL0DlU00TkA8T00UVy01Vw0777s073k0QQTUUw723k1w47sAQD07tkzkzly0zz7zW" - if (ok := FindText(&X := "wait", &Y := 3, 1135 - 150000, 1230 - 150000, 1135 + 150000, 1230 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } @@ -165,12 +169,12 @@ Recruit() { RefuseSale() { AddLog("尝试关闭可能的推销页面") Text := "|<点击关闭画面>**50$129.0DU03s071sD000000000001g00P01wTXzzzzzzzzzs00Azk3A09nANk0zzzzzzzU01U6TtzVatXa03U00s00A00A0H00AwyTAzyTzzzz7zU01byM01a00vzvnzzzzwzs07xzXzDwk03nzSTs3xz3z01U0AztzbwTyTlny0Dg00M0A01jzDyznyn00SrNhYQn01bzBU00zyTyM03avAhnaM0AkRg007U13nwSQk1Zi0n01bzBztzs00CT3naFAhk6M0A01XPDPz1znnSQrNZiQnTVU0APNPDwDyMvna0Ahl6TCDzzXP/870skDSQk1Zi0nkNjvaPtt3lXqTvnbzwhraQvNrAvDD/sS7nsSQzzhiQnbTCtnM01A7sCP7nU01g00QvnriP00/3nlnTsy00BU03kzzzzTzvDs7zM3yzzzhzzTySytk03ts0DT0DU01xw0TD4" - if (ok := FindText(&X := "wait", &Y := 3, 1279 - 150000, 1265 - 150000, 1279 + 150000, 1265 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X, &Y, 1279 - 150000, 1265 - 150000, 1279 + 150000, 1265 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } @@ -179,8 +183,8 @@ RefuseSale() { ; 进入战斗 EnterToBattle() { AddLog("尝试进入战斗") - Text := "|<进入战斗的进入>**50$68.7U7ty00D0003w12FU06M000VUEY801XU008A49200EM0031V2EU043000sDkwDU1kM0073000M0C3000tk00201kk007o000U0A6000t000M01Uk000T3ky00EA01zkEY80041U0Ty4920030M041X3kk00k3010TkwDk080E0E70008066607lk003011Uk0AQ000k0kQA037sD3w0AD1U0ly7ky062MA0ANV48031W3036kl201kEkM0lsAEU0MA630AS6480A61UM77VV20C1UA330wkEU70k1URU3zzznUM0Q3k03zs5UA030MC0003E600MD6s000q30033P3k008nU00QXkDzzy7k003ss0000000000U" - if (ok := FindText(&X := "wait", &Y := 3, 1483 - 150000, 1263 - 150000, 1483 + 150000, 1263 + 150000, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { + Text := "|<进入战斗的进入>*175$66.vzsSDzznzzzkzsS7zzVzzzUTsS7zz0zzzkDsS7zzUTzzs7sQ7zzkDzzw4000zzs7zzyA000zzw7zzzw000zzy3zzzw000zzy1zzzzsQ7zzy1zzzzsQ7zzy0zzXTsQ7zzw0zz0DsQ7zzw0Tz0DkQ7zzw0Tz0A000Tzs0DzwA000TzsA7zwA000TzkQ7zwC000zzkS3zwDUw7zzUS3zwDUw7zzUz1zwDVw7zz1z0zwD1w7zy1zUTwC3w7zw3zkDwC3w7zs3zk7s77w7zk7zs3U1zzzzUDzw1000s0C0Tzy01k000Q0zzz1Xs000S1zzzVbz000T7zzznU" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") AddLog("已点击进入战斗") Sleep sleepTime @@ -194,22 +198,22 @@ BattleSettlement() { AddLog("等待战斗结算") while true { CheckAutoBattle - Sleep 5000 - TextTAB := "|*120$34.zzzzzzzzzzzw1zzzzk7zzzz0Tzzzw1zzzzk7zzzz0Tzzzw1zzzzk7kDzz0S0Tzw1s1zzk7U7zz0S0Tzw1s1zzk7U7UD0S0S0w1s1s3k7U7UD0S0S0w1s1s3k7U7UD0S0S0w1s1s3k7U7UD0S0S0w1s1s3k7U7UDzzzzzzzzzzzzzzzzzzzzzzw00003k0000D00000zzzzzzzzzzzy" - TextR := "|*148$41.zzk07zzzy003zzzk001zzy0000zzs1zw0xzUDzy0ny1zzz03s7zzz07UTzzz0D1zzzz0Q7zzzw0sTzzzk1UzyTz033zwTzy27zsTzzsDzkTzzkzzUDzzVzz0Dzz3zy0Dzy7zw07zwDzs07zsTzk0TzkzzU1zzVzz07zz3zy0zzU3zw3zy27zsDzw4DzkzzsMDzbzzUsDzTzz3kTzzzw7kTzzzkTkTzzz1zUTzzw3zUDzzUDzUDzy0zzU3zU3zzk000Tzzk001zzzs00Dzzzy01zzk" - if (ok := FindText(&X, &Y, 934 - 150000, 854 - 150000, 934 + 150000, 854 + 150000, 0.1, 0.1, TextTAB, , , , , , , currentScale, currentScale)) or (ok := FindText(&X, &Y, 934 - 150000, 854 - 150000, 934 + 150000, 854 + 150000, 0.1, 0.1, TextR, , , , , , , currentScale, currentScale)) { + Sleep 3000 + TextTAB := "|*118$34.zzzzzzzzzzzw1zzzzk7zzzz0Tzzzw1zzzzk7zzzz0Tzzzw1zzzzk7k7zz0S0Tzw1s1zzk7U7zz0S0Tzw1s1zzk7U7UD0S0S0w1s1s3k7U7UD0S0S0w1s1s3k7U7UD0S0S0w1s1s3k7U7UD0S0S0w1s1s3k7U7UDzzzzzzzzzzzzzzzzzzzzzzw00003k0000D00000zzzzzzzzzzzy" + TextR := "|*113$36.zzzzzzzzzzzzzy07zzzs07zzzU07zzz007bzy0TjXzw1zzVzw7zz0zsDzz0TsDzy0DkTzy07kTzy03kzzw0Tkzzw0zkzzzkzkzzzkzkzzzkzkzzzkzkTzzUzkTzzUzsTzz1zsDzz1zw7zy3zw3zw3zy0zU7zz000DzzU00Tzzk01zzzy07zzzztzzzzzzzzzzzzzzzU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, TextTAB, , , , , , , currentScale, currentScale)) or (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, TextR, , , , , , , currentScale, currentScale)) { ;看到TAB的标志代表战斗结束了,看看怎么个事 Text编队 := "|<编队>**50$48.7kT000T07kTUTyTUArtyTzNUAzsyE3NUAw02FXNUNwzWHXN0NwzmHaN0nAzmHaN0nA02HAFUUQzyHCFUYQzzHaFUwwzzHWlURw03HnkUtw9PHnkkkA/PHnUkUs/PHXUMzs83H3aMzt03Hz6Ay99PHyDCsl/PHSD7Xn/PHQNXzn/HHMtlyzTrHRkvU" Text下一关 := "|<下一关>*192$69.zzzzzzzzwzls001zzzzz3yD0007zzzzwTVs000zzzzzlwTzlzzzzzzk00TyDzzzzzw003zlzzzzzzU00TyDzzzzzzy7zzkDzzzzzzszzy0zk000zz7zzk1y0007zkzzyA3k000s000zlkTzzzz0007yDXzzzzzw3zzlyzzzzzzUTzyDzzzzzzs1zzlzzzzzzy23zyDzzzzzzUsDzlzzzzzzkDUTyDzzzzzk3y0zlzzzzzz1zwDyDzzzzzxzzxU" ; 有编队代表输了,点Esc - if (ok := FindText(&X, &Y, 1285 - 150000, 1220 - 150000, 1285 + 150000, 1220 + 150000, 0.1, 0.1, Text编队, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text编队, , , , , , , currentScale, currentScale)) { AddLog("战斗失败!尝试返回") GoBack Sleep sleepTime return False } ; 如果有下一关,就点下一关(爬塔的情况) - else if (ok := FindText(&X, &Y, 2227 - 150000, 1108 - 150000, 2227 + 150000, 1108 + 150000, 0.1, 0.1, Text下一关, , , , , , , currentScale, currentScale)) { + else if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text下一关, , , , , , , currentScale, currentScale)) { AddLog("战斗成功!尝试进入下一关") FindText().Click(X, Y, "L") Victory := Victory + 1 @@ -231,12 +235,9 @@ BattleSettlement() { BackToHall() { AddLog("尝试返回大厅") Text := "|<大厅>**50$69.0001s0000000000T01zzy00000380Tzzs00000NU3003000003A0E00M00000NU2Tzz00007zDyHzzk0001zU4uTzz0000A003H00M0001zUTuM0700007y7yHzDk00000kk2MNU00000A30H38000001aQ6MN000000Mtkn38000007D76MN000003ngQm3800000stlyntU00006C73aS800000nUQQm3000007s1zwNs00000y03rXy000000000000004" - while !(ok := FindText(&X, &Y, 1294 - 150000, 1334 - 150000, 1294 + 150000, 1334 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { ;如果没有找到大厅的文本 + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { ;如果没有找到大厅的文本 Confirm() ;就一直点左下角的小房子的对应位置 } - if (ok := FindText(&X, &Y, 1294 - 150000, 1334 - 150000, 1294 + 150000, 1334 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { - FindText().Click(X, Y, "L") ;点击大厅的文本(找到文本了也要再点一下,防止在物品栏等页面卡死) - } Sleep sleepTime } ;进入方舟 @@ -246,10 +247,10 @@ EnterToArk() { Text大厅 := "|<大厅方舟的图标>*161$56.000zzk000001zzzs00001zzzzU0001zzzzy0001zzzzzs000zzzzzz000TzyDzzw00Dzy3VzzU07zy0s7zw03zz0C0zzU1zzU3U7zw0zzs3w0zzUDzw3zkDzw7zz1zy1zz1zzUTzkDzszzsDzy3zzDzzzzzUzznzzzzzzzzyTzzzzzzzzrzy7zzzzzxzzUzzzzzzDzw7zy3zzlzz0zz0zzsTzsDzkTzw3zy0zs7zz0Tzk7k3zzU3zy0s0zzk0TzkC0Tzw03zy3UDzw00TzssDzz003zzzzzz000DzzzzzU001zzzzzk0007zzzzk0000Dzzzk00000zzzU000000zy0008" while True { Sleep sleepTime - if (ok := FindText(&X := "wait", &Y := 3, 1809 - 150000, 962 - 150000, 1809 + 150000, 962 + 150000, 0.3, 0.3, Text大厅, , , , , , , currentScale, currentScale)) { ;查找并点击大厅的方舟按钮 + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3, 0.3, Text大厅, , , , , , , currentScale, currentScale)) { ;查找并点击大厅的方舟按钮 FindText().Click(X, Y, "L") ;找得到就尝试进入 Sleep sleepTime - if (ok := FindText(&X := "wait", &Y := 3, 1294 - 150000, 1334 - 150000, 1294 + 150000, 1334 + 150000, 0.3, 0.3, Text方舟, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3, 0.3, Text方舟, , , , , , , currentScale, currentScale)) { AddLog("已进入方舟") break } @@ -262,22 +263,22 @@ EnterToArk() { Login() { AddLog("正在登录") Text大厅 := "|<大厅>*80$41.zkzzzzzzVzw003z3zk007y7zU00DwDz000zsTy7zz000A002000M000000k007w3zV00zs7z3wDzU7y7sTz0DwDkzw4DsTVzkMDkz3z0sDVy7w3s67wDUDk4C0T0zs8Q1z7zslw3y" ;大厅底部的文本 - while !(ok := FindText(&X, &Y, 1294 - 150000, 1334 - 150000, 1294 + 150000, 1334 + 150000, 0.3, 0.3, Text大厅, , , , , , , currentScale, currentScale)) { ;如果没有找到大厅的文本 + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3, 0.3, Text大厅, , , , , , , currentScale, currentScale)) { ;如果没有找到大厅的文本 Confirm() ;点击蓝色的确认按钮(如果出现更新提示等消息) Text := "|<确认>*192$51.zz1zyDy7s0s0TUzkz0601y3y7s0U0TkTkzksT3z3y7yC3kTwzkzlk00zzy7wC0073zkzU800kDy7s1X761zkz0AMMsDw7s1U07lzUT2A00yDw3sFU07lzUT2AMMyDs1sFX77kb2DWAEEy0kkwF007k663W800y0VsA1737k8D0U0wsy23w407W7UUTUXkw0wC7y6SDU7nlzsU" - if (ok := FindText(&X, &Y, 1429 - 150000, 906 - 150000, 1429 + 150000, 906 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("发现更新,尝试点击") FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<一周内不再提示的空框>*200$28.7zzzVzzzz7zzzyzzzzzk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000DzzzzxzzzzXzzzwU" - if (ok := FindText(&X, &Y, 1076 - 150000, 1030 - 150000, 1076 + 150000, 1030 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("发现公告,尝试勾选一周内不再提示后关闭") FindText().Click(X, Y, "L") Sleep sleepTime Text := "|<叉叉>*174$29.bzzzxDzzzmDzzz6DzzwSDzzlyDzz7yDzwTyDzlzyDz7zyDwTzyDlzzy77zzy8Tzzy1zzzy7zzzs7zzzU7zzy67zzsS7zzVy7zy7y7zsTy7zVzy7y7zy7sTzy7Vzzy67zzy0Tzzy1zzzyE" - if (ok := FindText(&X, &Y, 1640 - 150000, 337 - 150000, 1640 + 150000, 337 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } @@ -290,7 +291,7 @@ OutpostDefence() { BackToHall AddLog("==========前哨基地收菜任务开始==========") Text := "|<前哨基地>*96$123.zzzzzzzzVzz0000TUw40Dzzzzzzzw43U0003w0UU1zzzzzzztUUQ0007w0400DzzzzzzsA47U000zU0U0VzzzUzzk0UUyE007w040ADvzs7y0040Dy000zU001VwDz0zU0001zk007y0U0AD0zk0Q0400Ty000zw60VV83w01U0kUUzk007zUk4A80000A07007y000sw70U100001UU000zk0007Uo4080000Q40007y0000w0UV30000TUU000y00007U04Ds07zUw401s700001w0UVv07zQ7UU000k0000z047z0031Uw40007001k1U3Uzk00MA7UUU00s0M00A0w7w0011Uw44007s0001UTU00008A7UUUTUy000MSDy008011Uw046070007bzzk03108A7U0U00s4060zzz0Ds011Uw04007Xy007zzzzz008A7U1U00y0000zzzzzs011Uw7w1w7s000Dzzzzz1k8A7UzUz0z003zzzzzzs011UyDw7UDs1zzzzzzzz008A7zzUw1zzzzzzzzzzs03jUzzw7UTzzzzzzzzzz00Ds7zzUyDzzzzzzzzzzsT1s1zzwDzzzzzzzzzzzz3UD0DzzzzzzzzzzzzzzzsM3w3zzzzzzzzzzzzzzzz30TVzzzzzzzzzzzzzzzzsQDzzzzzzzzzzzzzzzzzz3nzzzzzzzzzzzzzzzzzzw" - if (ok := FindText(&X := "wait", &Y := 5, 852 - 150000, 1069 - 150000, 852 + 150000, 1069 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击进入前哨基地") FindText().Click(X, Y, "L") Sleep sleepTime @@ -300,22 +301,22 @@ OutpostDefence() { return } Text := "|<%>*74$24.U7y703y703w713wD33wD33sD33sT33sT33kT33kz33Uz33Vz33Vz033z033zU73zkC3zzy7zzw7zzwDzzwDzzsTzzsTzzsTzzks7zkk1zUU1zVU0zVUkz3Vkz3Vkz3Vky7Vky7Vky7VkwDVkwDVksTU0sTU0szk1szs3U" - if (ok := FindText(&X := "wait", &Y := 10, 2329 - 150000, 1278 - 150000, 2329 + 150000, 1278 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 10, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击左下角资源") FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<免费一举歼灭的红点>*194$67.000000000C0000000000zs000000000sD000000001k1k00000001kwQ00000000lz600000000lzlU0000000tzwk0000000Rzy80000000QzzbzzzzzzzyTzm00000003Dzt00000000nztU0000000Nzwk00000004TwM000000017wM00000000k0M00000000A0M000000001zs0000000007s0000000003k0000000001U0000000000k0000000000M0000000000A0E" - if (ok := FindText(&X, &Y, 1251 - 150000, 1136 - 150000, 1251 + 150000, 1136 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime Text := "|<进行歼灭>**50$96.00001M0000000000D3vs3xzyTz7yTzzzNX/873zzzzz2M003EnC8CC01k0U2E001MTCCQO03k10CM003AS07kvzzQzswTyDz6s03ly00Azwk06803s03nY00834k3q9w0CCCT7zz814k3S9YznCA6C01MXwz6C94kTCDAA01NnsTaSD4US47MS01lm01gSCAwE01kTyDlW01coCAQM01UM28U3sTcw6M4QCDkM28o7wzDg7k4KOAyM28z64k7M304QO8KM28344k0sXU4Mm82M287A4k1llkQQm82M28CA4k3VswsBzz2MS8QM4kS3QDk0zl2My8Mk4kM6C3Xk012MU8Fk4kEQ71nw032MkMPU4kls3nSDzz3sTkT07kTU0z00003kD0007UC000U" - if (ok := FindText(&X, &Y, 1393 - 150000, 1054 - 150000, 1393 + 150000, 1054 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击进行歼灭") FindText().Click(X, Y, "L") Sleep sleepTime Text := "|<获得奖励的图标>*191$34.zzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzk00TzzU01zzz00Dzzw01zzzs07zzzk0zzzz07zwTy0Tw1zw3zk7zkTz0TzVzw1zzDzk7zxzz0Tzzzw1zzzzk7zzzz0Tzzzw1zzzzk3zzzz000000000001U00007U0001s" - while !(ok := FindText(&X, &Y, 1375 - 150000, 1168 - 150000, 1375 + 150000, 1168 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm Sleep sleepTime } @@ -324,14 +325,14 @@ OutpostDefence() { else AddLog("没有免费一举歼灭") AddLog("尝试常规收菜") Text := "|<获得奖励的图标>*191$34.zzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzk00TzzU01zzz00Dzzw01zzzs07zzzk0zzzz07zwTy0Tw1zw3zk7zkTz0TzVzw1zzDzk7zxzz0Tzzzw1zzzzk7zzzz0Tzzzw1zzzzk3zzzz000000000001U00007U0001s" - if (ok := FindText(&X, &Y, 1375 - 150000, 1168 - 150000, 1375 + 150000, 1168 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { AddLog("点击收菜") FindText().Click(X, Y, "L") Sleep sleepTime } AddLog("尝试返回前哨基地主页面") Text := "|<%>*74$24.U7y703y703w713wD33wD33sD33sT33sT33kT33kz33Uz33Vz33Vz033z033zU73zkC3zzy7zzw7zzwDzzwDzzsTzzsTzzsTzzks7zkk1zUU1zVU0zVUkz3Vkz3Vkz3Vky7Vky7Vky7VkwDVkwDVksTU0sTU0szk1szs3U" - while !(ok := FindText(&X, &Y, 2329 - 150000, 1278 - 150000, 2329 + 150000, 1278 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Confirm Sleep sleepTime } @@ -346,14 +347,14 @@ Expedition() { AddLog("==========派遣委托任务开始==========") AddLog("查找派遣公告栏") Text := "|<派遣公告栏的图标>*145$58.zzzzsTzzzzzzzy0zzzzzzzzU0zzzzzzzw00zzzzzzz000zzzzzzk1k1zzzzzw0Dk1zzzzzU3zU1zzzzs0yDU1zzzy0DUDU3zzzU1wQDU3zzw0T3wTU3zz07kzsT03zk1yDzsT07w0DVzzsT07U3sTzzsz040y7zzzsy00Dlzzzzky01wTzxzzky0D3zzXzzls0szzw7zzVU3bzzUDzza0CTzw0TzyM0tzzs1zztU3bzzkDzza0CTzzVzzyM0tyzzDzjtU3btzzzyza0CTbzzznyM0tyDzzzDtU3bszzzsza0CTVzzzXyM0ty7zDwDtU3bsDkTkza0CTUy0y3yM0ty1k0kDtU3bs6010za0CTU0003yM0ty0000DtU3bs0000za0CTU0003yM0ty0000DtU3by0001za0CTw000TyM0tzw007ztU3Vzw01zy60DXzw0DzVs0T3zs3zsT00T3zszz7k00T7zzzky080z7zzwDU3s0y7zz3s0Ts0y7zsz07zk0y7y7k1zzk1yDVw0Tzzk1w8T03zzzk1w7s0zzzzU1wy0DzzzzU3zU3zzzzzU3s0TzzzzzU307zzzzzz001zzzzzzz00Tzzzzzzz03zzzzzzzz0zzzzzzzzyDzzzzU" - if (ok := FindText(&X := "wait", &Y := 5, 1406 - 150000, 1288 - 150000, 1406 + 150000, 1288 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Text := "|<带红点的派遣公告栏>*134$89.zzzzzzzzzzzzzUDzzzzzzzzzzzzw07zzzzzzzzzzzzkQ7zzzzzzzzzzzz3yDzzzzzzzzzzzyDyTzzzzzzzzzzzszwzzzzzzzzzzzzlzxzzzzzzzzzzzzXzvzzzzzzzzzzzz1zrzzzzzzzzzzzy0TDzzzzzzzzzzzw0STzzzzzzzzzzzw00zzzzzzkzzzzzs01zzzzzy0zzzzzs07zzzzzk0Tzzzzs0Tzzzzz00Dzzzzw3zzzzzs007zzzzzzzzzzz0707zzzzzzzzzzs0TU3zzzzzzzzzz03zU1zzzzzzzzzw0T7k0zzzzzzzzzU3s3s0zzzzzzzzw0DXVw0Tzzzzzzzk1wDlw0Dzzzzzzy0DVzky07zzzzzzk1wDzsT07zzzzzy07kzzwDU3zzzzzk0y7zzyDU1zzzzzU7kzzzy7k1zzzzz0z7zzzz3s3zzzzw3szzvzzVw7zzzzsD3zzXzzlsDzzzzkQTzy3zzkkTzzzzktzzs3zztUzzzzz1nzzU3zzn1zzzzy3bzzU7zza3zzzzw7DzzUTzzA7zzzzwCTzzVzzyMDzzzzkQzTzbzrwkTzzzzUtyTzzzjtUzzzzz1nwzzzyTn1zzzzy3bszzzwza3zzzzw7DlzzzlzA7zzzzsCTVzzzXyMDzzzzkQz3z7y7wkTzzzzUty3w7wDtUzzzzz1nw7k7kTn1zzzzy3bs7030za3zzzzw7Dk4021zA7zzzzsCTU0003yMDzzzzkQz00007wkTzzzzkty0000DtUzzzzz1nw0000Tn1zzzzy3bs0000za3zzzzw7Dw0003zA7zzzzsCTw000TyMDzzzzkQzy003zwkTzzzzUsTz00DzVUzzzzz1wTzU1zwD1zzzzy1wDzUDzVw3zzzzw0y7zlzyDU7zzzzw0T7zzzky0Dzzzzw0DXzzy7k1zzzzzy0DVzzky07zzzzzz07kzz7k0zzzzzzz03sTsT07zzzzzzzU3wT3s0zzzzzzzzk1w8T03zzzzzzzzs0y3s0Tzzzzzzzzs0TDU3zzzzzzzzzw0Tw0Tzzzzzzzzzy0DU1zzzzzzzzzzz060Dzzzzzzzzzzz001zzzzzzzzzzzzU0Dzzzzzzzzzzzzk0zzzzzzzzzzzzzs7zzzzzzzzzzzzzszzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzTzzzzzzzzzzTUtk3wtzaTwtnzw81l07lly03tl7zwUzW0DXlw03VmDzz47s0CDlk0C00Dzi0Ds0sTVbXy00Ty40wM1lXX00CDzzy81kk3qDi00QTzzzk0lU7wTzzzkE7zzYVn0Dlny07UUDzs9ba0T7bs063zzzmHDA0wD7lyADzzz4UA01k07XwSTzzyF0E01U0D00wk1zwaQr03XyS01tU3zs" - if (ok := FindText(&X := "wait", &Y := 5, 1341 - 150000, 1290 - 150000, 1341 + 150000, 1290 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { AddLog("点击派遣公告栏") FindText().Click(X, Y, "L") Sleep sleepTime Text := "|<全部领取的符号>*190$28.zz3zzzwDzzzkzzzz3zzzwDzzzkzzzz3zzzwDzzzkzzzU07zy00zzw03zzs0TzzU3zzz0Dz7y1zUTs7y1zkzs7zbzUTyzy1zzzs7zzzUTzzy1zzzs7zzzU000000000U0006" - if (ok := FindText(&X := "wait", &Y := 3, 1431 - 150000, 1150 - 150000, 1431 + 150000, 1150 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { AddLog("点击全部领取") FindText().Click(X, Y, "L") Sleep sleepTime @@ -361,12 +362,12 @@ Expedition() { Sleep sleepTime } Text := "|<全部派遣的符号>*193$35.00Ty0007zz000zzzU03zzzU0DzzzU0zzzzU3zzzzUDzzzzUTzzzzVzbwzz3y7kzz7w3UzyTw3Uzwzw3Uztzw3Uzvzw3Uzzzy3Uzzzs71zTzUQ7yzy1kTxzs71znzUw7zXy3UTz7wDVzwDwzbzsDzzzzUTzzzz0Tzzzw0Tzzzk0Tzzz00Tzzw00Dzzk007zy0001zU08" - if (ok := FindText(&X := "wait", &Y := 3, 1230 - 150000, 1150 - 150000, 1230 + 150000, 1150 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<派遣的符号>*191$33.zzUDzzzU0Dzzk00Tzs000zy0003zU000Ds0000y00003k0000Q0k601UD1s081wTU007ly000T7s001wTU007ky000T3s003wT000z7k00Dlw003sT000y7k00DXw041sT01U61k0C00003k0000T00007w0001zk000Tz0007zw001zzs00zzzk0TzU" - if (ok := FindText(&X := "wait", &Y := 3, 1326 - 150000, 1154 - 150000, 1326 + 150000, 1154 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击全部派遣") FindText().Click(X, Y, "L") Sleep sleepTime @@ -383,29 +384,29 @@ CashShop() { AddLog("==========付费商店任务开始==========") AddLog("寻找付费商店") Text := "|<付费>*190$44.003U3zz0M0sDzzsD0C3zzy7k3UTzz1s1y7zzkyzznzzzTzzwzzzrzzyDyxzw0S0yDSz23VzXqDlksDzzVwSC1zzsD7XUDyS3kws3XXUQCC0tss703UDzy3k0s3yzwQ3y7z1z71zVz01VkTkA000Q000000U" - if (ok := FindText(&X := "wait", &Y := 3, 800 - 150000, 863 - 150000, 800 + 150000, 863 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Text := "|<带点的商店>*197$82.000000000008zs00000000000lz000000000003Vk00000000000304000000000007Xk00000000000Dw000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000s000000001k007U00000000D00Tzz0000000zzz7zzw000000DzzwTzzk000000zzz1zC00000000DXk7Uw00000000STMS3zk000000TzzVsDz0000001zzy7Uzw0000007zysS3k0000000TxzVsTy0000001zXy7zzs0000007zzsTzzU000000TzvVrkS0000001rbiDS1s0000007TysxzzU000000RzvXrzy0000001rzyCTzs000000787sNs00000000Q0C00000000001U0000000000008" - if (ok := FindText(&X, &Y, 934 - 150000, 854 - 150000, 934 + 150000, 854 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { AddLog("点击付费商店") FindText().Click(X, Y, "L") Sleep sleepTime Text := "|<一级页面小红点>**50$19.1zs3kS3U1VbwNb7Ab0nn0Bt06QU1CE1b80ra0HNUNgMtX7klk1kT3k3zUU" - if (ok := FindText(&X := "wait", &Y := 3, 312 - 150000, 317 - 150000, 312 + 150000, 317 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击一级页面") FindText().Click(X, Y, "L") Sleep sleepTime } Text二级红点 := "|<二级页面小红点>*199$66.000000003y000000000DzU00000000S1s00000000k0M00000001nyAzzzzzzzXbzCzzzzzzzzDzazzzzzzzzDzbzzzzzzzzDznzzzzzzzzDznzzzzzzzzDznzzzzzzzzDznzzzzzzzzDzXzzzzzzzz7zazzzzzzzzXzCzzzzzzzzlwAzzzzzzzzs0wzzzzzzzzz3kzzzzzzzzzzUzzzzzzzzzzUzzzzzzzzzzUzzzzzzzzzzUU" - while (ok := FindText(&X := "wait", &Y := 3, 515 - 150000, 402 - 150000, 515 + 150000, 402 + 150000, 0.1, 0.1, Text二级红点, , , , , , , currentScale, currentScale)) { + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text二级红点, , , , , , , currentScale, currentScale)) { AddLog("点击二级页面") FindText().Click(X, Y, "L") Sleep sleepTime Text三级红点 := "|<三级页面小红点>*169$47.zzzzzzztzzzzzzzvzzzzzzzzzzzzzzzzzzzzzzzzzzzzlzzzzzzw0TzzzzzkwTzzzzz7wTzzzzyTwTzzzztzwzzzzznztzzzzzbztzzzzzDznzzzzyTzbzzzzwzyTzzzzszwzzzzzsznzzzzzky7zzzzzk0Tzzzzzs3zw" - if (ok := FindText(&X := "wait", &Y := 3, 337 - 150000, 509 - 150000, 337 + 150000, 509 + 150000, 0.1, 0.1, Text三级红点, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text三级红点, , , , , , , currentScale, currentScale)) { AddLog("点击三级页面") FindText().Click(X, Y, "L") Text := "|<付费商>**50$58.3sTbzzU3s0RVaT4TTszla6N00BzXzCMtbl4o00Alzbk03T77qA0700TwwTsk0Q00Tlnv3z7E01s00gDyTlnbU02sttcDAyRr9nbak0LM70XDCPU0NUy24wtaDtaE38Hza9naNbAVByMbCNaQn4rtz1XyM3AHM6UC1tjwlBUy3z7bz77nzDwTzkDwTDsy07D0T8" - while !(ok := FindText(&X, &Y, 236 - 150000, 100 - 150000, 236 + 150000, 100 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Confirm } } @@ -422,7 +423,7 @@ NormalShop() { BackToHall AddLog("==========普通商店任务开始==========") Text := "|<商店>*175$61.zzzzzzzsDzzzzzzzzw7zzzsTzzzy007zs7yDk0003zw007k000000003s000000001w007zU000Dy3z7zk0DUTz1z1zzw7kTzUzU07y3sDTkTk03z0007sDs01k0003w7w00k0001y3y1zs003Uz3z1zw71UkTVzU0C31k0Dkk00710w07sM003U0y03wA001k0011w60TUs801Uy33zkQ400kT1VzsC33sMDVkE071VsA7Us003Uk063kQ001kM033sS03UsA3w1wD1zzw6Dy0zbbzzy3zz0zzzzzz1zzrzzzzzzUzzzzzzzzzk" - if (ok := FindText(&X := "wait", &Y := 3, 903 - 150000, 942 - 150000, 903 + 150000, 942 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击商店图标") FindText().Click(X, Y, "L") Sleep sleepTime @@ -433,24 +434,24 @@ NormalShop() { return } Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - if (ok := FindText(&X := "wait", &Y := 2, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { AddLog("已进入百货商店") } loop 2 { Text100 := "|<100%>*205$34.XUC0loA0k3KQnnDBPnDAwlDAwnnxwnnDDbnDAwyTAwnnmAnnDD+n0A0tfC0s3a8" - while (ok := FindText(&X := "wait", &Y := 2, 401 - 150000, 913 - 150000, 401 + 150000, 913 + 150000, 0, 0, Text100, , , , , , , currentScale, currentScale)) { + while (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text100, , , , , , , currentScale, currentScale)) { AddLog("点击免费商品") FindText().Click(X, Y, "L") Sleep sleepTime Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X, &Y, 236 - 150000, 100 - 150000, 236 + 150000, 100 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { AddLog("点击购买") FindText().Click(X, Y, "L") Sleep sleepTime } ;确认至百货商店页面 Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } @@ -458,13 +459,13 @@ NormalShop() { AddLog("没有可白嫖的东西") } Text := "|<芯尘盒>*174$62.1UM00k00600wD00S003k0Tzw1ba03z0Tzzkxvk3zwDzzwSSy3zztzzyDbbnzzz3mw7lsyzzzUNq1sS77zzk0w0A7UUTzs07U00k07zy0RsE0S01zzVzDS07U0DzkTn7Vzzs7zy7w1sTzy3zzlz0D7zzUzzwxkTk1s0DzzDSDw0S03zzkbzkTzzvzzz1zs7zzyzzzk7w1zzzjzzy" - if (ok := FindText(&X := "wait", &Y := 2, 619 - 150000, 727 - 150000, 619 + 150000, 727 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击芯尘盒") FindText().Click(X, Y, "L") Text := "|<信用点的图标>*169$29.000k0001s000Tk001vk007Xk00TDk03znk0DzDU0zyTU7zzz0Tzzz1zzzz7zzzwjzzxnDzzy6Dzzs0TzvU8zzy09zzk0DTr00DzQ00TxU00Te000Ts000RU000Q0000E004" - if (ok := FindText(&X := "wait", &Y := 5, 1376 - 150000, 1009 - 150000, 1376 + 150000, 1009 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X, &Y, 236 - 150000, 100 - 150000, 236 + 150000, 100 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { AddLog("点击购买") FindText().Click(X, Y, "L") Sleep sleepTime @@ -477,19 +478,19 @@ NormalShop() { } ;确认至百货商店页面 Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } Text := "|**50$38.TzyDzzo1Uy1k50E3UA1HwQtzDozDCTHvDnnUI2kA0s50gz0STHvDlbbwzm4ss30QVjC0k5sTTzzzU" - if (ok := FindText(&X := "wait", &Y := 2, 636 - 150000, 625 - 150000, 636 + 150000, 625 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Text := "|<刷新的图标>*154$19.zlzz07y00C7w77z37z1bzs3zzVzz8zzUTzlzzs7zwUDwMDwA7wC0sD80Dz0Tk" - while (ok := FindText(&X, &Y, 612 - 150000, 646 - 150000, 612 + 150000, 646 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + while (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("免费刷新一次") FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X := "wait", &Y := 2, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } @@ -502,129 +503,129 @@ NormalShop() { ArenaShop() { AddLog("==========竞技场商店任务开始==========") Text := "|<竞技场商店的图标>*127$42.zzs0DzzzzU03zzzz001zzzy1y1zzzw7z0zzzsTTUzzzswDUzzzkwDUlzylwDUwTsVsDVz7lXsD1zXXXsS3zl7XsE7zt7XU0TzsD301zzsD3U0Tzs73kkTzsb3ksDzlXXks7zntXkw7wrxVUw3szzVUy1kzzk1z01zzk1z03zzw1zU7zzy3zsTzU" - if (ok := FindText(&X, &Y, 241 - 150000, 874 - 150000, 241 + 150000, 874 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("进入竞技场商店") FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<燃烧代码的图标>*100$15.ztzyDz1zkDw0z07k0S23UsAD01s0DUVw4DldyD7nwww" - if (ok := FindText(&X, &Y, 817 - 150000, 800 - 150000, 817 + 150000, 800 + 150000, 0.23, 0.23, Text, , , , , , , currentScale, currentScale)) and g_settings["BookFire"] { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.23, 0.23, Text, , , , , , , currentScale, currentScale)) and g_settings["BookFire"] { loop ok.Length { FindText().Click(ok[A_Index].x, ok[A_Index].y, "L") Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok1 := FindText(&X := "wait", &Y := 2, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { AddLog("购买燃烧代码手册") FindText().Click(x, y, "L") Sleep sleepTime Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok2 := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } } } Text := "|<水冷代码的图标>*122$17.zrvzDbwSDkQDUkS1Vs1bU3z07w0Ds0TU0z01z07y0Ty1zs" - if (ok := FindText(&X, &Y, 817 - 150000, 800 - 150000, 817 + 150000, 800 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["BookWater"] { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["BookWater"] { loop ok.Length { FindText().Click(ok[A_Index].x, ok[A_Index].y, "L") Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok1 := FindText(&X := "wait", &Y := 2, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { AddLog("购买水冷代码手册") FindText().Click(x, y, "L") Sleep sleepTime Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok2 := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } } } Text := "|<风压代码的图标>*150$21.zwTzz1zzkCDy00s017U6QbzrU000z00Czzzk07zs0TzznzzDTztnzz4Tzw7w" - if (ok := FindText(&X, &Y, 817 - 150000, 800 - 150000, 817 + 150000, 800 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["BookWind"] { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["BookWind"] { loop ok.Length { FindText().Click(ok[A_Index].x, ok[A_Index].y, "L") Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok1 := FindText(&X := "wait", &Y := 2, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { AddLog("购买风压代码手册") FindText().Click(x, y, "L") Sleep sleepTime Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok2 := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } } } Text := "|<电击代码的图标>*110$12.zxztznznzXz7y7y7w7s7k1k0U001w3y7w7wDwTwztztzvzrzU" - if (ok := FindText(&X, &Y, 817 - 150000, 800 - 150000, 817 + 150000, 800 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["BookElec"] { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["BookElec"] { loop ok.Length { FindText().Click(ok[A_Index].x, ok[A_Index].y, "L") Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok1 := FindText(&X := "wait", &Y := 2, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { AddLog("购买电击代码手册") FindText().Click(x, y, "L") Sleep sleepTime Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok2 := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } } } Text := "|<铁甲代码的图标>*150$20.sDVs1kC00100000000000000006001k00z00zk1zw0zy0DzU3zs0zy0Tzk7zy7zs" - if (ok := FindText(&X, &Y, 817 - 150000, 800 - 150000, 817 + 150000, 800 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["BookIron"] { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["BookIron"] { loop ok.Length { FindText().Click(ok[A_Index].x, ok[A_Index].y, "L") Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok1 := FindText(&X := "wait", &Y := 2, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { AddLog("购买铁甲代码手册") FindText().Click(x, y, "L") Sleep sleepTime Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok2 := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } } } Text := "|<代码手册宝箱>**50$75.000007z00000000007UT0000000001U0A000000000zjjk00000000z757s0000000y1cc7s000001y1z7w7w00001y1y03w3w000Tw1m002Q1zk0SQ1VU508C1lkC0Xo00s07S03X0Do000000BU6E0i000000180S1l000000U4M7Yz008000E0WnwC7U000000C3tUU7U00000C08A70700000D0D1Uj07s0s0z0D0A3C0Dk50z0761XhS0DU07U7VYAF7w0D07U7XclWDbw0D7U3X92Clg7w0xs3llUHQAATwk0Hko03H1wCDq02k30s6MAsMCQ0a00R0n1UsMsU+c0S86MA1kxlDR0C10n1U1kXU08D086MA03o6107010n1U03UME7U086MA004141U010n1VU0U9U00086MAr041000010n1a70UA000086MAE640M00010n1W0EU0000086MAk340000010n1a0MU0000086MAE240000010o" - if (ok := FindText(&X, &Y, 817 - 150000, 800 - 150000, 817 + 150000, 800 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["BookBox"] { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["BookBox"] { FindText().Click(x, y, "L") Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok1 := FindText(&X := "wait", &Y := 2, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("购买代码手册宝箱") FindText().Click(x, y, "L") Sleep sleepTime Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok2 := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } } Text := "|<礼包>**50$36.SD03U0SD07k0/D06zyvj0CTyxj0Tzyxj0s1S7j0vzSDD0RzSTD0BjSvj0BDSVz0Bzyvz0BzyzjCDzwDDCD0KCDC707CDy7zzC7y7zzU" - if (ok := FindText(&X, &Y, 817 - 150000, 800 - 150000, 817 + 150000, 800 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["ArenaShopPackage"] { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["ArenaShopPackage"] { FindText().Click(x, y, "L") Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok1 := FindText(&X := "wait", &Y := 2, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { AddLog("购买简介个性化礼包") FindText().Click(x, y, "L") Sleep sleepTime Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok2 := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } } Text := "|<熔炉>**50$41.70Q0M10C1s1s70QzT3k/0hyz7nrryTqSzjiD1RxfxMnrH3LuXjjY6cJ6xrBvEjcnavazLEjczA0WXvwSPx5yUswyCPNxlBsAmPv6Tk1zIoDxU7gccxa0DNTFtg0Q2yXls0E7z33U2" - if (ok := FindText(&X, &Y, 817 - 150000, 800 - 150000, 817 + 150000, 800 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["ArenaShopFurnace"] { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) and g_settings["ArenaShopFurnace"] { AddLog("购买公司武器熔炉") FindText().Click(x, y, "L") Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok1 := FindText(&X := "wait", &Y := 2, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(x, y, "L") Sleep sleepTime Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok2 := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } @@ -635,13 +636,13 @@ ArenaShop() { ScrapShop() { AddLog("==========废铁商店任务开始==========") Text := "|<废铁商店>**50$42.03zzzk006000M004000A00A000400M000600MTzy200kE03300Uk011U1Ubs1VU314C0Uk3343Ukk6240kEM6660888A43U8AA8A0s846MM7w866kE4Ds23kk43U33UU40s11UU6081Vkk3U811kE0s823MM7w866884Ds46AA43UAA4640s8A62608MM333U8kE310s8Uk1VUC9VU0UU3t1U0kk03300ETzy300M000600A000400A000A006000M007zzzs0U" - if (ok := FindText(&X, &Y, 172 - 150000, 1080 - 150000, 172 + 150000, 1080 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } if g_settings["ScrapShopGem"] { Text := "|<珠宝>**50$41.00Q01s0zjs03k3TREDyzziewTxzrRRwzzxWbvts0/5DrnU0Kvwc7zzxr/E7wzbjyz7xz7Tky0O02bVwDrs5130TDk+a60zRUrT61yv7Xyy0BSDzpyTuzDz+xzrjEQInzzz" - if (ok := FindText(&X, &Y, 353 - 150000, 723 - 150000, 353 + 150000, 723 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } @@ -653,16 +654,16 @@ ScrapShop() { return } Text := "|*124$23.76CMCAAkQMN0kksEVVkV33V267649DA0GCM0UME10kU21V8Ym2F1YUW31Vgi78" - if (ok := FindText(&X, &Y, 1535 - 150000, 854 - 150000, 1535 + 150000, 854 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X, &Y, 236 - 150000, 100 - 150000, 236 + 150000, 100 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") ;确认至百货商店页面 Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } @@ -670,21 +671,21 @@ ScrapShop() { if g_settings["ScrapShopVoucher"] { loop 6 { Text := "|<礼物的图标>*195$22.3sS0Tnw1XwM67VUMQCDzDzzwzzznzzzDzzwzzznzzzDzzwzs0000000Dwzkznz3zDwDwzkznz3zDwDwzW" - if (ok := FindText(&X, &Y, 353 - 150000, 723 - 150000, 353 + 150000, 723 + 150000, 0.1, 0.1, Text, , , , , , 1, currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , 1, currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|*124$23.76CMCAAkQMN0kksEVVkV33V267649DA0GCM0UME10kU21V8Ym2F1YUW31Vgi78" - if (ok := FindText(&X, &Y, 1535 - 150000, 854 - 150000, 1535 + 150000, 854 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X, &Y, 236 - 150000, 100 - 150000, 236 + 150000, 100 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") ;确认至百货商店页面 Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } @@ -693,41 +694,41 @@ ScrapShop() { if g_settings["ScrapShopResources"] { loop 6 { Text := "|<小时>**50$83.000003zw0000000000063zC00000000008AjzA000000000k0bzzA00000001006R7zC000Dzzzzzzzzzz401k000000001zy0C2000000000RA0lzU00000000TM16zk00000000Pk6SLk00000000OU9vvU00100A00q0nQxU0k71wM00Y0ARn03kC3zs01c2MCS07XRazs03E4k3o076PB/U0701UAc0CBrSL00+030Hk0Qviby00Q0G0xU0trBBw00c0b1a03nCPss03E07Uw0DkQ7lU07817yk0TXsAD00SE17j0003U0S01YU11k000000007N01U000000000vW01zzzzzzzzzz5A00008020V0lHC00000k00060VXA00001U0000MX7NE" - if (ok := FindText(&X, &Y, 353 - 150000, 723 - 150000, 353 + 150000, 723 + 150000, 0.3, 0.3, Text, , , , , , 1, currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3, 0.3, Text, , , , , , 1, currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|*124$23.76CMCAAkQMN0kksEVVkV33V267649DA0GCM0UME10kU21V8Ym2F1YUW31Vgi78" - if (ok := FindText(&X, &Y, 1535 - 150000, 854 - 150000, 1535 + 150000, 854 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X, &Y, 236 - 150000, 100 - 150000, 236 + 150000, 100 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") ;确认至百货商店页面 Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } } Text := "|<信用点>**50$62.21U00000C01kw0Tzy03k0Q7U7zzU0jyDzTVTDg081XjrwLrv02ztf0755Wk0c0uE1VTTgDvyAY0ELnv3yzW9UA5wykjzcuE11TTg/zuCY0EIK/2U2Udzw5xykjzc+E13TDg9zu2Y0Ezrv3zzUdzqDzykUu8+TzXlMgQ2j2b1tsK/7ivsdzyS5yXnjS+LxbVrswdnnbztkRyCCQstkA83C0300U" - if (ok := FindText(&X, &Y, 353 - 150000, 723 - 150000, 353 + 150000, 723 + 150000, 0.3, 0.3, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3, 0.3, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|*124$23.76CMCAAkQMN0kksEVVkV33V267649DA0GCM0UME10kU21V8Ym2F1YUW31Vgi78" - if (ok := FindText(&X, &Y, 1535 - 150000, 854 - 150000, 1535 + 150000, 854 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X, &Y, 236 - 150000, 100 - 150000, 236 + 150000, 100 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") ;确认至百货商店页面 Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" - while !(ok := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Confirm } } @@ -794,7 +795,7 @@ SimulationRoom() { AddLog("==========模拟室任务开始==========") AddLog("查找模拟室入口") Text := "|<模拟室>**50$62.7nzVs000T01zzyzyDUDs0PtnyzvzzDyCw0DjTrzUzrj03vkxs00BlxnwQDSTzXMDCy7Nbrzxr707lrNy01ttkFyxqNkMSAQ0PjTaSD73307lrtb7VlknlwBytU0AMA0S7TaTnzCDsznqlbwznXyDyw0RU0Aws0Dj63M037jUDvXUzwztvsnwtnjz7z6sSCDwvU00ljzzrzzzzzwTzDzUzzzzzU" - if (ok := FindText(&X, &Y, 1064 - 150000, 849 - 150000, 1064 + 150000, 849 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("进入模拟室") FindText().Click(X, Y, "L") Sleep sleepTime @@ -805,30 +806,30 @@ SimulationRoom() { return } Text := "|<模拟室>**50$58.Djz7r3k7s0zzzTyTzzznTARjzjzbzxk0ytyw00Dnn7nUvkD0w7Cy6/jDznkM1sNazTzznY7naPQ03rC0PiRgwSQMt1yNwnVlvUbblbnA03g20S6TAzbylzDwtwvyTv7wTvU1g01hQ0Di46k06xw1yskTyTxrnbnjAzsznQTCDtn003Bzzzzzzzzwzwzy3zzzzs" - while !(ok := FindText(&X, &Y, 245 - 150000, 99 - 150000, 245 + 150000, 99 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Confirm } ; 还在模拟中就退出(话说为啥) Text := "|<模拟结>*95$58.A6A3000E30kzsAM61UQ37zklcMC1kADQ37lUlzzwNkzP67LzzrzXxiMtVkATy36PXy70tzsANiDnzbrzUlUkiDzTM63q30s01zzszMA7s0DHz3lZszjyw3U37rXszunzwATS03VfDzklnw0i6A7Q3CQnysMlswQnnjvzXD1nk6AkDyAE040000kO" - if (ok := FindText(&X := "wait", &Y := 3, 2346 - 150000, 174 - 150000, 2346 + 150000, 174 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("退出进行中的模拟") FindText().Click(X, Y, "L") Sleep sleepTime Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X, &Y, 1354 - 150000, 869 - 150000, 1354 + 150000, 869 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } } Text := "|<开始模拟>**50$90.0000y3s1sSw7k0MTzzsq3s1/nb4rVwk00AW681DX3YoxYk00Aa6T1C01YoxYk00DbwTDD01wwbYzDnvXwtg3nbwQbY1AH20Mcw3X3EAnY1AH20Nwz703QQnY1AH3aE0TDDnQwt4zDnxAU0P7034otAk00BAlyO3034wzAU007Azzy3DnQAXAU007Azzq803EArAzDnz0k0wDsTEQyA28H1Vk0wDwzwom668H0lnwtC00wo66CMH0kn4xC00YwA2QMH1UHwrDkDYsQXskH3alwlDl7wtsnlUH27k0lC3UszllnUH3AE0lAClsznHz0H3sPyljwTzUTTS0S1kT7lvkDD000U" - if (ok := FindText(&X := "wait", &Y := 5, 1286 - 150000, 824 - 150000, 1286 + 150000, 824 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击开始模拟") FindText().Click(X, Y, "L") Sleep sleepTime } ;打过了就直接退 Text := "|<已通关>*197$62.00000001047zz0kzy0s7XzzsSDzUD1kTzy3kzk1kw007UQDs1zzk00s3DzUzzyQ0C03zwDzzb03U0zz03k1zzsTDzk0Q0Tzy7nzw0DU7zzVwzz7zzxs0s7DzlzzzQ001nzwTzzb000Qzz07w1k0C7ATk1zUS03Vz7w1xw7U0szli0yDkzzyTzztz1zDzz7DzyT07kzzUUTz7U0u" - if (ok := FindText(&X, &Y, 1091 - 150000, 1014 - 150000, 1091 + 150000, 1014 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("今日模拟室已通关") GoBack AddLog("==========模拟室任务结束==========") @@ -836,23 +837,23 @@ SimulationRoom() { } AddLog("选中5C") Text := "|<5>*163$22.7zzUTzz3zzwDzzkzzz3zzsDk00z003w00Dk00zz03zz0Dzz1zzy7zzwTzztz0zU01y007w00Dk00z003xw0Tzs1yTkDtzzzXzzw7zzUDzw0TzU0Ts2" - if (ok := FindText(&X, &Y, 1323 - 150000, 697 - 150000, 1323 + 150000, 697 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime // 2 } Text := "|*164$26.01zU03zz03zzw1zzzUzzzwTzzy7zUz3z03lzU08Tk007s003y000z000Dk003w000z000Dk003w000z000Dk001y000Tk007w000zk0MDy0T1zzzsDzzz1zzzUDzzk1zzs07zs007U2" - if (ok := FindText(&X, &Y, 1431 - 150000, 843 - 150000, 1431 + 150000, 843 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime // 2 } Text := "|<快速模拟的图标>**50$44.00Dzy0000C00w000C001k00C00060060000M030000301U0000M0k000030M00000E40000063000000kU102004M0s1k01Y0T0q00/06A8k02U1lX600s06AMk0600lX601U06AAM0M00lVX06006AAM1U00VV30M008MlU60068Qk1U036CM0M03a7A0601n3601U0tVX00M0MklU0B06M8k02E1g3M01a060Q00MU000004A0000031000001U800000k300000Q0M00006030000700Q0003U01U001U00D003k000Q03k0001zzU02" - if (ok := FindText(&X, &Y, 1399 - 150000, 1156 - 150000, 1399 + 150000, 1156 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击快速模拟") FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<跳过增益选择的图标>*141$26.s0k0D0D03w3s0zUzUDyDw3znzkzzzyDzzzvzzzzzzzzjzzznzvzszwzsDwDw3y3w0y0y0D0C010300U" - if (ok := FindText(&X := "wait", &Y := 3, 1164 - 150000, 1263 - 150000, 1164 + 150000, 1263 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("跳过增益选择") FindText().Click(X, Y, "L") Sleep sleepTime @@ -860,13 +861,13 @@ SimulationRoom() { EnterToBattle BattleSettlement Text := "|<模拟结束的图标>*159$38.03zzzy01zzzzs0zzzzy0Dk00Dk3k001w0w000D0D0003k00000w00000D000003k0U000w0M000D0S0003kDU000w7zzU0D3zzs03nzzy00xzzzU0Dzzzs03zzzy00xzzzU0DDzzs03lzzy00wDzzU0D0y0003k7U000w0s000D020003k00000w00000D000003k3k000w0w000T0DU00Dk3zzzzw0Tzzzy03zzzz0000302" - if (ok := FindText(&X := "wait", &Y := 5, 1223 - 150000, 990 - 150000, 1223 + 150000, 990 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击模拟结束") FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<确认>**50$48.Txw07UDUzzbsCkNUk37wAMNUk70ACANUwy0A7ANUAwSA3wNUAsQT1sNU9s01zsNUNw03UMNUM6QnUMFUk6MnwMEUla03yMEkVa032MkklaQn2MkklaMn2MUMNa032TUM9a032/aA9aMn637C84wn62D680wn4CBX9sw34QNlBdh36wstDDjz7bkTU" - if (ok := FindText(&X, &Y, 1307 - 150000, 868 - 150000, 1307 + 150000, 868 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } @@ -876,9 +877,9 @@ SimulationRoom() { SimulationOverClock() { AddLog("==========模拟室超频任务开始==========") Text := "|<剩余奖励的0>*80$26.s001wTzyCDzzl600C3001lU00AE0014000F0004E3w141VUF0E84E421410UF0E84E66140z0F0004E0014000FU00AA0071U03WDzzllzzsy000S" - if (ok := FindText(&X, &Y, 1268 - 150000, 1105 - 150000, 1268 + 150000, 1105 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Text := "|<开始超频>**50$66.00000C00000000yT+3rts0TzyqP+6zzTzE02aFySQDA1E03bnvs4N01SST1WObaNDb2OF0bDb4tC1SSTU0408k01yCTd041zk0tk039zzb0yQVwAD1zy30sEVSSTVUC1Au0VAGFlbC70u4dAmEljC70z6BMmFVbA7zyD7FWF7UAU0MSFP2FjUAs0NwxS3ltzzzzzjzU" - if (ok := FindText(&X, &Y, 1285 - 150000, 1046 - 150000, 1285 + 150000, 1046 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } @@ -888,64 +889,64 @@ SimulationOverClock() { return } Text := "|*168$49.03wzVzk3U0yT0Dk0E0DD03k09z7b3kszUzXn7wQzy01tXz60D00wlzX01U0CMzls0Hz7ATszz1zlaDwTzUzsnXwQzkDstk0S7k00Qy0TU0U0STUTs0s" - if (ok := FindText(&X := "wait", &Y := 5, 1241 - 150000, 846 - 150000, 1241 + 150000, 846 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<25>*121$44.U00y000k007U00A000s003000C000k001000DzzUEDzzzzw63zzzzz1Uzzzk00M00Dk006000w003U00C001s001U00y0000Dzzzzw03zzzzz00zzzzzk0001U000000E0010006000s001U00S000M00DU" - if (ok := !FindText(&X := "wait", &Y := 5, 1124 - 150000, 417 - 150000, 1124 + 150000, 417 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := !FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("未选择难度!跳过") return } Text := "|<开始模拟>*177$110.zzzzzzzzzzTztzzzzzzzzzzlzszzXwQDwTzyT0003wTwDzkw00z7Xz3U000T7z7zwC007lsTks000DlzVzz3U01wS0wS0003wTsszkz73z3UD7z3wDw0QCDk3ttz08Flzkz3y077ls0k07U2AQTwDkzU1VwD0A00w1X37z3wDyAEE3wD00Tlsslzkz3zX000T3lz7wSCATwDkzsl007kM00z7XX7U008QQEDlw200Tkszlk00076Dzzy0Vz3w2DsQ0001lXzzzU000w0XyDU000w8s03k000S0MzXzlz3z0C00w3z1zUCCkTsTkzw3U0C0zszx7U47y7wDzUszXUC007ls00zVz3zsCDss3001wS0UDkzkzy1XyDMk00T7UM1sDwDz0MzXyDs1zlkQ8Q7z3zVa7kzXwADwQC763zkzkTU0Dss70S7b1k0zwDwDs03wA3s71zkwMTz3z7y60z33zXkTyTjTzlzzzbzTtzzzyzzzzU" - if (ok := FindText(&X := "wait", &Y := 5, 1285 - 150000, 1235 - 150000, 1285 + 150000, 1235 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } loop 6 { Text := "|<获得>*120$30.xvzzzU0D8000C8sstwM0duxcsVkT80XnSA100A80s0880llwDlVlz009UzBntYTAnkCDCHWTDD3U" - if (ok := FindText(&X := "wait", &Y := 3, 1437 - 150000, 1037 - 150000, 1437 + 150000, 1037 + 150000, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } EnterToBattle BattleSettlement Text := "|<连结等级>*179$51.Mk663jVjnzsrwzyByDzDzjzXKkDXwkzwSqzzTTXzbrvjtnwzyQzDzDTDznrNzvzwzyzyAQ8NbznxnVVzACMTyzzzzUr3TuTt3w1s3FU" - if (ok := FindText(&X := "wait", &Y := 3, 1050 - 150000, 1158 - 150000, 1050 + 150000, 1158 + 150000, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X, &Y, 1354 - 150000, 869 - 150000, 1354 + 150000, 869 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { AddLog("模拟室超频第" A_Index "关已通关!") FindText().Click(X, Y, "L") Sleep sleepTime } } Text := "|<模拟通关>*103$63.rqzTzzzzzzyM1tbbQ0TDXm07AAkk3sswAHl1b71z2700A04yk3U0AM1l47w0C03V0DAUtUFz7w01s7640DszU0A0ssUF00001V67Y0A0130CA0wUFy3sE0t03YkDUDnUT8UM63sMSMEl8E0087UmD4TaHU1Xy4" - if (ok := FindText(&X := "wait", &Y := 5, 1285 - 150000, 1037 - 150000, 1285 + 150000, 1037 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("挑战最后一关") FindText().Click(X, Y, "L") } EnterToBattle BattleSettlement Text := "|<模拟结束的图标>*159$38.03zzzy01zzzzs0zzzzy0Dk00Dk3k001w0w000D0D0003k00000w00000D000003k0U000w0M000D0S0003kDU000w7zzU0D3zzs03nzzy00xzzzU0Dzzzs03zzzy00xzzzU0DDzzs03lzzy00wDzzU0D0y0003k7U000w0s000D020003k00000w00000D000003k3k000w0w000T0DU00Dk3zzzzw0Tzzzy03zzzz0000302" - if (ok := FindText(&X := "wait", &Y := 5, 1223 - 150000, 990 - 150000, 1223 + 150000, 990 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<确认>**50$48.Txw07UDUzzbsCkNUk37wAMNUk70ACANUwy0A7ANUAwSA3wNUAsQT1sNU9s01zsNUNw03UMNUM6QnUMFUk6MnwMEUla03yMEkVa032MkklaQn2MkklaMn2MUMNa032TUM9a032/aA9aMn637C84wn62D680wn4CBX9sw34QNlBdh36wstDDjz7bkTU" - if (ok := FindText(&X, &Y, 1307 - 150000, 868 - 150000, 1307 + 150000, 868 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<连结等级>*179$51.Mk663jVjnzsrwzyByDzDzjzXKkDXwkzwSqzzTTXzbrvjtnwzyQzDzDTDznrNzvzwzyzyAQ8NbznxnVVzACMTyzzzzUr3TuTt3w1s3FU" - if (ok := FindText(&X := "wait", &Y := 3, 1050 - 150000, 1158 - 150000, 1050 + 150000, 1158 + 150000, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" - if (ok := FindText(&X, &Y, 1354 - 150000, 869 - 150000, 1354 + 150000, 869 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2, 0.2, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } @@ -957,11 +958,11 @@ Arena() { AddLog("==========竞技场收菜任务开始==========") AddLog("查找奖励") Text := "|*103$36.V132Qn1162Mn99CGMHB9COMHD9CSMH312SMHV12SMHt3CSMHtDCSEH9DCGE31DC2H31D22H0XjX7H0U" - if (ok := FindText(&X := "wait", &Y := 3, 1451 - 150000, 749 - 150000, 1451 + 150000, 749 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击奖励") FindText().Click(X, Y, "L") Text := "|<领取>*179$44.sw0C07zwC0300zz3k0s000UTXzCA01XszlX74Q00w0tt1U0D0CQKDBXlXb7nn8wsslswmD6CAk3AXk3mA0m8w0w3yAWD4D1zb8XnXsTlmMwsS7UwaS03VkDkT01kC7w3k0s1kyATyAACC7XzW7XnXwzsnxU" - if (ok := FindText(&X := "wait", &Y := 3, 1443 - 150000, 1234 - 150000, 1443 + 150000, 1234 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击领取") FindText().Click(X, Y, "L") Sleep sleepTime @@ -971,13 +972,13 @@ Arena() { else AddLog("未找到奖励") AddLog("尝试确认并返回方舟大厅") Text := "|<方舟页面左上角的方舟>*111$36.zXzzVzzXzzVzz1zs03001s03001s33wDzsVXwTzslXw07st3w07U00w07U00sT7k33sz7sXXkz7kVXkz7llXVy7VzX3UDXy37kDXy7ztzzzDU" - while !(ok := FindText(&X, &Y, 246 - 150000, 100 - 150000, 246 + 150000, 100 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Confirm } AddLog("==========竞技场收菜任务结束==========") AddLog("进入竞技场") Text := "|<竞技场>*80$59.zUzwDVz70T001sT3y80C003kU0wE0S00C000sk1y3Vw0010w7U0081Uy0UT000MDVw001U03sE0Q403007k00QM0600C001ss0ADsQ033lk0M00s647U00k01sC0T00Vk07sQ1s013sEnkw3k66D1V3V01Vw8E704001jk0US0MAC3zW1Xz1stzDzyD" - while (ok := FindText(&X := "wait", &Y := 3, 1469 - 150000, 1024 - 150000, 1469 + 150000, 1024 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击竞技场") FindText().Click(X, Y, "L") Sleep sleepTime @@ -988,22 +989,22 @@ RookieArena() { AddLog("==========新人竞技场任务开始==========") AddLog("查找新人竞技场") Text := "|<新人竞技场>*92$92.wznzlzzszwTXyTzy7UDwTy00D7sz60C007z7zU03lk1tU3U0Tzlzy43s00CQ0wF7zwTz0kw0021kz4Fzy7z0010QDUEDU00zUzk00QD3s00000DsDz00T607303Vk3y3zk07k00tk0U0Fz0Tw01k00QS0804Tk3z00Q1677420F7sEzk071k3s18U4FwC7w01wS0w0W804S3kzkXj7US0FUE371w3sMtlk3VwMUElUzUE60EE09w0ACAMTyA3U4463z67bz7jzr3y3XbtzvXU" - if (ok := FindText(&X, &Y, 1036 - 150000, 773 - 150000, 1036 + 150000, 773 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击新人竞技场") FindText().Click(X, Y, "L") Sleep sleepTime } AddLog("检测免费次数") Text免费 := "|<免费>*186$36.wTzy4Ls0zk01k0zz4FVkzk01103k03003k00U1Xk00XXXwQMnXXUQFk03k03k03s03z0zszXy8zslXwMtsXXksts671s1UC0bw3UzsU" - while (ok := FindText(&X := "wait", &Y := 3, 1531 - 150000, 1159 - 150000, 1531 + 150000, 1159 + 150000, 0.1, 0.1, Text免费, , , , , , 3, currentScale, currentScale)) { ;3代表从下往上找 + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text免费, , , , , , 3, currentScale, currentScale)) { ;3代表从下往上找 AddLog("有免费次数,尝试进入战斗") FindText().Click(X, Y, "L") Sleep sleepTime ;检测是否开启快速战斗 Text := "|**50$34.0Q001sDS704lUCK0FA0BC15VsoA4IQlkMFF1X0t7A2A0oMU8nVlm0XD37A6Aq0IMtnC1Mz7AA5U0okMH06H0t71lA1w7w7k08" - if !(ok := FindText(&X := "wait", &Y := 3, 1155 - 150000, 1143 - 150000, 1155 + 150000, 1143 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if !(ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Text := "|*159$49.z7zk0TU0y0zU0700C07U0300671lzzXzyDsszzlzz7yATzszz7z601w03XzX00y01lzlXzz7zwzslzzXzyDsszzlzz3sQTzszzk0SDzwTzw0T7zyDzzUzXzz7zw" - if (ok := FindText(&X := "wait", &Y := 1, 1173 - 150000, 1142 - 150000, 1173 + 150000, 1142 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("有笨比没开自动战斗,帮忙开了!") FindText().Click(X, Y, "L") Sleep sleepTime @@ -1018,7 +1019,7 @@ RookieArena() { AddLog("没有免费次数,尝试返回") ;如果左上角有新人竞技场就点返回 Text := "|<新人竞技场>*111$93.lzXzVzzkzwTXyA0s10DwDy007XwTlU3007zVzs00wM0CA0M07zwDzlsz001lw7a8zzVzk00k00A31s17zwDy0030wT001001zVzk00QT3w00000Ds7zU0DV01lU0ss3z0zw01w00CC0004Ts3zXwC0XXll000Xy4Tw01sA8SC8014TVVzU0D3k7k2808XwC7w03wS0w0n00AT3kTslrXsD0QM8VXUz1w6AQQ0wT6ACAMDw61k3201zk1lvXXztkS0sMQDy8A" - if (ok := FindText(&X := "wait", &Y := 3, 176 - 150000, 96 - 150000, 176 + 150000, 96 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { GoBack } AddLog("已返回竞技场页面") @@ -1029,22 +1030,22 @@ SpecialArena() { AddLog("==========特殊竞技场任务开始==========") AddLog("查找特殊竞技场") Text := "|<特殊竞技场>*93$91.tyDzzDzlzsyDszzws1U07s00wT7wM0kQ0E03w00SA0CA0M60AC0DVkw0077kQ1sy207UkS0031kS0010030010wT0ED000U2DU00kyDU004k0l13w01wM0QM0CTsl00C00y00CC0600000700Q0077000040U7U0C137X00003kk7k071l3k000lXss3s03sw3k20QslwE0z0CwS3k34CSMsEUD36CC0sD6CDUMMF41U4406z07bsQSsy3k2633zW3nwDzwT7y77jtzv3U" - if (ok := FindText(&X, &Y, 1372 - 150000, 773 - 150000, 1372 + 150000, 773 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击特殊竞技场") FindText().Click(X, Y, "L") Sleep sleepTime } AddLog("检测免费次数") Text免费 := "|<免费>*186$36.wTzy4Ls0zk01k0zz4FVkzk01103k03003k00U1Xk00XXXwQMnXXUQFk03k03k03s03z0zszXy8zslXwMtsXXksts671s1UC0bw3UzsU" - while (ok := FindText(&X := "wait", &Y := 2, 1531 - 150000, 1159 - 150000, 1531 + 150000, 1159 + 150000, 0.1, 0.1, Text免费, , , , , , 3, currentScale, currentScale)) { ;3代表从下往上找 + while (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text免费, , , , , , 3, currentScale, currentScale)) { ;3代表从下往上找 AddLog("有免费次数,尝试进入战斗") FindText().Click(X, Y, "L") Sleep sleepTime ;检测是否开启快速战斗 Text := "|**50$34.0Q001sDS704lUCK0FA0BC15VsoA4IQlkMFF1X0t7A2A0oMU8nVlm0XD37A6Aq0IMtnC1Mz7AA5U0okMH06H0t71lA1w7w7k08" - if !(ok := FindText(&X := "wait", &Y := 3, 1155 - 150000, 1143 - 150000, 1155 + 150000, 1143 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if !(ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Text := "|*159$49.z7zk0TU0y0zU0700C07U0300671lzzXzyDsszzlzz7yATzszz7z601w03XzX00y01lzlXzz7zwzslzzXzyDsszzlzz3sQTzszzk0SDzwTzw0T7zyDzzUzXzz7zw" - if (ok := FindText(&X := "wait", &Y := 1, 1173 - 150000, 1142 - 150000, 1173 + 150000, 1142 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("有笨比没开自动战斗,帮忙开了!") FindText().Click(X, Y, "L") Sleep sleepTime @@ -1058,7 +1059,7 @@ SpecialArena() { } ;如果左上角有特殊竞技场就点返回 Text := "|<特殊竞技场>*113$93.tyDzz7zszyTnzDzz70Q18z007lwTtU30k1U07s00SC0DA0860C007ksDU01tw30SDkE0y73s00A3Us0060060030wTUED0U0k17k00SDXw00160C0MzU0DlU1kk0szXX00Q01y40DC0700A003U0D001ts0U00UA1w7Vs4ATC8020DVUDU0D1l3s180lXwQ1w01yD0y0F774TX07sFrlsDU4MstXsV0T6CSC0wDX77kQA8b0k3101bs0sy3Xr7kD0MMADyAD7kzzszDw7bjtzvXU" - if (ok := FindText(&X := "wait", &Y := 3, 176 - 150000, 96 - 150000, 176 + 150000, 96 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { GoBack } AddLog("已返回竞技场页面") @@ -1408,19 +1409,19 @@ UniversalTower() { EnterToArk AddLog("==========通用塔任务开始==========") Text := "|<无限之塔>**50$81.0007zzs1y0TjzXzzzzzzUCs3jjDM00w30A1X0Nstv007UM1jyTXA03M00wnDBznztk0vzDzas1g00TDjDTtzwr0BU03kS7bzDzattjzsy3kyk00QrDAzyCtsly003aM1U3XXAD3zkTwv0A0ssNU0zy3zbPjkCC3DkS1kMAnRi7XUNzzkQnTUPVlss730676TwrSSwC0kM0nlnvbvny3ry7DawSCQr3DUTzntwq7k3akMtk0Dv06vr0wqDjjU1wM0nwTzyzzzzzw3zyS0z7nkxsTz0TjY" - if (ok := FindText(&X := "wait", &Y := 3, 1503 - 150000, 623 - 150000, 1503 + 150000, 623 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { AddLog("点击无限之塔") FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|<塔内的无限之塔>*194$63.000000000E3zwTzs1U37QTznzz0C0PzsD0PMszz3Dy0k3Pz7zwyzU60TTs0D7nszzvvb01kMzbzzPTs0Q3zT1s3Dy070PzkD0Nvs1k3003s3zD0Q0Tzkv3TNkD07zyCQv3i7k0slrXzMTxzzk7ysDn3nATw0zo" - if (ok := FindText(&X := "wait", &Y := 3, 1526 - 150000, 600 - 150000, 1526 + 150000, 600 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("点击塔内的无限之塔") FindText().Click(X, Y, "L") Sleep sleepTime } Text := "|*83$39.0kCD0s041ls705kQ74scz7Usz77sw77ssz7Usz70sw76M877YsX10ssX4MD774MX7sssX4Mz770MX7sss34Ms7748300sll0M4TbSSL1U" - if (ok := FindText(&X := "wait", &Y := 3, 1141 - 150000, 596 - 150000, 1141 + 150000, 596 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("已进入塔的内部") stdTargetX := 1926 stdTargetY := 908 @@ -1441,40 +1442,40 @@ CompanyTower() { EnterToArk AddLog("==========企业塔任务开始==========") Text := "|<无限之塔>**50$81.0007zzs1y0TjzXzzzzzzUCs3jjDM00w30A1X0Nstv007UM1jyTXA03M00wnDBznztk0vzDzas1g00TDjDTtzwr0BU03kS7bzDzattjzsy3kyk00QrDAzyCtsly003aM1U3XXAD3zkTwv0A0ssNU0zy3zbPjkCC3DkS1kMAnRi7XUNzzkQnTUPVlss730676TwrSSwC0kM0nlnvbvny3ry7DawSCQr3DUTzntwq7k3akMtk0Dv06vr0wqDjjU1wM0nwTzyzzzzzw3zyS0z7nkxsTz0TjY" - if (ok := FindText(&X := "wait", &Y := 3, 1503 - 150000, 623 - 150000, 1503 + 150000, 623 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { AddLog("点击无限之塔") FindText().Click(X, Y, "L") Sleep sleepTime } ; 只要有一座塔是0/3就当作任务执行过了 Text := "|<塔的外部0/3>*121$23.szi7UyM28wn4tty9lbw3XDV76T3CBzWQnzYtbj83C0MCS1ztzzznzzzbzw" - if (ok := FindText(&X := "wait", &Y := 3, 1064 - 150000, 1154 - 150000, 1064 + 150000, 1154 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("今日企业塔已打过,返回") AddLog("==========企业塔任务结束==========") BackToHall return } Text每日通关 := "|<每日通关>**50$62.3k000000QS1zzTzrzzDbkPzrzxy0nTAA05U1NvBnrbTzPyLSDQttbzqlYy0K06M0NjtzhbyTbBrtyQM1zbznBy076mQFXk07jtRU700zNrv6HN9z7wrBqzYqqPkwA05jtRhjtXnzbM0IXxkyAznqzZS0Qxn0DlzzTzzwDk1s00000002" - if (ok := FindText(&X := "wait", &Y := 3, 1201 - 150000, 1154 - 150000, 1201 + 150000, 1154 + 150000, 0.1, 0.1, Text每日通关, , , , , , 5, currentScale, currentScale)) { ;5代表从左往右 + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text每日通关, , , , , , 5, currentScale, currentScale)) { ;5代表从左往右 count := ok.Length AddLog("今天有" count "座塔要打") FindText().Click(X, Y, "L") Sleep sleepTime loop count { Text := "|*83$39.0kCD0s041ls705kQ74scz7Usz77sw77ssz7Usz70sw76M877YsX10ssX4MD774MX7sssX4Mz770MX7sss34Ms7748300sll0M4TbSSL1U" - if (ok := FindText(&X := "wait", &Y := 3, 1141 - 150000, 596 - 150000, 1141 + 150000, 596 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("已进入塔的内部") Text := "|<泰特拉之塔>**50$96.0TU3sy3sy03s0yzwTtzjPrnMn03Q0rbjTlzzTXnMn03A0bb7M01tS0LTnzzjsa03TnzsTXyC0Dz7zbbDA01MDrw00D00DXbiA01MA0SDzzzwT1swzbzvQ0TTSPzwPbkSk00nTwvTSM0Mtb77wD3zTxz7SM0lka73wtXz00Q7Ck3XUakTstls00QDCk770bzyltUsTxzRCkCC1nUCyMDzSRbNglww3VU6T0DzTRXTgvVk33jaQ033PxbTwz1zzTjaMtl3PtaQ06M07xU6TVz3MlYQ0Cy061U6DzD3szbzzzrzy1zy0y03sS7k000601swU" - if (ok := FindText(&X, &Y, 1354 - 150000, 1206 - 150000, 1354 + 150000, 1206 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("这座塔是泰特拉之塔") } Text := "|<极乐>**50$38.DU001zXTzlzzMr0AM02xk360DiDRljzn1rMPP0sxrgqk7DMDDjxXq3k03MNxg00S6DPz7z7VaTvzVvPaStdQknbjTrSRnPnxb3tyyH9WCwBokvnz3DDzzkzk1s007k2" - if (ok := FindText(&X, &Y, 1316 - 150000, 1206 - 150000, 1316 + 150000, 1206 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { AddLog("这座塔是极乐净土之塔") } stdTargetX := 1926 stdTargetY := 908 - Sleep sleepTime + Sleep 5000 AddLog("点击最新关卡") UserClick(stdTargetX, stdTargetY, scrRatio) Sleep sleepTime @@ -1785,15 +1786,15 @@ Interception() { RankingReward() { EnterToArk() Text := "|<带红点的排名奖杯>**50$62.006M0NU0Tw003A03A0T7k01a00NUC0S00m003A6DlU0F000NVbCA08U003AnUn04E000Nhk6E280003/M0Y1400000Y090W00000902EF000003M0Y8000000m0N47zzzzzgkAm1U0000Nb6B0M00006MT6UC00001X03UDU0000TS7kb000000vzkHU0000031U8lk0000QsA0Mw0000D61U6P00003NVA1ak0000qMNUNA0000Aa3A6H000039UNVaE0000qM3ANY0000Ba0N2B00003tU30nk0000wk0MAS0000CA031VU0006600EA000013U003U00001k000D00001k0001w0003s00003U001k000U" - if (ok := FindText(&X := "wait", &Y := 3, 2389 - 150000, 242 - 150000, 2389 + 150000, 242 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime loop 2 { Text := "|<红点>**50$18.0y031kA0MMyAFrYX1Wa0mY0NA0NA0NY0NY0Ea0mnVaEz480860s1z0U" - while (ok := FindText(&X := "wait", &Y := 1, 1633 - 150000, 966 - 150000, 1633 + 150000, 966 + 150000, 0.3, 0.3, Text, , , , , , , currentScale, currentScale)) { + while (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3, 0.3, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime - if (ok := FindText(&X := "wait", &Y := 1, 1633 - 150000, 966 - 150000, 1633 + 150000, 966 + 150000, 0.3, 0.3, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3, 0.3, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime Confirm @@ -2014,11 +2015,11 @@ OnePass() { ;执行一次通行证 FreeRecruit() { BackToHall() Text每天免费 := "|<每天免费>*161$63.tzzzz3DUyHy03k0Ak6A01k0C01w0tyHAzzzbz7Dw0100zwzk03aHs07zby00Q00mAw00tnnsnaMbU07CSMCN00Dszw03U0MHVz3zU0y03qAzmDzYznaQ03wMzsbSNnU0C7VwAtm0zzbVy63UA31zlwsQtw33z4" - if (ok := FindText(&X, &Y, 1528 - 150000, 1278 - 150000, 1528 + 150000, 1278 + 150000, 0.1, 0.1, Text每天免费, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text每天免费, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") - while (ok := FindText(&X, &Y, 1528 - 150000, 1278 - 150000, 1528 + 150000, 1278 + 150000, 0.1, 0.1, Text每天免费, , , , , , , currentScale, currentScale)) { + while (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text每天免费, , , , , , , currentScale, currentScale)) { Text每日免费 := "|<每日免费>**50$77.3s00000T007z0Dk07zz1zs3zzsRzzTzy3Ds4HDlk0Ck0AC0k801X00BbyMttUTAnCTzvDyrbnwk06szzasRi33vAlzY06BzvM00qM0ztbANzqxttj7ATrDSk0AvnvSTQzbAxU0Mnbakyns00/DylU0Bk0CwlnqzxXw7va0NtnbhkP7tDnDyknXDNzq7aTmQxVU06nzgyQxgnvXzsxU0NttvwC7bzXnDynDs71z302C7zzbwzyTzy07wDUTDlzrw7y" - if (ok := FindText(&X := "wait", &Y := 3, 1034 - 150000, 1141 - 150000, 1034 + 150000, 1141 + 150000, 0.3, 0.3, Text每日免费, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3, 0.3, Text每日免费, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Recruit() } @@ -2039,39 +2040,40 @@ RoadToVillain() { BackToHall() Sleep sleepTime Text := "|**50$63.zkz1wzUzwT7zDyDbz7zzykTUn6kQk7UqxtnOqtbrtnriTPKrYSyTSxnNqSwUqHNrCHCvqY6mHC3mNrSwUqHNqOPQ1rY6mPStvnjCxUqPnrj4xxkQ6n4yxiDhiD0qCCzwzjDzk7kzY" - while (ok := FindText(&X, &Y, 286 - 150000, 364 - 150000, 286 + 150000, 364 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + while (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } loop 3 { if A_Index = 1 { Text := "|<任务>**50$41.1U303U03Vz0D00DzD0nzkL1s3TlVvv0QS66kK0zXMN0g0ZzUm1M081X62sDrrv/wyTszrI06MQ12zrs0w050g1zDw+1M3tzMI2k072kc5U1g5VHvw7k+2a09zDw5DzlwMkC003UT2" - if (ok := FindText(&X := "wait", &Y := 1, 1608 - 150000, 509 - 150000, 1608 + 150000, 509 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } } if A_Index = 2 { Text := "|<周任务>**50$62.7zz0Q1s0w03zzs7jv0PzkbXm373kATw+06UtdUCD32U0cOTE701kfb+AUI1p2k80Gb8500D0200dW3E6E3sU1+Mjrlo7b8UEX206TUTWU0cMyDU101c0+2UrU7jkSkmUc50A03b+Ic+1E3nzFm1+2UI00kYIjGVcBU1MDD/ws+STXwznnn6240NyTsMET0tzyT3y003UA0020S2" - if (ok := FindText(&X := "wait", &Y := 1, 1285 - 150000, 594 - 150000, 1285 + 150000, 594 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } } if A_Index = 3 { Text := "|<奖励>**50$40.3VU0071eD0DzQCfbsU5EyzwXzp1fUKC0I1fvkzzTQXy20c7uAkATrSjy0l1Jmjk77ZICc0Q2JE3U1ltpzvzbJbK002RKNTsDtqOZ0iU5NiQTzUJinzwTt7XzzUzjzvNk0Q/Mb8" - if (ok := FindText(&X, &Y, 1120 - 150000, 528 - 150000, 1120 + 150000, 528 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } } Text := "|<全部领取>**50$85.0Dk0T3y3vzvzs00CM0Qnzlhzzzzz0C60wT0NXU3U3zsC1kE1UBls1k00AC8Q8016kT7wl06SD7aANnl7XqMlXwDkzCAnkk0D0NtsDw7nCNsA07UCMg1Y3k30xnnXn7ArU03k00Pts1tXaNzVzs0HAUA0w1k87tyDztnE60S0g43sT3zwtjX0D0S6100V06QnnVbaD30U0EU36Plknn3VUT3sFtUB1wDk1ktznzcwkClr3s1kCzkzo0NyQT0zsl3M00+0Ay7+6Dw1tg00B77M1xDa2Bzrzzyzzw0TyS1znk000DDQ00G00S02" - if (ok := FindText(&X := "wait", &Y := 1, 1285 - 150000, 1255 - 150000, 1285 + 150000, 1255 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Text := "|<活动结束>**50$67.03k0C1kw0D0Szxzj1wS07k/zazyUrxzyTwk7ECEvwzV0DzjjzDtk1U07zrzz0xjDznzzvzzUQbrrtz6070ti3nu01dyzlwrX0BCSrzTtyvnzybDPzjgrRtzyF2Bi0qvisA1D0SrTTRbTywbUTHDb0LjzSLUbXzrbnbkjDaMts3ztnVk77C5g1iBXzs3zbrrzk7zzDzSTT3ls0D07bUD0E" - while !(ok := FindText(&X, &Y, 1316 - 150000, 396 - 150000, 1316 + 150000, 396 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { Confirm } + Sleep sleepTime } } BackToHall() @@ -2083,7 +2085,7 @@ Cooperate() { UserMove(stdTargetX, stdTargetY, scrRatio) Text := "|**50$84.0DzzzzzU0000000Q00001U0000000s00001U0000001k00001U0000003U00001U0000007000003U000000C0000070000000Q00000C0000000M07zzzw0000000E0Dzzzs0000000E0Q00000000000E0s00000000000E1k00000000000E3U00000000000M3000000000000M3000000000000M3000000000000M3000000000000M3000000000000M3000000000000E3000000000000E3000000000000M3000000000000M6000000000000MC000000000000Mzzzzzs0000000Ezzzzzw0000000lw0000C0000000Hs000070000000rk00003U000000zU00001U0000007000001U000000C000001U000000Q000001U000000NCrvzyDU000000TzzzzzzU000000000000000000000000000zzzzztz0000000zzzzzvz0000000k0000z30000000k0001y30000000k0003w30000000k0007s30000000k000Dk30000000k000TU30000000k000T030000000k000y030000000k3zzw030000000k300s070000000k201k0C0000000k2DzU0Q0000000k2Tz00s0000000k2M001k0000000k2M003U0000000k2M00700000000k2M00C00000000k2M00Q00000000k2M00s00000000k2M01k00000000k2M03U00000000k2Tzz000000000k2000000000000k2000000000000k2000000000000k2000000000000k2000000000000k2000000000000k2000000000000k2000000000000k2000000000000k3000000000000k3000000000000k7000000000000zz00000U" loop 20 { - if (ok := FindText(&X, &Y, 370 - 150000, 222 - 150000, 370 + 150000, 222 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0, 0, Text, , , , , , , currentScale, currentScale)) { Sleep sleepTime FindText().Click(X, Y, "L") break @@ -2101,11 +2103,11 @@ Cooperate() { while true { ;一直找开始匹配 Text开始匹配 := "|<开始匹配>**50$110.00000y0y00000000003yTkADUDk1zzzyTzzzvzzzz286A0zzzzo03zyk000EW1X08000B00k0g0004MUEy20003M0A0/w7kTCTASkVksTrqTzWTXyDr3u568yDDsxbzsU8UW103XFWBan0M0M28288UE0laAXNgk6020W0W2876ATV8qPA1U0jsU8UW0lW00OBan0NGDy/yDszAtU02XFgk6En02zVwDuCM7scoPBNUAk0c0002X7zzuD4nTM3AS+0000clzzgXlAoq43DWz3wDuATzz8snDBVUnDjszXwUD00mAAlXMyAls4M8UC3k0AV6A0qTXA036281kwzX8HVUNW0n1UlUW0A7AAmDkTyM0AlwMk8U31n3AXs1y6TXANAA281UAkn8zzzxbsn6K60W0kb7sm33zzMyAT71U8UMTk0AU000K033VUk286Bw0380005U0k0wM0W1b37snzzzzNyS0Rw0DUDUzzw00007kzzyC03s007Uy00000s0088" - if (ok := FindText(&X := "wait", &Y := 3, 2259 - 150000, 1064 - 150000, 2259 + 150000, 1064 + 150000, 0.1, 0.1, Text开始匹配, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text开始匹配, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime Text := "|<通知>**50$48.0DzyTU00TA07MUTytw03Mzzzkw07MzU3sT4Ck0U3QS0Sk0U3Cz0TU3XX7s03WDXX0803nAXXzslny7XXUM03U0XXUM03U0XXUMlnU0XXwM03yDXXAM0366XX4MEX63XX4MlXA1XXAMl3A1XXsMt7sM03k3zzksU3V001UxU3nk01ljXXqy07v0zzU" - if (ok := FindText(&X, &Y, 1307 - 150000, 432 - 150000, 1307 + 150000, 432 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { BackToHall return } @@ -2117,13 +2119,13 @@ Cooperate() { while true { ;防止有人取消,反复检测 Text接受 := "|<接受>**50$48.7kT001zw4kNUTzk64rtzM0064w01M03yww01SSTAkDDDCSP4kDDACDCCkDDDSCADww01k0014s01k0014w01nzztQDnznzztsDXzv00Pk001z00Tks01X7sMwzD7VXsk4qDC1llk4o6A0s3U4r0Q1s3sQzkDTU0TMy03E1k1Es7XM7w3U" - if (ok := FindText(&X := "wait", &Y := 30, 1455 - 150000, 923 - 150000, 1455 + 150000, 923 + 150000, 0.1, 0.1, Text接受, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X := "wait", &Y := 30, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text接受, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime } Sleep sleepTime Text准备 := "|<准备>**50$54.y6AM067zUX4Q80A01kXAS80M00ElgSDlk00kks00H0TVUMk00G0D3UMkwDmA0709UyDnz0D0D0yDny07z3000z00032000M0D033800w1zs37syDo3zyCAsyDbU00QAMwDlU00E8M00FXkwMMs00lXkwMEsyDlU00Mkca81U00MlcyDtXkwMV800NXkwMX8009U00Mn800NU00MU" - if (ok := FindText(&X, &Y, 1286 - 150000, 1284 - 150000, 1286 + 150000, 1284 + 150000, 0.1, 0.1, Text准备, , , , , , , currentScale, currentScale)) { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1, 0.1, Text准备, , , , , , , currentScale, currentScale)) { FindText().Click(X, Y, "L") Sleep sleepTime break @@ -2204,7 +2206,7 @@ ClickOnDoro(*) { WriteSettings() title := "勝利女神:妮姬" try { - WinGetClientPos , , &userScreenW, &userScreenH, "勝利女神:妮姬" + WinGetClientPos &NikkeX, &NikkeY, &NikkeW, &NikkeH, "勝利女神:妮姬" } catch as err { title := "ahk_exe nikke.exe" } @@ -2215,10 +2217,9 @@ ClickOnDoro(*) { } loop numNikke { nikkeID := WinGetIDLast(title) - WinGetClientPos , , &userScreenW, &userScreenH, nikkeID + WinGetClientPos &NikkeX, &NikkeY, &NikkeW, &NikkeH, nikkeID global scrRatio - scrRatio := userScreenW / stdScreenW - ;nikkeID := WinWait(title) + scrRatio := NikkeW / stdScreenW WinActivate nikkeID Login() ;登陆到主界面 if g_settings["Shop"] { @@ -2619,10 +2620,10 @@ CalculateAndShowSpan(ExitReason := "", ExitCode := "") { ;添加基本的依赖 title := "ahk_exe nikke.exe" nikkeID := WinGetIDLast(title) - WinGetClientPos , , &userScreenW, &userScreenH, nikkeID + WinGetClientPos &NikkeX, &NikkeY, &NikkeW, &NikkeH, nikkeID + WinGetPos &NikkeXP, &NikkeYP, &NikkeWP, &NikkeHP, nikkeID + WinMove (A_ScreenWidth / 2) - (NikkeWP / 2), (A_ScreenHeight / 2) - (NikkeHP / 2), 2347 * currentScale, 1350 * currentScale, nikkeID global scrRatio - scrRatio := userScreenW / stdScreenW - ;模拟室、企业塔待测试 + scrRatio := NikkeW / stdScreenW ;下面写要调试的函数 - ScrapShop() } diff --git a/lib/FindText.ahk b/lib/FindText.ahk index c62df06..ba62ef1 100644 --- a/lib/FindText.ahk +++ b/lib/FindText.ahk @@ -24,48 +24,30 @@ ; ;=========================================== ;*/ - - -if (!A_IsCompiled && A_LineFile=A_ScriptFullPath) - FindText().Gui("Show") - - +if (!A_IsCompiled && A_LineFile = A_ScriptFullPath) + FindText().Gui("Show") ;===== 复制下面的函数和类到你的代码中仅仅一次 ===== - - -FindText(args*) -{ - static obj:=FindTextClass() - return !args.Length ? obj : obj.FindText(args*) +FindText(args*) { + static obj := FindTextClass() + return !args.Length ? obj : obj.FindText(args*) } - -Class FindTextClass -{ ;// Class Begin - -Floor(i) => IsNumber(i) ? i+0 : 0 - -__New() -{ - this.bits:={ Scan0: 0, hBM: 0, oldzw: 0, oldzh: 0 } - this.bind:={ id: 0, mode: 0, oldStyle: 0 } - this.Lib:=Map() - this.Cursor:=0 -} - -__Delete() -{ - if (this.bits.hBM) - Try DllCall("DeleteObject", "Ptr",this.bits.hBM) -} - -New() -{ - return FindTextClass() -} - -help() -{ -return " +class FindTextClass { ;// Class Begin + Floor(i) => IsNumber(i) ? i + 0 : 0 + __New() { + this.bits := { Scan0: 0, hBM: 0, oldzw: 0, oldzh: 0 } + this.bind := { id: 0, mode: 0, oldStyle: 0 } + this.Lib := Map() + this.Cursor := 0 + } + __Delete() { + if (this.bits.hBM) + try DllCall("DeleteObject", "Ptr", this.bits.hBM) + } + New() { + return FindTextClass() + } + help() { + return " ( ;-------------------------------- ; FindText - 屏幕找字函数 @@ -131,411 +113,384 @@ return " ; ;-------------------------------- )" -} - -FindText(&OutputX:="", &OutputY:="" - , x1:=0, y1:=0, x2:=0, y2:=0, err1:=0, err0:=0, text:="" - , ScreenShot:=1, FindAll:=1, JoinText:=0, offsetX:=20, offsetY:=10 - , dir:=0, zoomW:=1, zoomH:=1) -{ - if IsSet(OutputX) && (OutputX ~= "i)^\s*wait[10]?\s*$") - { - found:=!InStr(OutputX, "0"), time:=this.Floor(OutputY ?? 0) - , timeout:=A_TickCount+Round(time*1000), OutputX:="" - Loop - { - ok:=this.FindText(,, x1, y1, x2, y2, err1, err0, text, ScreenShot - , FindAll, JoinText, offsetX, offsetY, dir, zoomW, zoomH) - if (found && ok) - { - OutputX:=ok[1].x, OutputY:=ok[1].y + } + FindText(&OutputX := "", &OutputY := "" + , x1 := 0, y1 := 0, x2 := 0, y2 := 0, err1 := 0, err0 := 0, text := "" + , ScreenShot := 1, FindAll := 1, JoinText := 0, offsetX := 20, offsetY := 10 + , dir := 0, zoomW := 1, zoomH := 1) { + if IsSet(OutputX) && (OutputX ~= "i)^\s*wait[10]?\s*$") { + found := !InStr(OutputX, "0"), time := this.Floor(OutputY ?? 0) + , timeout := A_TickCount + Round(time * 1000), OutputX := "" + loop { + ok := this.FindText(, , x1, y1, x2, y2, err1, err0, text, ScreenShot + , FindAll, JoinText, offsetX, offsetY, dir, zoomW, zoomH) + if (found && ok) { + OutputX := ok[1].x, OutputY := ok[1].y + return ok + } + if (!found && !ok) + return 1 + if (time >= 0 && A_TickCount >= timeout) + break + Sleep 50 + } + return 0 + } + x1 := this.Floor(x1), y1 := this.Floor(y1), x2 := this.Floor(x2), y2 := this.Floor(y2) + if (x1 = 0 && y1 = 0 && x2 = 0 && y2 = 0) + n := 150000, x := y := -n, w := h := 2 * n + else + x := Min(x1, x2), y := Min(y1, y2), w := Abs(x2 - x1) + 1, h := Abs(y2 - y1) + 1 + bits := this.GetBitsFromScreen(&x, &y, &w, &h, ScreenShot, &zx, &zy), x -= zx, y -= zy + , this.ok := 0, info := [] + loop parse, text, "|" + if IsObject(j := this.PicInfo(A_LoopField)) + info.Push(j) + if (w < 1 || h < 1 || !(num := info.Length) || !bits.Scan0) { + return 0 + } + arr := [], info2 := Map(), k := 0, s := "" + , mode := (IsObject(JoinText) ? 2 : JoinText ? 1 : 0) + for i, j in info { + k := Max(k, (j[7] = 5 && j[8] != 2 ? j[9] : j[2] * j[3])) + if (mode) + v := (mode = 1 ? i : j[10]) . "", s .= "|" v + , (v != "") && ((!info2.Has(v) && info2[v] := []), info2[v].Push(j)) + } + sx := x, sy := y, sw := w, sh := h, (mode = 1 && JoinText := [s]) + , allpos_max := (FindAll || JoinText ? 10000 : 1) + , s1 := Buffer(k * 4), s0 := Buffer(k * 4) + , ss := Buffer(sw * (sh + 3)), allpos := Buffer(allpos_max * 8) + , ini := { sx: sx, sy: sy, sw: sw, sh: sh, zx: zx, zy: zy, mode: mode, bits: bits, ss: ss.Ptr, s1: s1.Ptr, s0: s0.Ptr, allpos: allpos.Ptr, allpos_max: allpos_max, err1: err1, err0: err0, zoomW: zoomW, zoomH: zoomH } + loop 2 { + if (err1 = 0 && err0 = 0) && (num > 1 || A_Index > 1) + ini.err1 := err1 := 0.05, ini.err0 := err0 := 0.05 + if (!JoinText) { + for i, j in info + loop this.PicFind(ini, j, dir, sx, sy, sw, sh) { + v := NumGet(allpos, 4 * A_Index - 4, "uint"), x := (v & 0xFFFF) + zx, y := (v >> 16) + zy + , w := Floor(j[2] * zoomW), h := Floor(j[3] * zoomH) + , arr.Push({ 1: x, 2: y, 3: w, 4: h, x: x + w // 2, y: y + h // 2, id: j[10] }) + if (!FindAll) + break 3 + } + } + else + for k, v in JoinText { + v := StrSplit(Trim(RegExReplace(v, "\s*\|[|\s]*", "|"), "|") + , (InStr(v, "|") ? "|" : ""), " `t") + , this.JoinText(arr, ini, info2, v, 1, offsetX, offsetY + , FindAll, dir, 0, 0, 0, sx, sy, sw, sh) + if (!FindAll && arr.Length) + break 2 + } + if (err1 != 0 || err0 != 0 || arr.Length || info[1][4] || info[1][7] = 5) + break + } + if (arr.Length) { + OutputX := arr[1].x, OutputY := arr[1].y, this.ok := arr + return arr + } + return 0 + } + ; the join text object use [ "abc", "xyz", "a1|a2|a3" ] + JoinText(arr, ini, info2, text, index, offsetX, offsetY + , FindAll, dir, minX, minY, maxY, sx, sy, sw, sh) { + if !(Len := text.Length) || !info2.Has(key := text[index]) + return 0 + zoomW := ini.zoomW, zoomH := ini.zoomH, mode := ini.mode + for i, j in info2[key] + if (mode != 2 || key == j[10]) + loop ok := this.PicFind(ini, j, dir, sx, sy, (index = 1 ? sw + : Min(sx + offsetX + Floor(j[2] * zoomW), ini.sx + ini.sw) - sx), sh) { + if (A_Index = 1) { + pos := [], p := ini.allpos - 4 + loop ok + pos.Push(NumGet(p += 4, "uint")) + } + v := pos[A_Index], x := v & 0xFFFF, y := v >> 16 + , w := Floor(j[2] * zoomW), h := Floor(j[3] * zoomH) + , (index = 1 && (minX := x, minY := y, maxY := y + h)) + , minY1 := Min(y, minY), maxY1 := Max(y + h, maxY), sx1 := x + w + if (index < Len) { + sy1 := Max(minY1 - offsetY, ini.sy) + , sh1 := Min(maxY1 + offsetY, ini.sy + ini.sh) - sy1 + if this.JoinText(arr, ini, info2, text, index + 1, offsetX, offsetY + , FindAll, 5, minX, minY1, maxY1, sx1, sy1, 0, sh1) + && (index > 1 || !FindAll) + return 1 + } + else { + comment := "" + for k, v in text + comment .= (mode = 2 ? v : info2[v][1][10]) + x := minX + ini.zx, y := minY1 + ini.zy, w := sx1 - minX, h := maxY1 - minY1 + , arr.Push({ 1: x, 2: y, 3: w, 4: h, x: x + w // 2, y: y + h // 2, id: comment }) + if (index > 1 || !FindAll) + return 1 + } + } + return 0 + } + PicFind(ini, j, dir, sx, sy, sw, sh) { + static MyFunc := "" + if (!MyFunc) { + x32 := "VVdWU4HsmAAAAIuEJNQAAAADhCTMAAAAi5wk@AAAAIO8JKwAAAAFiUQkIIuEJPgA" + . "AACNBJiJRCQ0D4RKBgAAi4Qk6AAAAIXAD45ADwAAiXwkEIu8JOQAAAAx7ccEJAAA" + . "AADHRCQIAAAAAMdEJBQAAAAAx0QkDAAAAACNtgAAAACLhCTgAAAAi0wkDDH2MdsB" + . "yIX@iUQkBH896ZAAAABmkA+vhCTMAAAAicGJ8Jn3@wHBi0QkBIA8GDF0TIuEJNwA" + . "AACDwwEDtCQAAQAAiQyog8UBOd90VIsEJJn3vCToAAAAg7wkrAAAAAR1tQ+vhCTA" + . "AAAAicGJ8Jn3@40MgYtEJASAPBgxdbSLRCQUi5Qk2AAAAIPDAQO0JAABAACJDIKD" + . "wAE534lEJBR1rAF8JAyDRCQIAYu0JAQBAACLRCQIATQkOYQk6AAAAA+FMv@@@4tE" + . "JBSLfCQQD6+EJOwAAACJbCQwwfgKiUQkKIuEJPAAAAAPr8XB+AqJRCRAg7wkrAAA" + . "AAQPhCIGAACLhCTAAAAAi5wkxAAAAA+vhCTIAAAAjSyYi4QkzAAAAIucJMAAAAD3" + . "2IO8JKwAAAABjQSDiUQkLA+ELwYAAIO8JKwAAAACD4Q4CAAAg7wkrAAAAAMPhLkL" + . "AACLjCTQAAAAhckPjicBAACLhCTMAAAAi6wkzAAAAMdEJAwAAAAAx0QkEAAAAACJ" + . "fCQYg+gBiUQkCI22AAAAAIt8JBCLtCTUAAAAMcCLXCQgAfsB94Xtif6J738X6bwA" + . "AADGBAYEg8ABg8MBOccPhKQAAACDvCSsAAAAA3@khcAPtgsPhLoPAAAPtlP@iVQk" + . "BDlEJAgPhMIPAAAPtlMBiRQki5Qk9AAAAIXSD4SfAQAAD7bpugYAAACD7QGD@QF2" + . "G4N8JAQBD5TCgzwkAYnVD5TCCeoPttIB0oPKBIHh@QAAAL0BAAAAdByLTCQEiywk" + . "hckPlEQkBIXtD5TBic0PtkwkBAnNCeqDwwGIFAaDwAE5xw+FXP@@@wF8JBCJ@YNE" + . "JAwBi0QkDDmEJNAAAAAPjwz@@@+LfCQYg7wkrAAAAAN@FouEJPQAAACFwA+VwDwB" + . "g5wkxAAAAP+LXCQUi3QkKDHAOfOLdCRAD07YiVwkFItcJDA58w9Pw4lEJDCLhCTM" + . "AAAAK4QkAAEAAIlEJASLhCTQAAAAK4QkBAEAAIO8JLgAAAAJiUQkCA+ExgAAAIuE" + . "JLgAAACD6AGD+AcPh7wCAACD+AOJRCQkD463AgAAi0QkBMdEJEQAAAAAx0QkDAAA" + . "AACJBCSLRCQIiUQkHItcJEQ5HCTHRCRMAAAAAA+MCwEAAItcJEw5XCQcD4zCDQAA" + . "i3QkRItcJCSLBCQp8PbDAg9Exot0JEyJwotEJBwp8PbDAQ9ExoP7A4nWD0@wD0@C" + . "iXQkGIlEJBDp3gsAAI12AA+20YPqAYP6AhnSg+ICg8IEgeH9AAAAD5TBCcqIFAbp" + . "8v3@@4tcJASLdCQIx0QkZAAAAADHRCRgAQAAAMdEJFQAAAAAx0QkWAAAAACJ2I1W" + . "AYk0JMHoH4lcJBzHRCQMAAAAAAHY0fiJRCQQifDB6B8B8NH4iUQkGInYg8ABicEP" + . "r8o50A9MwoPACIlMJHyJwQ+vyImMJIAAAACLXCR8OVwkZH0Zi5wkgAAAADlcJFjH" + . "RCRcAAAAAA+M9QQAAIuMJLgAAACFyQ+FnQIAAIuUJPgAAACF0g+EjgIAAIuEJAQB" + . "AAAPr4QkAAEAAIP4AQ+EdgIAAIN8JAwBD46lCgAAi0QkNIucJPgAAAAx7cdEJAQA" + . "AAAAiSwkjXgEi0QkDIPoAYlEJBCLRCQEiwwkizeLRAMEhcmJRCQIich4NotP@DnO" + . "D4N1BQAAifqNa@zrDY12AIPqBItK@DnOcxeJCotMhQSJTIMEg+gBg@j@deS4@@@@" + . "@4tMJDSDwAGDBCQBg8cEg0QkBASJNIGLdCQIiTSDiwQkO0QkEHWNi4QkBAEAAIus" + . "JAABAAAPr8APr+2JRCQEi7Qk+AAAAMdEJAgAAAAAMduLRCQIiwSGiUQkEA+3+MHo" + . "EIXbiQQkdC0xyY22AAAAAIsUjg+3win4D6@AOeh9D8HqECsUJA+v0jtUJAR8EYPB" + . "ATnZdduLRCQQiQSeg8MBg0QkCAGLRCQIOUQkDHWiidiBxJgAAABbXl9dwlwAx0Qk" + . "JAAAAACLRCQIx0QkRAAAAADHRCQMAAAAAIkEJItEJASJRCQc6UT9@@8xwIO8JLAA" + . "AAACD5TAiYQkhAAAAA+EUAQAADHAg7wksAAAAAGLrCS0AAAAD5TAhe2JRCR4D4SG" + . "CwAAi7Qk2AAAAIuUJLQAAAAx7YucJOAAAACLjCTcAAAAiXwkCI0ElolEJASNdCYA" + . "izuDxgSDw1iDwQSJ+MHoEA+vhCQEAQAAmfe8JOgAAAAPr4QkwAAAAIkEJA+3xw+v" + . "hCQAAQAAmfe8JOQAAACLFCSNBIKJRvyLQ6yNREUAg8UWiUH8O3QkBHWmi4QktAAA" + . "AIm8JLAAAACLfCQIiUQkFIuEJOwAAAAPr4QktAAAAMH4ColEJCiLhCTgAAAAx0Qk" + . "QAAAAADHRCQwAAAAAIPACIlEJFDpSfr@@4tEJAyBxJgAAABbXl9dwlwAi4QksAAA" + . "AMHoEA+vhCQEAQAAmfe8JOgAAAAPr4QkwAAAAInBD7eEJLAAAAAPr4QkAAEAAJn3" + . "vCTkAAAAjQSBiYQksAAAAOnt+f@@i4Qk6AAAAIu0JNAAAAAPr4Qk5AAAANGkJLQA" + . "AAADhCTgAAAAhfaJRCRQD47z+v@@i4QkzAAAAInqi2wkUMdEJCQAAAAAx0QkOAAA" + . "AADB4AKJRCRIMcCLnCTMAAAAhdsPjisBAACLnCS8AAAAAdMDVCRIiVwkEItcJCAD" + . "XCQ4iVQkPAOUJLwAAACJXCQYiVQkHI12AI28JwAAAACLdCQQMds5nCS0AAAAD7ZO" + . "AolMJAQPtk4BD7Y2iUwkCIl0JAx2W412AI28JwAAAACLRJ0Ag8MCi3yd@InCD7bM" + . "D7bAK0QkDMHqECtMJAgPttIrVCQEgf@@@@8AiQQkdyUPr9IPr8mNFFIPr8CNFIqN" + . "BEI5x3NGMcA5nCS0AAAAd6+JwutBif7B7hCJ8A+28A+v0g+v9jnyd92J+A+21A+v" + . "yQ+v0jnRd86LNCSJ+A+20A+v0onwD6@GOdB3uroBAAAAuAEAAACLXCQYg0QkEASL" + . "TCQQiBODwwE7TCQciVwkGA+FGv@@@4u0JMwAAAABdCQ4i1QkPINEJCQBA1QkLItc" + . "JCQ5nCTQAAAAD4Ws@v@@6U34@@+LRCQQhcB4G4tcJBw52H8Ti0QkGIXAeAuLHCQ5" + . "2A+ONwYAAItsJFSF7Q+F4AUAAINsJBgBg0QkXAGDRCRYAYt0JGA5dCRcfLiLXCRU" + . "idiD4AEBxonYg8ABiXQkYIPgA4lEJFTpvvr@@4uEJLAAAACLjCTQAAAAxwQkAAAA" + . "AMdEJAQAAAAAg8ABweAHiYQksAAAAIuEJMwAAADB4AKFyYlEJAwPjsz4@@+J6Ius" + . "JLAAAACJfCQQi5QkzAAAAIXSfmaLjCS8AAAAi1wkIIu8JLwAAAADXCQEAcEDRCQM" + . "iUQkCAHHjXYAjbwnAAAAAA+2UQIPtkEBD7Yxa8BLa9ImAcKJ8MHgBCnwAdA5xQ+X" + . "A4PBBIPDATn5ddWLnCTMAAAAAVwkBItEJAiDBCQBA0QkLIs8JDm8JNAAAAAPhXf@" + . "@@+LfCQQ6Qb3@@+LBCTprvr@@4uEJOgAAACLvCTgAAAAD6+EJOQAAADRpCS0AAAA" + . "jQSHiUQkUIuEJPAAAADB+AqDwAGJRCQki4Qk6AAAAIXAD45ECgAAi3wkJIuEJAQB" + . "AACLdCRQx0QkMAAAAADHRCQUAAAAAA+vx4lEJECLhCTkAAAAD6@HweACiUQkSIuE" + . "JOAAAACDwAKJRCQ4ifiNPL0AAAAAiXwkLInHD6+EJAABAACJfCQ8iUQkKIuEJOQA" + . "AACFwA+OaQEAAItEJDjHRCQcAAAAAIlEJBCLRCQkiUQkGItEJBC7AgAAAA+2OIk8" + . "JA+2eP8PtkD+iXwkBIlEJAg5nCS0AAAAD4bCAAAAiwSeg8MCi3ye@InCD7bMD7bA" + . "K0QkCMHqECtMJAQPttIrFCSB@@@@@wCJRCQMd0YPr9IPr8mNFFIPr8CNFIqNBEI5" + . "x3Kui3wkGItEJCSLTCQsAUwkEItMJCgBTCQcAfg5vCTkAAAAD465AAAAiUQkGOlf" + . "@@@@if3B7RCJ6A+26A+v0g+v7TnqD4dm@@@@ifgPttQPr8kPr9I50Q+HU@@@@4tM" + . "JAyJ+A+2+A+v@4nID6@BOfh2kDmcJLQAAAAPhz7@@@+LRCQwi3wkFJmNHL0AAAAA" + . "97wk6AAAAA+vhCTAAAAAicGLRCQcmfe8JOQAAACLFCTB4hCNBIGLjCTYAAAAiQS5" + . "i0QkBIPHAYl8JBSLvCTcAAAAweAICdALRCQIiQQf6SD@@@+LfCQ8i0QkJItMJEAB" + . "TCQwi0wkSAFMJDgB+Dm8JOgAAAB+CYlEJDzpXP7@@4tEJBQPr4Qk7AAAAMH4ColE" + . "JCiLRCRQx0QkQAAAAADHRCQwAAAAAIt4BIn4ifvB6BAPtteJ+w+2wA+2y4nDD6@Y" + . "idAPr8KJXCRwiUQkdInID6@BiUQkbOlH9P@@i4Qk0AAAAIXAD45u9f@@i5wkzAAA" + . "AItEJCDHBCQAAAAAx0QkBAAAAACJfCQMjQRYiUQkGInYweACiUQkCIu0JMwAAACF" + . "9n5Xi4wkvAAAAItcJBiLvCS8AAAAA1wkBAHpA2wkCAHvD7ZRAoPBBIPDAWvyJg+2" + . "Uf1rwkuNFAYPtnH8ifDB4AQp8AHQwfgHiEP@Ofl10ou8JMwAAAABfCQEgwQkAQNs" + . "JCyLBCQ5hCTQAAAAdYqLhCTMAAAAi3wkDDHti5QktAAAADH2g+gBiXwkJIlEJAyL" + . "hCTQAAAAg+gBiUQkEIucJMwAAACF2w+O4gAAAIu8JMwAAACLRCQYAfeNDDCJ+4l8" + . "JByJxwHfifMrnCTMAAAAiXwkBIt8JCABwwH3McCJfCQIiRwkhcAPhGQDAAA5RCQM" + . "D4RaAwAAhe0PhFIDAAA5bCQQD4RIAwAAD7YRD7Z5@74BAAAAA5QksAAAADn6ckYP" + . "tnkBOfpyPos8JA+2Pzn6cjSLXCQED7Y7OfpyKYs8JA+2f@85+nIeizwkD7Z@ATn6" + . "chMPtnv@OfpyCw+2cwE58g+Sw4nei3wkCInziBwHg8ABg8EBg0QkBAGDBCQBOYQk" + . "zAAAAA+FWv@@@4t0JByDxQE5rCTQAAAAD4X@@v@@i3wkJImUJLQAAADpY@L@@8dE" + . "JEAAAAAAx0QkKAAAAADHRCQwAAAAAMdEJBQAAAAA6cfx@@+DfCRUAQ+E6gEAAIN8" + . "JFQCD4SVAgAAg2wkEAHpBfr@@4uEJAQBAACLrCQAAQAAD6@AD6@tiUQkBItEJAyF" + . "wA+P6PX@@zHA6VL2@@+DRCRkAcdEJCQJAAAAi0QkGIucJNQAAAAPr4QkzAAAAANE" + . "JBCAPAMDD4ZnAQAAi3QkFItcJDA53g9N3oO8JKwAAAADiVwkIA+OdQEAAItEJBgD" + . "hCTIAAAAD6+EJMAAAACLVCQQA5QkxAAAAIO8JKwAAAAFD4RsAgAAjTSQi4QksAAA" + . "AIucJLwAAAAB8A+2XAMCiVwkOIucJLwAAAAPtlwDAYlcJDyLnCS8AAAAD7YEA4lE" + . "JEiLRCQghcAPhKoBAACLRCRAiXwkLDHbi2wkKIu8JLwAAACJRCRo62KNtCYAAAAA" + . "OVwkMH5Ii4Qk3AAAAIsUmAHyD7ZEFwIPtkwXAStEJDgrTCQ8D7YUFytUJEgPr8AP" + . "r8mNBEAPr9KNBIiNBFA5hCS0AAAAcgeDbCRoAXhhg8MBOVwkIA+EogEAADlcJBR+" + . "n4uEJNgAAACLFJgB8g+2RBcCD7ZMFwErRCQ4K0wkPA+2FBcrVCRID6@AD6@JjQRA" + . "D6@SjQSIjQRQOYQktAAAAA+DWv@@@4PtAQ+JUf@@@4t8JCyDfCQkCQ+EKfj@@4NE" + . "JEwB6Try@@+DRCQQAekm+P@@g0QkRAHpEfL@@410JgCF2w+EoAAAAAOEJNQAAACL" + . "XCRAMdKLbCQoicHrJTlUJDB+Fou0JNwAAACLBJYByPYAAXUFg+sBeJqDwgE5VCQg" + . "dGo5VCQUftWLtCTYAAAAiwSWAcj2AAJ1xIPtAXm@6XD@@@@HRCQEAwAAAOlB8P@@" + . "i3wkCMYEBwLpEf3@@8cEJAMAAADpOfD@@8dEJCgAAAAAx0QkFAAAAADpGPX@@4NE" + . "JBgB6XD3@@+LbCQoi4Qk+AAAAINEJAwBhcAPhMoDAACLVCQYA5QkyAAAAItcJAyL" + . "RCQQA4QkxAAAAIu0JPgAAADB4hCNi@@@@z8J0IkEjou0JLgAAACF9g+F0gIAAItE" + . "JCiLdCQ0Keg5nCT8AAAAiQSOD44z8v@@6bb+@@+LfCQs64mLtCSEAAAAjQSQiUQk" + . "PIX2D4WuAQAAi1wkIItEJFAx9otsJCiF24lEJGgPhFn@@@+LhCTYAAAAi1wkaItU" + . "JDwDFLCJXCRIa8YWgTv@@@8AiUQkOA+XwA+2wIlEJCyLhCTcAAAAiwSwiYQktAAA" + . "AIuEJLwAAAAPtkQQAomEJIwAAADB4BCJwYuEJLwAAAAPtkQQAYmEJJAAAADB4AgJ" + . "yIuMJLwAAAAPtgwRCciJjCSUAAAAiYQkiAAAAOsfD6@SD6@JjRRSD6@AjRSKjQRC" + . "OccPg70AAACDRCRICItEJDg7hCS0AAAAD4PPAAAAi1QkeIt8JEiDRCQ4AoXSiweL" + . "fwR0JoX2i5wkiAAAAA9FnCSwAAAAhcAPlMAPtsCJRCQsiZwksAAAAInYicIPtswP" + . "tsDB6hArjCSQAAAAK4QklAAAAA+20iuUJIwAAACB@@@@@wAPhmX@@@+J+8HrEA+2" + . "2w+v0g+v2znaD4dp@@@@ifsPttcPr8kPr9I50Q+HVv@@@4n7D7bTD6@AD6@SOdAP" + . "h0P@@@+LRCQshcB0CYPtAQ+IDf3@@4PGAYNEJGhYOXQkIA+Fe@7@@+nP@f@@i0Qk" + . "LIXAdeHr1otMJCCLbCQohckPhLX9@@8x9usuOUQkcHwSD6@JOUwkdHwJD6@SOVQk" + . "bH0Jg+0BD4i3@P@@g8YBOXQkIA+Eg@3@@4uEJNgAAACLVCQ8i5wkvAAAAAMUsIuE" + . "JNwAAACLBLCJhCSwAAAAi4QkvAAAAIuMJLAAAAAPtkQQAsHpEA+2ySnID7ZMEwGL" + . "nCSwAAAAD6@AD7bfKdmLnCS8AAAAD7YUEw+2nCSwAAAAKdqB@@@@@wAPh1z@@@8P" + . "r8mNBEAPr9KNBIiNBFA5xw+CXf@@@+lh@@@@x0QkKAAAAADHRCQUAAAAAOnC9@@@" + . "i1wkDDmcJPwAAACJ2A+OrfD@@4tcJBgxyYnOidgrhCQEAQAAg8ABD0jBicKJ2Iuc" + . "JAQBAACNRBj@i1wkCDnDD07Di1wkEInFidgrhCQAAQAAg8ABD0nwidiLnCQAAQAA" + . "jUQY@4tcJAQ5ww9OwznVicMPjIz7@@+LhCTMAAAAg8UBD6@CA4Qk1AAAAInBjUMB" + . "iUQkIDnefw+J8IAkAQODwAE7RCQgdfODwgEDjCTMAAAAOep13+lJ+@@@i6wkuAAA" + . "AIXtD4VK@@@@6TX7@@+QkA==" + x64 := "QVdBVkFVQVRVV1ZTSIHsyAAAAEhjhCRQAQAASIu8JKgBAACJjCQQAQAAiVQkMESJ" + . "jCQoAQAAi7QkgAEAAIusJIgBAABJicRIiUQkWEgDhCRgAQAAg@kFSIlEJChIY4Qk" + . "sAEAAEiNBIdIiUQkYA+E3AUAAIXtD44BDAAARTH2iVwkEIu8JLgBAABEiXQkCIuc" + . "JBABAABFMe1Mi7QkcAEAAEUx20Ux@0SJbCQYRImEJCABAABMY1QkCEUxyUUxwEwD" + . "lCR4AQAAhfZ@Mut3Dx9AAEEPr8SJwUSJyJn3@gHBQ4A8AjF0PEmDwAFJY8dBAflB" + . "g8cBRDnGQYkMhn5DRInYmff9g@sEdckPr4QkOAEAAInBRInImff+Q4A8AjGNDIF1" + . "xEiLlCRoAQAASYPAAUljxUEB+UGDxQFEOcaJDIJ@vQF0JAiDRCQYAUQDnCTAAQAA" + . "i0QkGDnFD4VX@@@@RInoi1wkEESLhCQgAQAAD6+EJJABAABEiWwkGMH4ColEJByL" + . "hCSYAQAAQQ+vx8H4ColEJECDvCQQAQAABA+EtwUAAIuEJDgBAACLvCRAAQAAD6+E" + . "JEgBAACNBLiLvCQ4AQAAiUQkCESJ4PfYg7wkEAEAAAGNBIeJRCQgD4SxBQAAg7wk" + . "EAEAAAIPhIQHAACDvCQQAQAAAw+EowoAAIuEJFgBAACFwA+OHwEAAESJfCQQRIuc" + . "JBABAABBjWwk@0yLfCQoi7wkoAEAAEUx9kUx7YlcJAhEiYQkIAEAAA8fhAAAAAAA" + . "RYXkD467AAAASWPFMclJicFNjUQHAUwDjCRgAQAA6xhBxgEEg8EBSYPBAUmDwAFB" + . "OcwPhIkAAABBg@sDf+KFyUEPtlD@D4S1DgAAQQ+2WP45zQ+Euw4AAEUPthCF@w+E" + . "fAEAAA+28rgGAAAAg+4Bg@4BdhiD+wFAD5TGQYP6AQ+UwAnwD7bAAcCDyASB4v0A" + . "AAC+AQAAAHQOhdtAD5TGRYXSD5TCCdYJ8IPBAUmDwQFBiEH@SYPAAUE5zA+Fd@@@" + . "@0UB5UGDxgFEObQkWAEAAA+PKv@@@4tcJAhEi3wkEESLhCQgAQAAg7wkEAEAAAN@" + . "FouEJKABAACFwA+VwDwBg5wkQAEAAP+LfCQYi3QkHDHARInlRIucJFgBAAA59w9O" + . "+EQ7fCRAiXwkGEQPTvgrrCS4AQAARCucJMABAACDvCQoAQAACQ+EuQAAAIuEJCgB" + . "AACD6AGD+AcPh5ACAACD+AOJRCRID46LAgAAiWwkCESJXCQQRTH2x0QkTAAAAACL" + . "fCRMOXwkCMdEJGgAAAAAD4wNAQAAi3wkaDl8JBAPjNIMAACLfCRIi3QkTItEJAgp" + . "8ED2xwIPRMaLdCRoicKLRCQQKfBA9scBD0TGg@8DidcPT@gPT8JBicXptgoAAGaQ" + . "D7bCg+gBg@gCGcCD4AKDwASB4v0AAAAPlMIJ0EGIAekg@v@@iehBjVMBRIlcJAjB" + . "6B+JbCQQx4QkiAAAAAAAAAAB6MeEJIQAAAABAAAAx0QkbAAAAADR+MdEJHwAAAAA" + . "QYnFRInYwegfRAHY0fiJx41FAYnGD6@yOdAPTMJFMfaDwAiJtCSkAAAAicYPr@CJ" + . "tCSoAAAAi7QkpAAAADm0JIgAAAB9HIu0JKgAAAA5dCR8x4QkgAAAAAAAAAAPjEYE" + . "AACLhCQoAQAAhcAPhV0CAABIg7wkqAEAAAAPhE4CAACLhCTAAQAAD6+EJLgBAACD" + . "+AEPhDYCAABBg@4BD45dCQAAQY1G@kyLRCRgTIucJKgBAABFMclFMdJIjRyFBAAA" + . "AEOLdAgEQ4sUCESJ0UOLfAsETInQOdZyE+kJBAAAZpBIg+gBQYsUgDnWcx1BiVSA" + . "BEGLFIOD6QGD+f9BiVSDBHXeSMfA@@@@@0mDwQRIg8ABSYPCAUk52UGJNIBBiTyD" + . "dZ9Ei5QkuAEAAIucJMABAABFD6@SD6@bTIuMJKgBAAAx9jHAQYsssYnvRA+33cHv" + . "EIXAdDJFMcAPH4QAAAAAAEOLDIEPt9FEKdoPr9JEOdJ9DMHpECn5D6@JOdl8E0mD" + . "wAFEOcB@2Uhj0IPAAUGJLJFIg8YBQTn2f6pIgcTIAAAAW15fXUFcQV1BXkFfw8dE" + . "JEgAAAAARIlcJAiJbCQQRTH2x0QkTAAAAADpcP3@@4tEJDAx@4P4AkAPlMeJvCSs" + . "AAAAD4SpAwAAMcCDfCQwAQ+UwEWFwImEJKAAAAAPhNsKAABEiaQkUAEAAEyLlCR4" + . "AQAARTHJi7wkOAEAAEyLpCRoAQAARTHbTIusJHABAABEi7QkuAEAAESLvCTAAQAA" + . "iVwkGEGLGkmDwliJ2MHoEEEPr8eZ9@0Pr8eJwQ+3w0EPr8aZ9@6NBIFDiQSMQYtC" + . "rEGNBENBg8MWQ4lEjQBJg8EBRTnId72LhCSQAQAARIukJFABAACJXCQwi1wkGESJ" + . "RCQYQQ+vwMH4ColEJBxIi4QkeAEAAMdEJEAAAAAARTH@SIPACEiJBCTpq@r@@0SJ" + . "8OnE@v@@i3wkMIn4wegQD6+EJMABAACZ9@0Pr4QkOAEAAInBD7fHD6+EJLgBAACZ" + . "9@6NBIGJRCQw6Wv6@@+J6ESLjCRYAQAARQHAD6@GSJhIA4QkeAEAAEWFyUiJBCQP" + . "jnL7@@9CjTylAAAAAMdEJBAAAAAAMcDHRCRIAAAAAESJfCR4iXwkUEWF5A+O6QAA" + . "AEhjVCQISIu8JDABAABFMe1MY3QkSEwDdCQoSI1sFwJMiwwkRTHSD7Z9AA+2df9E" + . "D7Zd@usmZi4PH4QAAAAAAA+vyQ+v0o0MSQ+vwI0UkY0EQjnDc2hJg8EIMcBFOcIP" + . "gxsBAABBiwFBi1kEQYPCAonBD7bUD7bAwekQKfJEKdgPtskp+YH7@@@@AHazQYnf" + . "QcHvEEUPtv8Pr8lFD6@@RDn5d7IPts8Pr9IPr8k5ynelD7bTD6@AD6@SOdB3mLoB" + . "AAAAuAEAAABDiBQuSYPFAUiDxQRFOewPj0P@@@+LdCRQRAFkJEgBdCQIg0QkEAGL" + . "VCQgi3wkEAFUJAg5vCRYAQAAD4Xw@v@@RIt8JHjpFvn@@0WF7XgVRDtsJBB@DoX@" + . "eAo7fCQID464BQAAi0QkbIXAD4WNBQAAg+8Bg4QkgAAAAAGDRCR8AYuUJIQAAAA5" + . "lCSAAAAAfLqLdCRsifCD4AEBwonwg8ABiZQkhAAAAIPgA4lEJGzpW@v@@w8fRAAA" + . "icLpQf@@@0yJ0Oka@P@@i0QkMIuMJFgBAAAx9jH@Qo0spQAAAACDwAHB4AeFyYlE" + . "JDAPjo@5@@9Ei3QkCESLbCQwRYXkflVIi5QkMAEAAExj30wDXCQoSWPGRTHJSI1M" + . "AgIPthEPtkH@RA+2Uf5rwEtr0iYBwkSJ0MHgBEQp0AHQQTnFQw+XBAtJg8EBSIPB" + . "BEU5zH@MQQHuRAHng8YBRAN0JCA5tCRYAQAAdZXp9vf@@4noRQHAD6@GweACSJhI" + . "A4QkeAEAAEiJBCSLhCSYAQAAwfgKg8ABhe2JRCQID46VCgAAi3wkCIuEJMABAADH" + . "RCRIAAAAAMdEJBgAAAAARImkJFABAACJrCSIAQAAD6@HiXwkUIlEJHiJ+A+vxsHg" + . "AkiYSIlEJHBIi4QkeAEAAEiJRCRAifjB4AJImEiJRCQQi4QkuAEAAA+vx4lEJBxI" + . "iwQkSIPACEiJRCQghfYPjiYBAABIi3wkQESLZCQIMe0Ptl8CTItMJCBBvgIAAABE" + . "D7ZXAUQPth9Bid3rHQ8fAA+v2w+v0o0cWw+vwI0Uk40EQjnBc2pJg8EIRTnwD4Z9" + . "AAAAQYsBQYtJBEGDxgKJww+21A+2wMHrEEQp0kQp2A+220Qp64H5@@@@AHazQYnP" + . "QcHvEEUPtv8Pr9tFD6@@RDn7d7IPtt0Pr9IPr9s52nelD7bJD6@AD6@JOch3mGaQ" + . "i0QkCEgDfCQQA2wkHEQB4EQ55n5lQYnE6UP@@@8PHwCLRCRIRIt0JBhEievB4xBB" + . "weIIQQnamU1jzkUJ2ve8JIgBAAAPr4QkOAEAAInBieiZ9@5Ii5QkaAEAAI0EgUKJ" + . "BIpEifCDwAGJRCQYSIuEJHABAABGiRSI64aLfCRQi0QkCItUJHgBVCRISItUJHBI" + . "AVQkQAH4ObwkiAEAAH4JiUQkUOmk@v@@i0QkGESLpCRQAQAAD6+EJJABAADB+AqJ" + . "RCQcSIsEJMdEJEAAAAAARTH@i1gEidgPts8PttPB6BAPtsCJxw+v+InID6@Bibwk" + . "mAAAAImEJJwAAACJ0A+vwomEJJQAAADpffX@@8dEJEAAAAAAx0QkHAAAAABFMf@H" + . "RCQYAAAAAOn19P@@i5QkWAEAAIXSD4589v@@Q40EZESLdCQIQo0spQAAAAAx9jH@" + . "SJhIA4QkYAEAAEmJxUWF5H5aSIuUJDABAABJY8ZMY99FMclNAetIjUwCAg8fRAAA" + . "D7YRSIPBBERr0iYPtlH7a8JLQY0UAkQPtlH6RInQweAERCnQAdDB+AdDiAQLSYPB" + . "AUU5zH@KQQHuRAHng8YBRAN0JCA5tCRYAQAAdZBIi3wkWDHSQY1sJP9EiXwkSEUx" + . "0olcJCBBiddIifhIg8ABSIlEJAi4AQAAAEiJxouEJFgBAABIKf6LfCQwSIl0JBBE" + . "jXD@RYXkD47TAAAASItEJAhNY99Ii3QkKEuNVB0BTo0MGEiLRCQQTAHeTQHpSo0M" + . "GDHATAHpZi4PH4QAAAAAAEiFwA+EgQMAADnFD4R5AwAARYXSD4RwAwAARTnWD4Rn" + . "AwAARA+2Qv9ED7Za@rsBAAAAQQH4RTnYckZED7YaRTnYcj1ED7ZZ@0U52HIzRQ+2" + . "Wf9FOdhyKUQPtln+RTnYch9ED7YZRTnYchZFD7ZZ@kU52HIMRQ+2GUU52A+Sw2aQ" + . "iBwGSIPAAUiDwgFJg8EBSIPBAUE5xA+PZP@@@0UB50GDwgFEOZQkWAEAAA+FEv@@" + . "@4tcJCBEi3wkSOmJ8@@@RIuUJLgBAACLnCTAAQAAMcBFD6@SD6@bRYX2D4569@@@" + . "6RP3@@+DfCRsAQ+E@AEAAIN8JGwCD4S4AgAAQYPtAelX+v@@g4QkiAAAAAHHRCRI" + . "CQAAAIn4SIu0JGABAABBD6@ERo0MKEljwYA8BgMPhqQBAACLRCQYRDn4QQ9Mx4O8" + . "JBABAAADiUQkIA+OsAEAAIuEJEgBAACLlCRAAQAAAfhEAeoPr4QkOAEAAIO8JBAB" + . "AAAFD4TAAgAARI0MkItEJDBIi7QkMAEAAESLVCQgRAHIjVACRYXSSGPSD7Y0Fo1Q" + . "AUiYSGPSiXQkUEiLtCQwAQAAD7Y0Fol0JHhIi7QkMAEAAA+2BAaJRCRwD4TrAQAA" + . "i0QkQESJXCQoRTHSi3QkHEyLnCQwAQAAiYQkjAAAAOtyRDu8JJAAAAB+WUiLhCRw" + . "AQAAQosUkEQByo1CAo1KAUhj0kEPthQTSJhIY8krVCRwQQ+2BANBD7YMCytEJFAr" + . "TCR4D6@SD6@AD6@JjQRAjQSIjQRQQTnAcgqDrCSMAAAAAXh+SYPCAUQ5VCQgD47P" + . "AQAARDlUJBhEiZQkkAAAAA+Oe@@@@0iLhCRoAQAAQosUkEQByo1CAo1KAUhj0kEP" + . "thQTSJhIY8krVCRwQQ+2BANBD7YMCytEJFArTCR4D6@SD6@AD6@JjQRAjQSIjQRQ" + . "QTnAD4Mo@@@@g+4BD4kf@@@@RItcJCiDfCRICQ+Eavj@@4NEJGgB6Snz@@9Bg8UB" + . "6Wb4@@+DRCRMAekA8@@@kIXAD4SzAAAARItUJECLdCQcMcnrM0Q7fCQofiJIi5Qk" + . "cAEAAESJyAMEikiLlCRgAQAA9gQCAXUGQYPqAXiZSIPBATlMJCB+dzlMJBiJTCQo" + . "fsNIi4QkaAEAAESJygMUiEiLhCRgAQAA9gQQAnWng+4BeaLpX@@@@w8fhAAAAAAA" + . "uwMAAADpRvH@@8YEBgLp8Pz@@0G6AwAAAOk+8f@@x0QkHAAAAADHRCQYAAAAAOm7" + . "9f@@g8cB6aD3@@+LdCQcQYPGAUiDvCSoAQAAAA+EHQQAAEljxouUJEgBAABIjQyF" + . "AAAAAIuEJEABAAAB+sHiEEQB6AnQSIuUJKgBAACJRAr8i5QkKAEAAIXSD4UeAwAA" + . "i0QkHCnwRDm0JLABAABIi3QkYIlEDvwPjhPz@@@ppf7@@0SLXCQo64aNBJCJRCQo" + . "i4QkrAAAAIXAD4XjAQAAi0QkIIXAD4Rg@@@@SIsEJIt0JBxFMcnHRCR4AAAAAESJ" + . "dCRwRIm8JIwAAABEiZwkkAAAAEiJRCRQSIuEJGgBAACLTCQoTIu8JDABAABMi1Qk" + . "UEyLhCRwAQAARItcJHhCAwyIQYE6@@@@AEeLBIiNUQKNQQFIY8lBD5fGSGPSSJhF" + . "D7b2QQ+2FBdBD7YEB4mUJLQAAACJhCS4AAAAweIQweAICdBBD7YUDwnQiZQkvAAA" + . "AImEJLAAAADrHg+v0g+vyY0UUg+vwI0Uio0EQjnDD4OvAAAASYPCCEU5ww+D4AAA" + . "AESLvCSgAAAAQYPDAkGLAkGLWgRFhf90Hk2FyYtUJDAPRJQksAAAAEUx9oXAQQ+U" + . "xolUJDCJ0InCD7bMD7bAweoQK4wkuAAAACuEJLwAAAAPttIrlCS0AAAAgfv@@@8A" + . "D4Z0@@@@QYnfQcHvEEUPtv8Pr9JFD6@@RDn6D4dz@@@@D7bXD6@JD6@SOdEPh2L@" + . "@@8PttMPr8APr9I50A+HUf@@@0WF9nQFg+4BeDtJg8EBSINEJFBYg0QkeBZEOUwk" + . "IA+Pkf7@@0SLdCRwRIu8JIwAAABEi5wkkAAAAOmu@f@@RYX2dcfrwESLdCRwRIu8" + . "JIwAAABEi5wkkAAAAOml@P@@i0QkIIt0JByFwA+Eff3@@0Ux0us5OYQkmAAAAHwY" + . "D6@JOYwknAAAAHwMD6@SOZQklAAAAH0Jg+4BD4hm@P@@SYPCAUQ5VCQgD44@@f@@" + . "SIuEJGgBAACLVCQoTIuMJDABAABCAxSQSIuEJHABAABCiwSQicGNQgKJTCQwwekQ" + . "SJgPtslBD7YEASnIjUoBSGPSD6@ASGPJRQ+2DAlIi0wkMA+2zUEpyUSJyUyLjCQw" + . "AQAAQQ+2FBFED7ZMJDBEKcqB+@@@@wAPh0r@@@8Pr8mNBEAPr9KNBIiNBFA5ww+C" + . "VP@@@+lY@@@@x0QkHAAAAADHRCQYAAAAAOlF9@@@RDm0JLABAABEifAPjhvx@@+J" + . "+CuEJMABAABFMdKDwAFBD0jCicGLhCTAAQAAjUQH@0E5w0EPTsOJxkSJ6CuEJLgB" + . "AACDwAFED0nQi4QkuAEAAEGNRAX@OcUPTsU5zolEJCAPjEH7@@9EieJJY8IPr9FI" + . "Y9JIAdBIA4QkYAEAAEmJwY1GAYlEJCiLRCQgRCnQSI1wAUQ7VCQgfxNKjRQOTInI" + . "gCADSIPAAUg50HX0g8EBTANMJFg7TCQoddjp6Pr@@4uMJCgBAACFyQ+FQf@@@+nU" + . "+v@@kJCQkJCQkJCQkJCQkA==" + MyFunc := this.MCode(StrReplace((A_PtrSize = 8 ? x64 : x32), "@", "/")) + } + text := j[1], w := j[2], h := j[3] + , err1 := this.Floor(j[4] ? j[5] : ini.err1) + , err0 := this.Floor(j[4] ? j[6] : ini.err0) + , mode := j[7], color := j[8], n := j[9] + ok := (!ini.bits.Scan0 || mode < 1 || mode > 5) ? 0 + : DllCall(MyFunc.Ptr, "int", mode, "uint", color, "uint", n, "int", dir + , "Ptr", ini.bits.Scan0, "int", ini.bits.Stride + , "int", sx, "int", sy, "int", sw, "int", sh + , "Ptr", ini.ss, "Ptr", ini.s1, "Ptr", ini.s0 + , "Ptr", text, "int", w, "int", h + , "int", Floor(Abs(err1) * 1024), "int", Floor(Abs(err0) * 1024) + , "int", (err1 < 0 || err0 < 0), "Ptr", ini.allpos, "int", ini.allpos_max + , "int", Floor(w * ini.zoomW), "int", Floor(h * ini.zoomH)) return ok - } - if (!found && !ok) - return 1 - if (time>=0 && A_TickCount>=timeout) - Break - Sleep 50 } - return 0 - } - x1:=this.Floor(x1), y1:=this.Floor(y1), x2:=this.Floor(x2), y2:=this.Floor(y2) - if (x1=0 && y1=0 && x2=0 && y2=0) - n:=150000, x:=y:=-n, w:=h:=2*n - else - x:=Min(x1,x2), y:=Min(y1,y2), w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1 - bits:=this.GetBitsFromScreen(&x,&y,&w,&h,ScreenShot,&zx,&zy), x-=zx, y-=zy - , this.ok:=0, info:=[] - Loop Parse, text, "|" - if IsObject(j:=this.PicInfo(A_LoopField)) - info.Push(j) - if (w<1 || h<1 || !(num:=info.Length) || !bits.Scan0) - { - return 0 - } - arr:=[], info2:=Map(), k:=0, s:="" - , mode:=(IsObject(JoinText) ? 2 : JoinText ? 1 : 0) - For i,j in info - { - k:=Max(k, (j[7]=5 && j[8]!=2 ? j[9] : j[2]*j[3])) - if (mode) - v:=(mode=1 ? i : j[10]) . "", s.="|" v - , (v!="") && ((!info2.Has(v) && info2[v]:=[]), info2[v].Push(j)) - } - sx:=x, sy:=y, sw:=w, sh:=h, (mode=1 && JoinText:=[s]) - , allpos_max:=(FindAll || JoinText ? 10000:1) - , s1:=Buffer(k*4), s0:=Buffer(k*4) - , ss:=Buffer(sw*(sh+3)), allpos:=Buffer(allpos_max*8) - , ini:={ sx:sx, sy:sy, sw:sw, sh:sh, zx:zx, zy:zy - , mode:mode, bits:bits, ss:ss.Ptr, s1:s1.Ptr, s0:s0.Ptr - , allpos:allpos.Ptr, allpos_max:allpos_max - , err1:err1, err0:err0, zoomW:zoomW, zoomH:zoomH } - Loop 2 - { - if (err1=0 && err0=0) && (num>1 || A_Index>1) - ini.err1:=err1:=0.05, ini.err0:=err0:=0.05 - if (!JoinText) - { - For i,j in info - Loop this.PicFind(ini, j, dir, sx, sy, sw, sh) - { - v:=NumGet(allpos,4*A_Index-4,"uint"), x:=(v&0xFFFF)+zx, y:=(v>>16)+zy - , w:=Floor(j[2]*zoomW), h:=Floor(j[3]*zoomH) - , arr.Push({1:x, 2:y, 3:w, 4:h, x:x+w//2, y:y+h//2, id:j[10]}) - if (!FindAll) - Break 3 - } - } - else - For k,v in JoinText - { - v:=StrSplit(Trim(RegExReplace(v, "\s*\|[|\s]*", "|"), "|") - , (InStr(v,"|")?"|":""), " `t") - , this.JoinText(arr, ini, info2, v, 1, offsetX, offsetY - , FindAll, dir, 0, 0, 0, sx, sy, sw, sh) - if (!FindAll && arr.Length) - Break 2 - } - if (err1!=0 || err0!=0 || arr.Length || info[1][4] || info[1][7]=5) - Break - } - if (arr.Length) - { - OutputX:=arr[1].x, OutputY:=arr[1].y, this.ok:=arr - return arr - } - return 0 -} - -; the join text object use [ "abc", "xyz", "a1|a2|a3" ] - -JoinText(arr, ini, info2, text, index, offsetX, offsetY - , FindAll, dir, minX, minY, maxY, sx, sy, sw, sh) -{ - if !(Len:=text.Length) || !info2.Has(key:=text[index]) - return 0 - zoomW:=ini.zoomW, zoomH:=ini.zoomH, mode:=ini.mode - For i,j in info2[key] - if (mode!=2 || key==j[10]) - Loop ok:=this.PicFind(ini, j, dir, sx, sy, (index=1 ? sw - : Min(sx+offsetX+Floor(j[2]*zoomW),ini.sx+ini.sw)-sx), sh) - { - if (A_Index=1) - { - pos:=[], p:=ini.allpos-4 - Loop ok - pos.Push(NumGet(p+=4,"uint")) - } - v:=pos[A_Index], x:=v&0xFFFF, y:=v>>16 - , w:=Floor(j[2]*zoomW), h:=Floor(j[3]*zoomH) - , (index=1 && (minX:=x, minY:=y, maxY:=y+h)) - , minY1:=Min(y, minY), maxY1:=Max(y+h, maxY), sx1:=x+w - if (index1 || !FindAll) - return 1 - } - else - { - comment:="" - For k,v in text - comment.=(mode=2 ? v : info2[v][1][10]) - x:=minX+ini.zx, y:=minY1+ini.zy, w:=sx1-minX, h:=maxY1-minY1 - , arr.Push({1:x, 2:y, 3:w, 4:h, x:x+w//2, y:y+h//2, id:comment}) - if (index>1 || !FindAll) - return 1 - } - } - return 0 -} - -PicFind(ini, j, dir, sx, sy, sw, sh) -{ - static MyFunc:="" - if (!MyFunc) - { - x32:="VVdWU4HsmAAAAIuEJNQAAAADhCTMAAAAi5wk@AAAAIO8JKwAAAAFiUQkIIuEJPgA" - . "AACNBJiJRCQ0D4RKBgAAi4Qk6AAAAIXAD45ADwAAiXwkEIu8JOQAAAAx7ccEJAAA" - . "AADHRCQIAAAAAMdEJBQAAAAAx0QkDAAAAACNtgAAAACLhCTgAAAAi0wkDDH2MdsB" - . "yIX@iUQkBH896ZAAAABmkA+vhCTMAAAAicGJ8Jn3@wHBi0QkBIA8GDF0TIuEJNwA" - . "AACDwwEDtCQAAQAAiQyog8UBOd90VIsEJJn3vCToAAAAg7wkrAAAAAR1tQ+vhCTA" - . "AAAAicGJ8Jn3@40MgYtEJASAPBgxdbSLRCQUi5Qk2AAAAIPDAQO0JAABAACJDIKD" - . "wAE534lEJBR1rAF8JAyDRCQIAYu0JAQBAACLRCQIATQkOYQk6AAAAA+FMv@@@4tE" - . "JBSLfCQQD6+EJOwAAACJbCQwwfgKiUQkKIuEJPAAAAAPr8XB+AqJRCRAg7wkrAAA" - . "AAQPhCIGAACLhCTAAAAAi5wkxAAAAA+vhCTIAAAAjSyYi4QkzAAAAIucJMAAAAD3" - . "2IO8JKwAAAABjQSDiUQkLA+ELwYAAIO8JKwAAAACD4Q4CAAAg7wkrAAAAAMPhLkL" - . "AACLjCTQAAAAhckPjicBAACLhCTMAAAAi6wkzAAAAMdEJAwAAAAAx0QkEAAAAACJ" - . "fCQYg+gBiUQkCI22AAAAAIt8JBCLtCTUAAAAMcCLXCQgAfsB94Xtif6J738X6bwA" - . "AADGBAYEg8ABg8MBOccPhKQAAACDvCSsAAAAA3@khcAPtgsPhLoPAAAPtlP@iVQk" - . "BDlEJAgPhMIPAAAPtlMBiRQki5Qk9AAAAIXSD4SfAQAAD7bpugYAAACD7QGD@QF2" - . "G4N8JAQBD5TCgzwkAYnVD5TCCeoPttIB0oPKBIHh@QAAAL0BAAAAdByLTCQEiywk" - . "hckPlEQkBIXtD5TBic0PtkwkBAnNCeqDwwGIFAaDwAE5xw+FXP@@@wF8JBCJ@YNE" - . "JAwBi0QkDDmEJNAAAAAPjwz@@@+LfCQYg7wkrAAAAAN@FouEJPQAAACFwA+VwDwB" - . "g5wkxAAAAP+LXCQUi3QkKDHAOfOLdCRAD07YiVwkFItcJDA58w9Pw4lEJDCLhCTM" - . "AAAAK4QkAAEAAIlEJASLhCTQAAAAK4QkBAEAAIO8JLgAAAAJiUQkCA+ExgAAAIuE" - . "JLgAAACD6AGD+AcPh7wCAACD+AOJRCQkD463AgAAi0QkBMdEJEQAAAAAx0QkDAAA" - . "AACJBCSLRCQIiUQkHItcJEQ5HCTHRCRMAAAAAA+MCwEAAItcJEw5XCQcD4zCDQAA" - . "i3QkRItcJCSLBCQp8PbDAg9Exot0JEyJwotEJBwp8PbDAQ9ExoP7A4nWD0@wD0@C" - . "iXQkGIlEJBDp3gsAAI12AA+20YPqAYP6AhnSg+ICg8IEgeH9AAAAD5TBCcqIFAbp" - . "8v3@@4tcJASLdCQIx0QkZAAAAADHRCRgAQAAAMdEJFQAAAAAx0QkWAAAAACJ2I1W" - . "AYk0JMHoH4lcJBzHRCQMAAAAAAHY0fiJRCQQifDB6B8B8NH4iUQkGInYg8ABicEP" - . "r8o50A9MwoPACIlMJHyJwQ+vyImMJIAAAACLXCR8OVwkZH0Zi5wkgAAAADlcJFjH" - . "RCRcAAAAAA+M9QQAAIuMJLgAAACFyQ+FnQIAAIuUJPgAAACF0g+EjgIAAIuEJAQB" - . "AAAPr4QkAAEAAIP4AQ+EdgIAAIN8JAwBD46lCgAAi0QkNIucJPgAAAAx7cdEJAQA" - . "AAAAiSwkjXgEi0QkDIPoAYlEJBCLRCQEiwwkizeLRAMEhcmJRCQIich4NotP@DnO" - . "D4N1BQAAifqNa@zrDY12AIPqBItK@DnOcxeJCotMhQSJTIMEg+gBg@j@deS4@@@@" - . "@4tMJDSDwAGDBCQBg8cEg0QkBASJNIGLdCQIiTSDiwQkO0QkEHWNi4QkBAEAAIus" - . "JAABAAAPr8APr+2JRCQEi7Qk+AAAAMdEJAgAAAAAMduLRCQIiwSGiUQkEA+3+MHo" - . "EIXbiQQkdC0xyY22AAAAAIsUjg+3win4D6@AOeh9D8HqECsUJA+v0jtUJAR8EYPB" - . "ATnZdduLRCQQiQSeg8MBg0QkCAGLRCQIOUQkDHWiidiBxJgAAABbXl9dwlwAx0Qk" - . "JAAAAACLRCQIx0QkRAAAAADHRCQMAAAAAIkEJItEJASJRCQc6UT9@@8xwIO8JLAA" - . "AAACD5TAiYQkhAAAAA+EUAQAADHAg7wksAAAAAGLrCS0AAAAD5TAhe2JRCR4D4SG" - . "CwAAi7Qk2AAAAIuUJLQAAAAx7YucJOAAAACLjCTcAAAAiXwkCI0ElolEJASNdCYA" - . "izuDxgSDw1iDwQSJ+MHoEA+vhCQEAQAAmfe8JOgAAAAPr4QkwAAAAIkEJA+3xw+v" - . "hCQAAQAAmfe8JOQAAACLFCSNBIKJRvyLQ6yNREUAg8UWiUH8O3QkBHWmi4QktAAA" - . "AIm8JLAAAACLfCQIiUQkFIuEJOwAAAAPr4QktAAAAMH4ColEJCiLhCTgAAAAx0Qk" - . "QAAAAADHRCQwAAAAAIPACIlEJFDpSfr@@4tEJAyBxJgAAABbXl9dwlwAi4QksAAA" - . "AMHoEA+vhCQEAQAAmfe8JOgAAAAPr4QkwAAAAInBD7eEJLAAAAAPr4QkAAEAAJn3" - . "vCTkAAAAjQSBiYQksAAAAOnt+f@@i4Qk6AAAAIu0JNAAAAAPr4Qk5AAAANGkJLQA" - . "AAADhCTgAAAAhfaJRCRQD47z+v@@i4QkzAAAAInqi2wkUMdEJCQAAAAAx0QkOAAA" - . "AADB4AKJRCRIMcCLnCTMAAAAhdsPjisBAACLnCS8AAAAAdMDVCRIiVwkEItcJCAD" - . "XCQ4iVQkPAOUJLwAAACJXCQYiVQkHI12AI28JwAAAACLdCQQMds5nCS0AAAAD7ZO" - . "AolMJAQPtk4BD7Y2iUwkCIl0JAx2W412AI28JwAAAACLRJ0Ag8MCi3yd@InCD7bM" - . "D7bAK0QkDMHqECtMJAgPttIrVCQEgf@@@@8AiQQkdyUPr9IPr8mNFFIPr8CNFIqN" - . "BEI5x3NGMcA5nCS0AAAAd6+JwutBif7B7hCJ8A+28A+v0g+v9jnyd92J+A+21A+v" - . "yQ+v0jnRd86LNCSJ+A+20A+v0onwD6@GOdB3uroBAAAAuAEAAACLXCQYg0QkEASL" - . "TCQQiBODwwE7TCQciVwkGA+FGv@@@4u0JMwAAAABdCQ4i1QkPINEJCQBA1QkLItc" - . "JCQ5nCTQAAAAD4Ws@v@@6U34@@+LRCQQhcB4G4tcJBw52H8Ti0QkGIXAeAuLHCQ5" - . "2A+ONwYAAItsJFSF7Q+F4AUAAINsJBgBg0QkXAGDRCRYAYt0JGA5dCRcfLiLXCRU" - . "idiD4AEBxonYg8ABiXQkYIPgA4lEJFTpvvr@@4uEJLAAAACLjCTQAAAAxwQkAAAA" - . "AMdEJAQAAAAAg8ABweAHiYQksAAAAIuEJMwAAADB4AKFyYlEJAwPjsz4@@+J6Ius" - . "JLAAAACJfCQQi5QkzAAAAIXSfmaLjCS8AAAAi1wkIIu8JLwAAAADXCQEAcEDRCQM" - . "iUQkCAHHjXYAjbwnAAAAAA+2UQIPtkEBD7Yxa8BLa9ImAcKJ8MHgBCnwAdA5xQ+X" - . "A4PBBIPDATn5ddWLnCTMAAAAAVwkBItEJAiDBCQBA0QkLIs8JDm8JNAAAAAPhXf@" - . "@@+LfCQQ6Qb3@@+LBCTprvr@@4uEJOgAAACLvCTgAAAAD6+EJOQAAADRpCS0AAAA" - . "jQSHiUQkUIuEJPAAAADB+AqDwAGJRCQki4Qk6AAAAIXAD45ECgAAi3wkJIuEJAQB" - . "AACLdCRQx0QkMAAAAADHRCQUAAAAAA+vx4lEJECLhCTkAAAAD6@HweACiUQkSIuE" - . "JOAAAACDwAKJRCQ4ifiNPL0AAAAAiXwkLInHD6+EJAABAACJfCQ8iUQkKIuEJOQA" - . "AACFwA+OaQEAAItEJDjHRCQcAAAAAIlEJBCLRCQkiUQkGItEJBC7AgAAAA+2OIk8" - . "JA+2eP8PtkD+iXwkBIlEJAg5nCS0AAAAD4bCAAAAiwSeg8MCi3ye@InCD7bMD7bA" - . "K0QkCMHqECtMJAQPttIrFCSB@@@@@wCJRCQMd0YPr9IPr8mNFFIPr8CNFIqNBEI5" - . "x3Kui3wkGItEJCSLTCQsAUwkEItMJCgBTCQcAfg5vCTkAAAAD465AAAAiUQkGOlf" - . "@@@@if3B7RCJ6A+26A+v0g+v7TnqD4dm@@@@ifgPttQPr8kPr9I50Q+HU@@@@4tM" - . "JAyJ+A+2+A+v@4nID6@BOfh2kDmcJLQAAAAPhz7@@@+LRCQwi3wkFJmNHL0AAAAA" - . "97wk6AAAAA+vhCTAAAAAicGLRCQcmfe8JOQAAACLFCTB4hCNBIGLjCTYAAAAiQS5" - . "i0QkBIPHAYl8JBSLvCTcAAAAweAICdALRCQIiQQf6SD@@@+LfCQ8i0QkJItMJEAB" - . "TCQwi0wkSAFMJDgB+Dm8JOgAAAB+CYlEJDzpXP7@@4tEJBQPr4Qk7AAAAMH4ColE" - . "JCiLRCRQx0QkQAAAAADHRCQwAAAAAIt4BIn4ifvB6BAPtteJ+w+2wA+2y4nDD6@Y" - . "idAPr8KJXCRwiUQkdInID6@BiUQkbOlH9P@@i4Qk0AAAAIXAD45u9f@@i5wkzAAA" - . "AItEJCDHBCQAAAAAx0QkBAAAAACJfCQMjQRYiUQkGInYweACiUQkCIu0JMwAAACF" - . "9n5Xi4wkvAAAAItcJBiLvCS8AAAAA1wkBAHpA2wkCAHvD7ZRAoPBBIPDAWvyJg+2" - . "Uf1rwkuNFAYPtnH8ifDB4AQp8AHQwfgHiEP@Ofl10ou8JMwAAAABfCQEgwQkAQNs" - . "JCyLBCQ5hCTQAAAAdYqLhCTMAAAAi3wkDDHti5QktAAAADH2g+gBiXwkJIlEJAyL" - . "hCTQAAAAg+gBiUQkEIucJMwAAACF2w+O4gAAAIu8JMwAAACLRCQYAfeNDDCJ+4l8" - . "JByJxwHfifMrnCTMAAAAiXwkBIt8JCABwwH3McCJfCQIiRwkhcAPhGQDAAA5RCQM" - . "D4RaAwAAhe0PhFIDAAA5bCQQD4RIAwAAD7YRD7Z5@74BAAAAA5QksAAAADn6ckYP" - . "tnkBOfpyPos8JA+2Pzn6cjSLXCQED7Y7OfpyKYs8JA+2f@85+nIeizwkD7Z@ATn6" - . "chMPtnv@OfpyCw+2cwE58g+Sw4nei3wkCInziBwHg8ABg8EBg0QkBAGDBCQBOYQk" - . "zAAAAA+FWv@@@4t0JByDxQE5rCTQAAAAD4X@@v@@i3wkJImUJLQAAADpY@L@@8dE" - . "JEAAAAAAx0QkKAAAAADHRCQwAAAAAMdEJBQAAAAA6cfx@@+DfCRUAQ+E6gEAAIN8" - . "JFQCD4SVAgAAg2wkEAHpBfr@@4uEJAQBAACLrCQAAQAAD6@AD6@tiUQkBItEJAyF" - . "wA+P6PX@@zHA6VL2@@+DRCRkAcdEJCQJAAAAi0QkGIucJNQAAAAPr4QkzAAAAANE" - . "JBCAPAMDD4ZnAQAAi3QkFItcJDA53g9N3oO8JKwAAAADiVwkIA+OdQEAAItEJBgD" - . "hCTIAAAAD6+EJMAAAACLVCQQA5QkxAAAAIO8JKwAAAAFD4RsAgAAjTSQi4QksAAA" - . "AIucJLwAAAAB8A+2XAMCiVwkOIucJLwAAAAPtlwDAYlcJDyLnCS8AAAAD7YEA4lE" - . "JEiLRCQghcAPhKoBAACLRCRAiXwkLDHbi2wkKIu8JLwAAACJRCRo62KNtCYAAAAA" - . "OVwkMH5Ii4Qk3AAAAIsUmAHyD7ZEFwIPtkwXAStEJDgrTCQ8D7YUFytUJEgPr8AP" - . "r8mNBEAPr9KNBIiNBFA5hCS0AAAAcgeDbCRoAXhhg8MBOVwkIA+EogEAADlcJBR+" - . "n4uEJNgAAACLFJgB8g+2RBcCD7ZMFwErRCQ4K0wkPA+2FBcrVCRID6@AD6@JjQRA" - . "D6@SjQSIjQRQOYQktAAAAA+DWv@@@4PtAQ+JUf@@@4t8JCyDfCQkCQ+EKfj@@4NE" - . "JEwB6Try@@+DRCQQAekm+P@@g0QkRAHpEfL@@410JgCF2w+EoAAAAAOEJNQAAACL" - . "XCRAMdKLbCQoicHrJTlUJDB+Fou0JNwAAACLBJYByPYAAXUFg+sBeJqDwgE5VCQg" - . "dGo5VCQUftWLtCTYAAAAiwSWAcj2AAJ1xIPtAXm@6XD@@@@HRCQEAwAAAOlB8P@@" - . "i3wkCMYEBwLpEf3@@8cEJAMAAADpOfD@@8dEJCgAAAAAx0QkFAAAAADpGPX@@4NE" - . "JBgB6XD3@@+LbCQoi4Qk+AAAAINEJAwBhcAPhMoDAACLVCQYA5QkyAAAAItcJAyL" - . "RCQQA4QkxAAAAIu0JPgAAADB4hCNi@@@@z8J0IkEjou0JLgAAACF9g+F0gIAAItE" - . "JCiLdCQ0Keg5nCT8AAAAiQSOD44z8v@@6bb+@@+LfCQs64mLtCSEAAAAjQSQiUQk" - . "PIX2D4WuAQAAi1wkIItEJFAx9otsJCiF24lEJGgPhFn@@@+LhCTYAAAAi1wkaItU" - . "JDwDFLCJXCRIa8YWgTv@@@8AiUQkOA+XwA+2wIlEJCyLhCTcAAAAiwSwiYQktAAA" - . "AIuEJLwAAAAPtkQQAomEJIwAAADB4BCJwYuEJLwAAAAPtkQQAYmEJJAAAADB4AgJ" - . "yIuMJLwAAAAPtgwRCciJjCSUAAAAiYQkiAAAAOsfD6@SD6@JjRRSD6@AjRSKjQRC" - . "OccPg70AAACDRCRICItEJDg7hCS0AAAAD4PPAAAAi1QkeIt8JEiDRCQ4AoXSiweL" - . "fwR0JoX2i5wkiAAAAA9FnCSwAAAAhcAPlMAPtsCJRCQsiZwksAAAAInYicIPtswP" - . "tsDB6hArjCSQAAAAK4QklAAAAA+20iuUJIwAAACB@@@@@wAPhmX@@@+J+8HrEA+2" - . "2w+v0g+v2znaD4dp@@@@ifsPttcPr8kPr9I50Q+HVv@@@4n7D7bTD6@AD6@SOdAP" - . "h0P@@@+LRCQshcB0CYPtAQ+IDf3@@4PGAYNEJGhYOXQkIA+Fe@7@@+nP@f@@i0Qk" - . "LIXAdeHr1otMJCCLbCQohckPhLX9@@8x9usuOUQkcHwSD6@JOUwkdHwJD6@SOVQk" - . "bH0Jg+0BD4i3@P@@g8YBOXQkIA+Eg@3@@4uEJNgAAACLVCQ8i5wkvAAAAAMUsIuE" - . "JNwAAACLBLCJhCSwAAAAi4QkvAAAAIuMJLAAAAAPtkQQAsHpEA+2ySnID7ZMEwGL" - . "nCSwAAAAD6@AD7bfKdmLnCS8AAAAD7YUEw+2nCSwAAAAKdqB@@@@@wAPh1z@@@8P" - . "r8mNBEAPr9KNBIiNBFA5xw+CXf@@@+lh@@@@x0QkKAAAAADHRCQUAAAAAOnC9@@@" - . "i1wkDDmcJPwAAACJ2A+OrfD@@4tcJBgxyYnOidgrhCQEAQAAg8ABD0jBicKJ2Iuc" - . "JAQBAACNRBj@i1wkCDnDD07Di1wkEInFidgrhCQAAQAAg8ABD0nwidiLnCQAAQAA" - . "jUQY@4tcJAQ5ww9OwznVicMPjIz7@@+LhCTMAAAAg8UBD6@CA4Qk1AAAAInBjUMB" - . "iUQkIDnefw+J8IAkAQODwAE7RCQgdfODwgEDjCTMAAAAOep13+lJ+@@@i6wkuAAA" - . "AIXtD4VK@@@@6TX7@@+QkA==" - x64:="QVdBVkFVQVRVV1ZTSIHsyAAAAEhjhCRQAQAASIu8JKgBAACJjCQQAQAAiVQkMESJ" - . "jCQoAQAAi7QkgAEAAIusJIgBAABJicRIiUQkWEgDhCRgAQAAg@kFSIlEJChIY4Qk" - . "sAEAAEiNBIdIiUQkYA+E3AUAAIXtD44BDAAARTH2iVwkEIu8JLgBAABEiXQkCIuc" - . "JBABAABFMe1Mi7QkcAEAAEUx20Ux@0SJbCQYRImEJCABAABMY1QkCEUxyUUxwEwD" - . "lCR4AQAAhfZ@Mut3Dx9AAEEPr8SJwUSJyJn3@gHBQ4A8AjF0PEmDwAFJY8dBAflB" - . "g8cBRDnGQYkMhn5DRInYmff9g@sEdckPr4QkOAEAAInBRInImff+Q4A8AjGNDIF1" - . "xEiLlCRoAQAASYPAAUljxUEB+UGDxQFEOcaJDIJ@vQF0JAiDRCQYAUQDnCTAAQAA" - . "i0QkGDnFD4VX@@@@RInoi1wkEESLhCQgAQAAD6+EJJABAABEiWwkGMH4ColEJByL" - . "hCSYAQAAQQ+vx8H4ColEJECDvCQQAQAABA+EtwUAAIuEJDgBAACLvCRAAQAAD6+E" - . "JEgBAACNBLiLvCQ4AQAAiUQkCESJ4PfYg7wkEAEAAAGNBIeJRCQgD4SxBQAAg7wk" - . "EAEAAAIPhIQHAACDvCQQAQAAAw+EowoAAIuEJFgBAACFwA+OHwEAAESJfCQQRIuc" - . "JBABAABBjWwk@0yLfCQoi7wkoAEAAEUx9kUx7YlcJAhEiYQkIAEAAA8fhAAAAAAA" - . "RYXkD467AAAASWPFMclJicFNjUQHAUwDjCRgAQAA6xhBxgEEg8EBSYPBAUmDwAFB" - . "OcwPhIkAAABBg@sDf+KFyUEPtlD@D4S1DgAAQQ+2WP45zQ+Euw4AAEUPthCF@w+E" - . "fAEAAA+28rgGAAAAg+4Bg@4BdhiD+wFAD5TGQYP6AQ+UwAnwD7bAAcCDyASB4v0A" - . "AAC+AQAAAHQOhdtAD5TGRYXSD5TCCdYJ8IPBAUmDwQFBiEH@SYPAAUE5zA+Fd@@@" - . "@0UB5UGDxgFEObQkWAEAAA+PKv@@@4tcJAhEi3wkEESLhCQgAQAAg7wkEAEAAAN@" - . "FouEJKABAACFwA+VwDwBg5wkQAEAAP+LfCQYi3QkHDHARInlRIucJFgBAAA59w9O" - . "+EQ7fCRAiXwkGEQPTvgrrCS4AQAARCucJMABAACDvCQoAQAACQ+EuQAAAIuEJCgB" - . "AACD6AGD+AcPh5ACAACD+AOJRCRID46LAgAAiWwkCESJXCQQRTH2x0QkTAAAAACL" - . "fCRMOXwkCMdEJGgAAAAAD4wNAQAAi3wkaDl8JBAPjNIMAACLfCRIi3QkTItEJAgp" - . "8ED2xwIPRMaLdCRoicKLRCQQKfBA9scBD0TGg@8DidcPT@gPT8JBicXptgoAAGaQ" - . "D7bCg+gBg@gCGcCD4AKDwASB4v0AAAAPlMIJ0EGIAekg@v@@iehBjVMBRIlcJAjB" - . "6B+JbCQQx4QkiAAAAAAAAAAB6MeEJIQAAAABAAAAx0QkbAAAAADR+MdEJHwAAAAA" - . "QYnFRInYwegfRAHY0fiJx41FAYnGD6@yOdAPTMJFMfaDwAiJtCSkAAAAicYPr@CJ" - . "tCSoAAAAi7QkpAAAADm0JIgAAAB9HIu0JKgAAAA5dCR8x4QkgAAAAAAAAAAPjEYE" - . "AACLhCQoAQAAhcAPhV0CAABIg7wkqAEAAAAPhE4CAACLhCTAAQAAD6+EJLgBAACD" - . "+AEPhDYCAABBg@4BD45dCQAAQY1G@kyLRCRgTIucJKgBAABFMclFMdJIjRyFBAAA" - . "AEOLdAgEQ4sUCESJ0UOLfAsETInQOdZyE+kJBAAAZpBIg+gBQYsUgDnWcx1BiVSA" - . "BEGLFIOD6QGD+f9BiVSDBHXeSMfA@@@@@0mDwQRIg8ABSYPCAUk52UGJNIBBiTyD" - . "dZ9Ei5QkuAEAAIucJMABAABFD6@SD6@bTIuMJKgBAAAx9jHAQYsssYnvRA+33cHv" - . "EIXAdDJFMcAPH4QAAAAAAEOLDIEPt9FEKdoPr9JEOdJ9DMHpECn5D6@JOdl8E0mD" - . "wAFEOcB@2Uhj0IPAAUGJLJFIg8YBQTn2f6pIgcTIAAAAW15fXUFcQV1BXkFfw8dE" - . "JEgAAAAARIlcJAiJbCQQRTH2x0QkTAAAAADpcP3@@4tEJDAx@4P4AkAPlMeJvCSs" - . "AAAAD4SpAwAAMcCDfCQwAQ+UwEWFwImEJKAAAAAPhNsKAABEiaQkUAEAAEyLlCR4" - . "AQAARTHJi7wkOAEAAEyLpCRoAQAARTHbTIusJHABAABEi7QkuAEAAESLvCTAAQAA" - . "iVwkGEGLGkmDwliJ2MHoEEEPr8eZ9@0Pr8eJwQ+3w0EPr8aZ9@6NBIFDiQSMQYtC" - . "rEGNBENBg8MWQ4lEjQBJg8EBRTnId72LhCSQAQAARIukJFABAACJXCQwi1wkGESJ" - . "RCQYQQ+vwMH4ColEJBxIi4QkeAEAAMdEJEAAAAAARTH@SIPACEiJBCTpq@r@@0SJ" - . "8OnE@v@@i3wkMIn4wegQD6+EJMABAACZ9@0Pr4QkOAEAAInBD7fHD6+EJLgBAACZ" - . "9@6NBIGJRCQw6Wv6@@+J6ESLjCRYAQAARQHAD6@GSJhIA4QkeAEAAEWFyUiJBCQP" - . "jnL7@@9CjTylAAAAAMdEJBAAAAAAMcDHRCRIAAAAAESJfCR4iXwkUEWF5A+O6QAA" - . "AEhjVCQISIu8JDABAABFMe1MY3QkSEwDdCQoSI1sFwJMiwwkRTHSD7Z9AA+2df9E" - . "D7Zd@usmZi4PH4QAAAAAAA+vyQ+v0o0MSQ+vwI0UkY0EQjnDc2hJg8EIMcBFOcIP" - . "gxsBAABBiwFBi1kEQYPCAonBD7bUD7bAwekQKfJEKdgPtskp+YH7@@@@AHazQYnf" - . "QcHvEEUPtv8Pr8lFD6@@RDn5d7IPts8Pr9IPr8k5ynelD7bTD6@AD6@SOdB3mLoB" - . "AAAAuAEAAABDiBQuSYPFAUiDxQRFOewPj0P@@@+LdCRQRAFkJEgBdCQIg0QkEAGL" - . "VCQgi3wkEAFUJAg5vCRYAQAAD4Xw@v@@RIt8JHjpFvn@@0WF7XgVRDtsJBB@DoX@" - . "eAo7fCQID464BQAAi0QkbIXAD4WNBQAAg+8Bg4QkgAAAAAGDRCR8AYuUJIQAAAA5" - . "lCSAAAAAfLqLdCRsifCD4AEBwonwg8ABiZQkhAAAAIPgA4lEJGzpW@v@@w8fRAAA" - . "icLpQf@@@0yJ0Oka@P@@i0QkMIuMJFgBAAAx9jH@Qo0spQAAAACDwAHB4AeFyYlE" - . "JDAPjo@5@@9Ei3QkCESLbCQwRYXkflVIi5QkMAEAAExj30wDXCQoSWPGRTHJSI1M" - . "AgIPthEPtkH@RA+2Uf5rwEtr0iYBwkSJ0MHgBEQp0AHQQTnFQw+XBAtJg8EBSIPB" - . "BEU5zH@MQQHuRAHng8YBRAN0JCA5tCRYAQAAdZXp9vf@@4noRQHAD6@GweACSJhI" - . "A4QkeAEAAEiJBCSLhCSYAQAAwfgKg8ABhe2JRCQID46VCgAAi3wkCIuEJMABAADH" - . "RCRIAAAAAMdEJBgAAAAARImkJFABAACJrCSIAQAAD6@HiXwkUIlEJHiJ+A+vxsHg" - . "AkiYSIlEJHBIi4QkeAEAAEiJRCRAifjB4AJImEiJRCQQi4QkuAEAAA+vx4lEJBxI" - . "iwQkSIPACEiJRCQghfYPjiYBAABIi3wkQESLZCQIMe0Ptl8CTItMJCBBvgIAAABE" - . "D7ZXAUQPth9Bid3rHQ8fAA+v2w+v0o0cWw+vwI0Uk40EQjnBc2pJg8EIRTnwD4Z9" - . "AAAAQYsBQYtJBEGDxgKJww+21A+2wMHrEEQp0kQp2A+220Qp64H5@@@@AHazQYnP" - . "QcHvEEUPtv8Pr9tFD6@@RDn7d7IPtt0Pr9IPr9s52nelD7bJD6@AD6@JOch3mGaQ" - . "i0QkCEgDfCQQA2wkHEQB4EQ55n5lQYnE6UP@@@8PHwCLRCRIRIt0JBhEievB4xBB" - . "weIIQQnamU1jzkUJ2ve8JIgBAAAPr4QkOAEAAInBieiZ9@5Ii5QkaAEAAI0EgUKJ" - . "BIpEifCDwAGJRCQYSIuEJHABAABGiRSI64aLfCRQi0QkCItUJHgBVCRISItUJHBI" - . "AVQkQAH4ObwkiAEAAH4JiUQkUOmk@v@@i0QkGESLpCRQAQAAD6+EJJABAADB+AqJ" - . "RCQcSIsEJMdEJEAAAAAARTH@i1gEidgPts8PttPB6BAPtsCJxw+v+InID6@Bibwk" - . "mAAAAImEJJwAAACJ0A+vwomEJJQAAADpffX@@8dEJEAAAAAAx0QkHAAAAABFMf@H" - . "RCQYAAAAAOn19P@@i5QkWAEAAIXSD4589v@@Q40EZESLdCQIQo0spQAAAAAx9jH@" - . "SJhIA4QkYAEAAEmJxUWF5H5aSIuUJDABAABJY8ZMY99FMclNAetIjUwCAg8fRAAA" - . "D7YRSIPBBERr0iYPtlH7a8JLQY0UAkQPtlH6RInQweAERCnQAdDB+AdDiAQLSYPB" - . "AUU5zH@KQQHuRAHng8YBRAN0JCA5tCRYAQAAdZBIi3wkWDHSQY1sJP9EiXwkSEUx" - . "0olcJCBBiddIifhIg8ABSIlEJAi4AQAAAEiJxouEJFgBAABIKf6LfCQwSIl0JBBE" - . "jXD@RYXkD47TAAAASItEJAhNY99Ii3QkKEuNVB0BTo0MGEiLRCQQTAHeTQHpSo0M" - . "GDHATAHpZi4PH4QAAAAAAEiFwA+EgQMAADnFD4R5AwAARYXSD4RwAwAARTnWD4Rn" - . "AwAARA+2Qv9ED7Za@rsBAAAAQQH4RTnYckZED7YaRTnYcj1ED7ZZ@0U52HIzRQ+2" - . "Wf9FOdhyKUQPtln+RTnYch9ED7YZRTnYchZFD7ZZ@kU52HIMRQ+2GUU52A+Sw2aQ" - . "iBwGSIPAAUiDwgFJg8EBSIPBAUE5xA+PZP@@@0UB50GDwgFEOZQkWAEAAA+FEv@@" - . "@4tcJCBEi3wkSOmJ8@@@RIuUJLgBAACLnCTAAQAAMcBFD6@SD6@bRYX2D4569@@@" - . "6RP3@@+DfCRsAQ+E@AEAAIN8JGwCD4S4AgAAQYPtAelX+v@@g4QkiAAAAAHHRCRI" - . "CQAAAIn4SIu0JGABAABBD6@ERo0MKEljwYA8BgMPhqQBAACLRCQYRDn4QQ9Mx4O8" - . "JBABAAADiUQkIA+OsAEAAIuEJEgBAACLlCRAAQAAAfhEAeoPr4QkOAEAAIO8JBAB" - . "AAAFD4TAAgAARI0MkItEJDBIi7QkMAEAAESLVCQgRAHIjVACRYXSSGPSD7Y0Fo1Q" - . "AUiYSGPSiXQkUEiLtCQwAQAAD7Y0Fol0JHhIi7QkMAEAAA+2BAaJRCRwD4TrAQAA" - . "i0QkQESJXCQoRTHSi3QkHEyLnCQwAQAAiYQkjAAAAOtyRDu8JJAAAAB+WUiLhCRw" - . "AQAAQosUkEQByo1CAo1KAUhj0kEPthQTSJhIY8krVCRwQQ+2BANBD7YMCytEJFAr" - . "TCR4D6@SD6@AD6@JjQRAjQSIjQRQQTnAcgqDrCSMAAAAAXh+SYPCAUQ5VCQgD47P" - . "AQAARDlUJBhEiZQkkAAAAA+Oe@@@@0iLhCRoAQAAQosUkEQByo1CAo1KAUhj0kEP" - . "thQTSJhIY8krVCRwQQ+2BANBD7YMCytEJFArTCR4D6@SD6@AD6@JjQRAjQSIjQRQ" - . "QTnAD4Mo@@@@g+4BD4kf@@@@RItcJCiDfCRICQ+Eavj@@4NEJGgB6Snz@@9Bg8UB" - . "6Wb4@@+DRCRMAekA8@@@kIXAD4SzAAAARItUJECLdCQcMcnrM0Q7fCQofiJIi5Qk" - . "cAEAAESJyAMEikiLlCRgAQAA9gQCAXUGQYPqAXiZSIPBATlMJCB+dzlMJBiJTCQo" - . "fsNIi4QkaAEAAESJygMUiEiLhCRgAQAA9gQQAnWng+4BeaLpX@@@@w8fhAAAAAAA" - . "uwMAAADpRvH@@8YEBgLp8Pz@@0G6AwAAAOk+8f@@x0QkHAAAAADHRCQYAAAAAOm7" - . "9f@@g8cB6aD3@@+LdCQcQYPGAUiDvCSoAQAAAA+EHQQAAEljxouUJEgBAABIjQyF" - . "AAAAAIuEJEABAAAB+sHiEEQB6AnQSIuUJKgBAACJRAr8i5QkKAEAAIXSD4UeAwAA" - . "i0QkHCnwRDm0JLABAABIi3QkYIlEDvwPjhPz@@@ppf7@@0SLXCQo64aNBJCJRCQo" - . "i4QkrAAAAIXAD4XjAQAAi0QkIIXAD4Rg@@@@SIsEJIt0JBxFMcnHRCR4AAAAAESJ" - . "dCRwRIm8JIwAAABEiZwkkAAAAEiJRCRQSIuEJGgBAACLTCQoTIu8JDABAABMi1Qk" - . "UEyLhCRwAQAARItcJHhCAwyIQYE6@@@@AEeLBIiNUQKNQQFIY8lBD5fGSGPSSJhF" - . "D7b2QQ+2FBdBD7YEB4mUJLQAAACJhCS4AAAAweIQweAICdBBD7YUDwnQiZQkvAAA" - . "AImEJLAAAADrHg+v0g+vyY0UUg+vwI0Uio0EQjnDD4OvAAAASYPCCEU5ww+D4AAA" - . "AESLvCSgAAAAQYPDAkGLAkGLWgRFhf90Hk2FyYtUJDAPRJQksAAAAEUx9oXAQQ+U" - . "xolUJDCJ0InCD7bMD7bAweoQK4wkuAAAACuEJLwAAAAPttIrlCS0AAAAgfv@@@8A" - . "D4Z0@@@@QYnfQcHvEEUPtv8Pr9JFD6@@RDn6D4dz@@@@D7bXD6@JD6@SOdEPh2L@" - . "@@8PttMPr8APr9I50A+HUf@@@0WF9nQFg+4BeDtJg8EBSINEJFBYg0QkeBZEOUwk" - . "IA+Pkf7@@0SLdCRwRIu8JIwAAABEi5wkkAAAAOmu@f@@RYX2dcfrwESLdCRwRIu8" - . "JIwAAABEi5wkkAAAAOml@P@@i0QkIIt0JByFwA+Eff3@@0Ux0us5OYQkmAAAAHwY" - . "D6@JOYwknAAAAHwMD6@SOZQklAAAAH0Jg+4BD4hm@P@@SYPCAUQ5VCQgD44@@f@@" - . "SIuEJGgBAACLVCQoTIuMJDABAABCAxSQSIuEJHABAABCiwSQicGNQgKJTCQwwekQ" - . "SJgPtslBD7YEASnIjUoBSGPSD6@ASGPJRQ+2DAlIi0wkMA+2zUEpyUSJyUyLjCQw" - . "AQAAQQ+2FBFED7ZMJDBEKcqB+@@@@wAPh0r@@@8Pr8mNBEAPr9KNBIiNBFA5ww+C" - . "VP@@@+lY@@@@x0QkHAAAAADHRCQYAAAAAOlF9@@@RDm0JLABAABEifAPjhvx@@+J" - . "+CuEJMABAABFMdKDwAFBD0jCicGLhCTAAQAAjUQH@0E5w0EPTsOJxkSJ6CuEJLgB" - . "AACDwAFED0nQi4QkuAEAAEGNRAX@OcUPTsU5zolEJCAPjEH7@@9EieJJY8IPr9FI" - . "Y9JIAdBIA4QkYAEAAEmJwY1GAYlEJCiLRCQgRCnQSI1wAUQ7VCQgfxNKjRQOTInI" - . "gCADSIPAAUg50HX0g8EBTANMJFg7TCQoddjp6Pr@@4uMJCgBAACFyQ+FQf@@@+nU" - . "+v@@kJCQkJCQkJCQkJCQkA==" - MyFunc:=this.MCode(StrReplace((A_PtrSize=8?x64:x32),"@","/")) - } - text:=j[1], w:=j[2], h:=j[3] - , err1:=this.Floor(j[4] ? j[5] : ini.err1) - , err0:=this.Floor(j[4] ? j[6] : ini.err0) - , mode:=j[7], color:=j[8], n:=j[9] - ok:=(!ini.bits.Scan0 || mode<1 || mode>5) ? 0 - : DllCall(MyFunc.Ptr, "int",mode, "uint",color, "uint",n, "int",dir - , "Ptr",ini.bits.Scan0, "int",ini.bits.Stride - , "int",sx, "int",sy, "int",sw, "int",sh - , "Ptr",ini.ss, "Ptr",ini.s1, "Ptr",ini.s0 - , "Ptr",text, "int",w, "int",h - , "int",Floor(Abs(err1)*1024), "int",Floor(Abs(err0)*1024) - , "int",(err1<0||err0<0), "Ptr",ini.allpos, "int",ini.allpos_max - , "int",Floor(w*ini.zoomW), "int",Floor(h*ini.zoomH)) - return ok -} - -code() -{ -return " + code() { + return " ( //***** C source code of machine code ***** @@ -850,2685 +805,2402 @@ int __attribute__((__stdcall__)) PicFind( } )" -} - -PicInfo(text) -{ - if !InStr(text, "$") - return - static info:=Map(), bmp:=[] - key:=(r:=StrLen(v:=Trim(text,"|")))<10000 ? v - : DllCall("ntdll\RtlComputeCrc32", "uint",0 - , "Ptr",StrPtr(v), "uint",r*2, "uint") - if info.Has(key) - return info[key] - comment:="", seterr:=err1:=err0:=0 - ; You Can Add Comment Text within The <> - if RegExMatch(v, "<([^>\n]*)>", &r) - v:=StrReplace(v,r[0]), comment:=Trim(r[1]) - ; You can Add two fault-tolerant in the [], separated by commas - if RegExMatch(v, "\[([^\]\n]*)]", &r) - { - v:=StrReplace(v,r[0]), r:=StrSplit(r[1] ",", ",") - , seterr:=1, err1:=r[1], err0:=r[2] - } - color:=SubStr(v,1,InStr(v,"$")-1), v:=Trim(SubStr(v,InStr(v,"$")+1)) - mode:=InStr(color,"##") ? 5 : InStr(color,"#") ? 4 - : InStr(color,"**") ? 3 : InStr(color,"*") ? 2 : 1 - color:=RegExReplace(StrReplace(color,"@","-"), "[*#\s]") - (mode=1 || mode=5) && color:=StrReplace(color,"0x") - if (mode=5) - { - if !(v~="^[\s\-\w.]+/[\s\-\w.]+/[\s\-\w./,]+$") ; - { - if !(hBM:=LoadPicture(v)) - { - MsgBox "Can't Load Picture ! " v, "Tip", 4096 - return - } - this.GetBitmapWH(hBM, &w, &h) - if (w<1 || h<1) - return - hBM2:=this.CreateDIBSection(w, h, 32, &Scan0) - this.CopyHBM(hBM2, 0, 0, hBM, 0, 0, w, h) - DllCall("DeleteObject", "Ptr",hBM) - if (!Scan0) - return - arr:=StrSplit(color "/", "/"), arr.Pop(), n:=arr.Length - bmp.Push(buf:=Buffer(w*h*4 + n*2*4)), v:=buf.Ptr, p:=v+w*h*4-4 - DllCall("RtlMoveMemory", "Ptr",v, "Ptr",Scan0, "Ptr",w*h*4) - DllCall("DeleteObject", "Ptr",hBM2), color:=Trim(arr[1],"-") - For k1,v1 in arr - c:=StrSplit(Trim(v1,"-") "-" color, "-") - , x:=this.Floor(c[2]), x:=(x<=0||x>1?0:Floor(9*255*255*(1-x)*(1-x))) - , NumPut("uint", this.ToRGB(c[1]), p+=4) - , NumPut("uint", (InStr(c[2],".")?x:this.Floor("0x" c[2])|0x1000000), p+=4) - color:=2 } - else ; or or - { - color:=Trim(StrSplit(color "/", "/")[1], "-") - arr:=StrSplit(Trim(RegExReplace(v, "i)\s|0x"), ","), ",") - if !(n:=arr.Length) - return - bmp.Push(buf:=Buffer(n*22*4)), v:=buf.Ptr - shape:=(n>1 && StrLen(StrSplit(arr[1] "//","/")[3])=1 ? 1:0) - For k1,v1 in arr - { - r:=StrSplit(v1 "/","/"), x:=this.Floor(r[1]), y:=this.Floor(r[2]) - , (A_Index=1) ? (x1:=x2:=x, y1:=y2:=y) - : (x1:=Min(x1,x), x2:=Max(x2,x), y1:=Min(y1,y), y2:=Max(y2,y)) - } - For k1,v1 in arr - { - r:=StrSplit(v1 "/","/"), x:=this.Floor(r[1])-x1, y:=this.Floor(r[2])-y1 - , NumPut("uint", y<<16|x, p:=v+(A_Index-1)*22*4) - , NumPut("uint", n1:=Min(Max(r.Length-3,0),(shape?1:10)), p+=4) - Loop n1 - c:=StrSplit(Trim(v1:=r[2+A_Index],"-") "-" color, "-") - , x:=this.Floor(c[2]), x:=(x<=0||x>1?0:Floor(9*255*255*(1-x)*(1-x))) - , NumPut("uint", this.ToRGB(c[1])&0xFFFFFF|(!shape&&InStr(v1,"-")=1?0x1000000:0), p+=4) - , NumPut("uint", (InStr(c[2],".")?x:this.Floor("0x" c[2])|0x1000000), p+=4) - } - color:=shape, w:=x2-x1+1, h:=y2-y1+1 + PicInfo(text) { + if !InStr(text, "$") + return + static info := Map(), bmp := [] + key := (r := StrLen(v := Trim(text, "|"))) < 10000 ? v + : DllCall("ntdll\RtlComputeCrc32", "uint", 0 + , "Ptr", StrPtr(v), "uint", r * 2, "uint") + if info.Has(key) + return info[key] + comment := "", seterr := err1 := err0 := 0 + ; You Can Add Comment Text within The <> + if RegExMatch(v, "<([^>\n]*)>", &r) + v := StrReplace(v, r[0]), comment := Trim(r[1]) + ; You can Add two fault-tolerant in the [], separated by commas + if RegExMatch(v, "\[([^\]\n]*)]", &r) { + v := StrReplace(v, r[0]), r := StrSplit(r[1] ",", ",") + , seterr := 1, err1 := r[1], err0 := r[2] + } + color := SubStr(v, 1, InStr(v, "$") - 1), v := Trim(SubStr(v, InStr(v, "$") + 1)) + mode := InStr(color, "##") ? 5 : InStr(color, "#") ? 4 + : InStr(color, "**") ? 3 : InStr(color, "*") ? 2 : 1 + color := RegExReplace(StrReplace(color, "@", "-"), "[*#\s]") + (mode = 1 || mode = 5) && color := StrReplace(color, "0x") + if (mode = 5) { + if !(v ~= "^[\s\-\w.]+/[\s\-\w.]+/[\s\-\w./,]+$") ; + { + if !(hBM := LoadPicture(v)) { + MsgBox "Can't Load Picture ! " v, "Tip", 4096 + return + } + this.GetBitmapWH(hBM, &w, &h) + if (w < 1 || h < 1) + return + hBM2 := this.CreateDIBSection(w, h, 32, &Scan0) + this.CopyHBM(hBM2, 0, 0, hBM, 0, 0, w, h) + DllCall("DeleteObject", "Ptr", hBM) + if (!Scan0) + return + arr := StrSplit(color "/", "/"), arr.Pop(), n := arr.Length + bmp.Push(buf := Buffer(w * h * 4 + n * 2 * 4)), v := buf.Ptr, p := v + w * h * 4 - 4 + DllCall("RtlMoveMemory", "Ptr", v, "Ptr", Scan0, "Ptr", w * h * 4) + DllCall("DeleteObject", "Ptr", hBM2), color := Trim(arr[1], "-") + for k1, v1 in arr + c := StrSplit(Trim(v1, "-") "-" color, "-") + , x := this.Floor(c[2]), x := (x <= 0 || x > 1 ? 0 : Floor(9 * 255 * 255 * (1 - x) * (1 - x))) + , NumPut("uint", this.ToRGB(c[1]), p += 4) + , NumPut("uint", (InStr(c[2], ".") ? x : this.Floor("0x" c[2]) | 0x1000000), p += 4) + color := 2 + } + else ; or or + { + color := Trim(StrSplit(color "/", "/")[1], "-") + arr := StrSplit(Trim(RegExReplace(v, "i)\s|0x"), ","), ",") + if !(n := arr.Length) + return + bmp.Push(buf := Buffer(n * 22 * 4)), v := buf.Ptr + shape := (n > 1 && StrLen(StrSplit(arr[1] "//", "/")[3]) = 1 ? 1 : 0) + for k1, v1 in arr { + r := StrSplit(v1 "/", "/"), x := this.Floor(r[1]), y := this.Floor(r[2]) + , (A_Index = 1) ? (x1 := x2 := x, y1 := y2 := y) + : (x1 := Min(x1, x), x2 := Max(x2, x), y1 := Min(y1, y), y2 := Max(y2, y)) + } + for k1, v1 in arr { + r := StrSplit(v1 "/", "/"), x := this.Floor(r[1]) - x1, y := this.Floor(r[2]) - y1 + , NumPut("uint", y << 16 | x, p := v + (A_Index - 1) * 22 * 4) + , NumPut("uint", n1 := Min(Max(r.Length - 3, 0), (shape ? 1 : 10)), p += 4) + loop n1 + c := StrSplit(Trim(v1 := r[2 + A_Index], "-") "-" color, "-") + , x := this.Floor(c[2]), x := (x <= 0 || x > 1 ? 0 : Floor(9 * 255 * 255 * (1 - x) * (1 - x))) + , NumPut("uint", this.ToRGB(c[1]) & 0xFFFFFF | (!shape && InStr(v1, "-") = 1 ? 0x1000000 : 0), p += 4) + , NumPut("uint", (InStr(c[2], ".") ? x : this.Floor("0x" c[2]) | 0x1000000), p += 4) + } + color := shape, w := x2 - x1 + 1, h := y2 - y1 + 1 + } + } + else { + r := StrSplit(v ".", "."), w := this.Floor(r[1]) + , v := this.base64tobit(r[2]), h := StrLen(v) // w + if (w < 1 || h < 1 || StrLen(v) != w * h) + return + arr := StrSplit(color "/", "/"), arr.Pop(), n := arr.Length + , bmp.Push(buf := Buffer(StrPut(v, "CP0") + n * 2 * 4)) + , StrPut(v, buf.Ptr, "CP0"), v := buf.Ptr, p := v + w * h - 4 + , color := this.Floor(color) + if (mode = 1) { + for k1, v1 in arr + c := StrSplit(Trim(v1, "-") "-", "-") + , x := this.Floor(c[2]), x := (x <= 0 || x > 1 ? 0 : Floor(9 * 255 * 255 * (1 - x) * (1 - x))) + , NumPut("uint", this.ToRGB(c[1]), p += 4) + , NumPut("uint", (InStr(c[2], ".") ? x : this.Floor("0x" c[2]) | 0x1000000), p += 4) + } + else if (mode = 4) { + r := StrSplit(Trim(arr[1], "-") "-", "-") + , n := this.Floor(r[2]), n := (n <= 0 || n > 1 ? 0 : Floor(9 * 255 * 255 * (1 - n) * (1 - n))) + , c := this.Floor(r[1]), color := (c < 1 || c > w * h ? 0 : ((c - 1) // w) << 16 | Mod(c - 1, w)) + } + } + return info[key] := [v, w, h, seterr, err1, err0, mode, color, n, comment] } - } - else - { - r:=StrSplit(v ".", "."), w:=this.Floor(r[1]) - , v:=this.base64tobit(r[2]), h:=StrLen(v)//w - if (w<1 || h<1 || StrLen(v)!=w*h) - return - arr:=StrSplit(color "/", "/"), arr.Pop(), n:=arr.Length - , bmp.Push(buf:=Buffer(StrPut(v, "CP0") + n*2*4)) - , StrPut(v, buf.Ptr, "CP0"), v:=buf.Ptr, p:=v+w*h-4 - , color:=this.Floor(color) - if (mode=1) + ToRGB(color) ; color can use: RRGGBB, Red, Yellow, Black, White { - For k1,v1 in arr - c:=StrSplit(Trim(v1,"-") "-", "-") - , x:=this.Floor(c[2]), x:=(x<=0||x>1?0:Floor(9*255*255*(1-x)*(1-x))) - , NumPut("uint", this.ToRGB(c[1]), p+=4) - , NumPut("uint", (InStr(c[2],".")?x:this.Floor("0x" c[2])|0x1000000), p+=4) + static tab := "" + if (!tab) + tab := Map(), tab.CaseSense := "Off" + , tab.Set("Black", "000000", "White", "FFFFFF" + , "Red", "FF0000", "Green", "008000", "Blue", "0000FF" + , "Yellow", "FFFF00", "Silver", "C0C0C0", "Gray", "808080" + , "Teal", "008080", "Navy", "000080", "Aqua", "00FFFF" + , "Olive", "808000", "Lime", "00FF00", "Fuchsia", "FF00FF" + , "Purple", "800080", "Maroon", "800000") + return this.Floor("0x" (tab.Has(color) ? tab[color] : color)) } - else if (mode=4) - { - r:=StrSplit(Trim(arr[1],"-") "-", "-") - , n:=this.Floor(r[2]), n:=(n<=0||n>1?0:Floor(9*255*255*(1-n)*(1-n))) - , c:=this.Floor(r[1]), color:=(c<1||c>w*h?0:((c-1)//w)<<16|Mod(c-1,w)) - } - } - return info[key]:=[v, w, h, seterr, err1, err0, mode, color, n, comment] -} - -ToRGB(color) ; color can use: RRGGBB, Red, Yellow, Black, White -{ - static tab:="" - if (!tab) - tab:=Map(), tab.CaseSense:="Off" - , tab.Set("Black", "000000", "White", "FFFFFF" - , "Red", "FF0000", "Green", "008000", "Blue", "0000FF" - , "Yellow", "FFFF00", "Silver", "C0C0C0", "Gray", "808080" - , "Teal", "008080", "Navy", "000080", "Aqua", "00FFFF" - , "Olive", "808000", "Lime", "00FF00", "Fuchsia", "FF00FF" - , "Purple", "800080", "Maroon", "800000") - return this.Floor("0x" (tab.Has(color)?tab[color]:color)) -} - -GetBitsFromScreen(&x:=0, &y:=0, &w:=0, &h:=0 - , ScreenShot:=1, &zx:=0, &zy:=0, &zw:=0, &zh:=0) -{ - static CAPTUREBLT:="" - if (CAPTUREBLT="") ; thanks Descolada - { - DllCall("Dwmapi\DwmIsCompositionEnabled", "Int*", &i:=0) - CAPTUREBLT:=i ? 0 : 0x40000000 - } - if InStr(A_OSVersion, ".") ; thanks QQ:349029755 - Try DllCall("SetThreadDpiAwarenessContext", "Ptr",-3, "Ptr") - (!IsObject(this.bits) && this.bits:={Scan0:0, hBM:0, oldzw:0, oldzh:0}) - , bits:=this.bits - if (!ScreenShot && bits.Scan0) - { - zx:=bits.zx, zy:=bits.zy, zw:=bits.zw, zh:=bits.zh - , w:=Min(x+w,zx+zw), x:=Max(x,zx), w-=x - , h:=Min(y+h,zy+zh), y:=Max(y,zy), h-=y - return bits - } - cri:=A_IsCritical - Critical - bits.BindWindow:=id:=this.BindWindow(0,0,1) - if (id) - { - Try - WinGetPos &zx, &zy, &zw, &zh, id - Catch - id:=0 - } - if (!id) - { - zx:=SysGet(76) - , zy:=SysGet(77) - , zw:=SysGet(78) - , zh:=SysGet(79) - } - this.UpdateBits(bits, zx, zy, zw, zh) - , w:=Min(x+w,zx+zw), x:=Max(x,zx), w-=x - , h:=Min(y+h,zy+zh), y:=Max(y,zy), h-=y - if (!ScreenShot || w<1 || h<1 || !bits.hBM) - { - Critical cri - return bits - } - if IsSet(GetBitsFromScreen2) && (GetBitsFromScreen2 is Func) - && GetBitsFromScreen2(bits, x-zx, y-zy, w, h) - { - ; Get the bind window use bits.BindWindow - ; Each small range of data obtained from DXGI must be - ; copied to the screenshot cache using FindText().CopyBits() - zx:=bits.zx, zy:=bits.zy, zw:=bits.zw, zh:=bits.zh - Critical cri - return bits - } - mDC:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr") - oBM:=DllCall("SelectObject", "Ptr",mDC, "Ptr",bits.hBM, "Ptr") - if (id) - { - if (mode:=this.BindWindow(0,0,0,1))<2 - { - hDC:=DllCall("GetDCEx", "Ptr",id, "Ptr",0, "int",3, "Ptr") - DllCall("BitBlt","Ptr",mDC,"int",x-zx,"int",y-zy,"int",w,"int",h - , "Ptr",hDC, "int",x-zx, "int",y-zy, "uint",0xCC0020|CAPTUREBLT) - DllCall("ReleaseDC", "Ptr",id, "Ptr",hDC) - } - else - { - hBM2:=this.CreateDIBSection(zw, zh) - mDC2:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr") - oBM2:=DllCall("SelectObject", "Ptr",mDC2, "Ptr",hBM2, "Ptr") - DllCall("UpdateWindow", "Ptr",id) - ; RDW_INVALIDATE=0x1|RDW_ERASE=0x4|RDW_ALLCHILDREN=0x80|RDW_FRAME=0x400 - ; DllCall("RedrawWindow", "Ptr",id, "Ptr",0, "Ptr",0, "uint", 0x485) - DllCall("PrintWindow", "Ptr",id, "Ptr",mDC2, "uint",(mode>3)*3) - DllCall("BitBlt","Ptr",mDC,"int",x-zx,"int",y-zy,"int",w,"int",h - , "Ptr",mDC2, "int",x-zx, "int",y-zy, "uint",0xCC0020) - DllCall("SelectObject", "Ptr",mDC2, "Ptr",oBM2) - DllCall("DeleteDC", "Ptr",mDC2) - DllCall("DeleteObject", "Ptr",hBM2) - } - } - else - { - hDC:=DllCall("GetWindowDC","Ptr",id:=DllCall("GetDesktopWindow","Ptr"),"Ptr") - DllCall("BitBlt","Ptr",mDC,"int",x-zx,"int",y-zy,"int",w,"int",h - , "Ptr",hDC, "int",x, "int",y, "uint",0xCC0020|CAPTUREBLT) - DllCall("ReleaseDC", "Ptr",id, "Ptr",hDC) - } - if this.CaptureCursor(0,0,0,0,0,1) - this.CaptureCursor(mDC, zx, zy, zw, zh) - DllCall("SelectObject", "Ptr",mDC, "Ptr",oBM) - DllCall("DeleteDC", "Ptr",mDC) - Critical cri - return bits -} - -UpdateBits(bits, zx, zy, zw, zh) -{ - if (zw>bits.oldzw || zh>bits.oldzh || !bits.hBM) - { - Try DllCall("DeleteObject", "Ptr",bits.hBM) - bits.hBM:=this.CreateDIBSection(zw, zh, bpp:=32, &ppvBits) - , bits.Scan0:=(!bits.hBM ? 0:ppvBits) - , bits.Stride:=((zw*bpp+31)//32)*4 - , bits.oldzw:=zw, bits.oldzh:=zh - } - bits.zx:=zx, bits.zy:=zy, bits.zw:=zw, bits.zh:=zh -} - -CreateDIBSection(w, h, bpp:=32, &ppvBits:=0) -{ - NumPut("int",40, "int",w, "int",-h, "short",1, "short",bpp, bi:=Buffer(40,0)) - return DllCall("CreateDIBSection", "Ptr",0, "Ptr",bi - , "int",0, "Ptr*",&ppvBits:=0, "Ptr",0, "int",0, "Ptr") -} - -GetBitmapWH(hBM, &w, &h) -{ - bm:=Buffer(size:=(A_PtrSize=8 ? 32:24), 0) - , DllCall("GetObject", "Ptr",hBM, "int",size, "Ptr",bm) - , w:=NumGet(bm,4,"int"), h:=Abs(NumGet(bm,8,"int")) -} - -CopyHBM(hBM1, x1, y1, hBM2, x2, y2, w, h, Clear:=0) -{ - if (w<1 || h<1 || !hBM1 || !hBM2) - return - mDC1:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr") - oBM1:=DllCall("SelectObject", "Ptr",mDC1, "Ptr",hBM1, "Ptr") - mDC2:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr") - oBM2:=DllCall("SelectObject", "Ptr",mDC2, "Ptr",hBM2, "Ptr") - DllCall("BitBlt", "Ptr",mDC1, "int",x1, "int",y1, "int",w, "int",h - , "Ptr",mDC2, "int",x2, "int",y2, "uint",0xCC0020) - if (Clear) - DllCall("BitBlt", "Ptr",mDC1, "int",x1, "int",y1, "int",w, "int",h - , "Ptr",mDC1, "int",x1, "int",y1, "uint",MERGECOPY:=0xC000CA) - DllCall("SelectObject", "Ptr",mDC1, "Ptr",oBM1) - DllCall("DeleteDC", "Ptr",mDC1) - DllCall("SelectObject", "Ptr",mDC2, "Ptr",oBM2) - DllCall("DeleteDC", "Ptr",mDC2) -} - -CopyBits(Scan01,Stride1,x1,y1,Scan02,Stride2,x2,y2,w,h,Reverse:=0) -{ - if (w<1 || h<1 || !Scan01 || !Scan02) - return - static init:=0, MFCopyImage - if (!init && init:=1) - { - MFCopyImage:=DllCall("GetProcAddress", "Ptr" - , DllCall("LoadLibrary", "Str","Mfplat.dll", "Ptr") - , "AStr","MFCopyImage", "Ptr") - } - if (MFCopyImage && !Reverse) ; thanks QQ:121507989 - { - return DllCall(MFCopyImage - , "Ptr",Scan01+y1*Stride1+x1*4, "int",Stride1 - , "Ptr",Scan02+y2*Stride2+x2*4, "int",Stride2 - , "uint",w*4, "uint",h) - } - ListLines (lls:=A_ListLines)?0:0 - p1:=Scan01+(y1-1)*Stride1+x1*4 - , p2:=Scan02+(y2-1)*Stride2+x2*4, w*=4 - , (Reverse) && (p2+=(h+1)*Stride2, Stride2:=-Stride2) - Loop h - DllCall("RtlMoveMemory","Ptr",p1+=Stride1,"Ptr",p2+=Stride2,"Ptr",w) - ListLines lls -} - -DrawHBM(hBM, lines) -{ - mDC:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr") - oBM:=DllCall("SelectObject", "Ptr",mDC, "Ptr",hBM, "Ptr") - oldc:="", brush:=0, rect:=Buffer(16) - For k,v in lines ; [ [x, y, w, h, color] ] - if IsObject(v) - { - if (oldc!=v[5]) - { - oldc:=v[5], BGR:=(oldc&0xFF)<<16|oldc&0xFF00|(oldc>>16)&0xFF - DllCall("DeleteObject", "Ptr",brush) - brush:=DllCall("CreateSolidBrush", "uint",BGR, "Ptr") - } - DllCall("SetRect", "Ptr",rect, "int",v[1], "int",v[2] - , "int",v[1]+v[3], "int",v[2]+v[4]) - DllCall("FillRect", "Ptr",mDC, "Ptr",rect, "Ptr",brush) - } - DllCall("DeleteObject", "Ptr",brush) - DllCall("SelectObject", "Ptr",mDC, "Ptr",oBM) - DllCall("DeleteObject", "Ptr",mDC) -} - -; 绑定窗口从而可以后台查找这个窗口的图像 -; 相当于始终在前台。解绑窗口使用 FindText().BindWindow(0) - -BindWindow(bind_id:=0, bind_mode:=0, get_id:=0, get_mode:=0) -{ - (!IsObject(this.bind) && this.bind:={id:0, mode:0, oldStyle:0}) - , bind:=this.bind - if (get_id) - return bind.id - if (get_mode) - return bind.mode - if (bind_id) - { - bind.id:=bind_id:=this.Floor(bind_id) - , bind.mode:=bind_mode, bind.oldStyle:=0 - if (bind_mode & 1) - { - i:=WinGetExStyle(bind_id) - bind.oldStyle:=i - WinSetTransparent(255, bind_id) - Loop 30 - { - Sleep 100 - i:=WinGetTransparent(bind_id) - } - Until (i=255) - } - } - else - { - bind_id:=bind.id - if (bind.mode & 1) - WinSetExStyle(bind.oldStyle, bind_id) - bind.id:=0, bind.mode:=0, bind.oldStyle:=0 - } -} - -; 使用 FindText().CaptureCursor(1) 设置抓图时捕获鼠标 -; 使用 FindText().CaptureCursor(0) 取消抓图时捕获鼠标 - -CaptureCursor(hDC:=0, zx:=0, zy:=0, zw:=0, zh:=0, get_cursor:=0) -{ - if (get_cursor) - return this.Cursor - if (hDC=1 || hDC=0) && (zw=0) - { - this.Cursor:=hDC - return - } - mi:=Buffer(40, 0), NumPut("int", 16+A_PtrSize, mi) - DllCall("GetCursorInfo", "Ptr",mi) - bShow:=NumGet(mi, 4, "int") - hCursor:=NumGet(mi, 8, "Ptr") - x:=NumGet(mi, 8+A_PtrSize, "int") - y:=NumGet(mi, 12+A_PtrSize, "int") - if (!bShow) || (x=zx+zw || y>=zy+zh) - return - ni:=Buffer(40, 0) - DllCall("GetIconInfo", "Ptr",hCursor, "Ptr",ni) - xCenter:=NumGet(ni, 4, "int") - yCenter:=NumGet(ni, 8, "int") - hBMMask:=NumGet(ni, (A_PtrSize=8?16:12), "Ptr") - hBMColor:=NumGet(ni, (A_PtrSize=8?24:16), "Ptr") - DllCall("DrawIconEx", "Ptr",hDC - , "int",x-xCenter-zx, "int",y-yCenter-zy, "Ptr",hCursor - , "int",0, "int",0, "int",0, "int",0, "int",3) - DllCall("DeleteObject", "Ptr",hBMMask) - DllCall("DeleteObject", "Ptr",hBMColor) -} - -MCode(hex) -{ - flag:=((hex~="[^A-Fa-f\d\s]") ? 1:4), len:=0 - Loop 2 - if !DllCall("crypt32\CryptStringToBinary", "Str",hex, "uint",0, "uint",flag - , "Ptr",(A_Index=1?0:(p:=Buffer(len)).Ptr), "uint*",&len, "Ptr",0, "Ptr",0) - return - if DllCall("VirtualProtect", "Ptr",p.Ptr, "Ptr",len, "uint",0x40, "uint*",0) - return p -} - -bin2hex(addr, size, base64:=0) -{ - flag:=(base64 ? 1:4)|0x40000000, len:=0 - Loop 2 - DllCall("crypt32\CryptBinaryToString", "Ptr",addr, "uint",size, "uint",flag - , "Ptr",(A_Index=1?0:(p:=Buffer(len*2)).Ptr), "uint*",&len) - return RegExReplace(StrGet(p.Ptr, len), "\s+") -} - -base64tobit(s) -{ - ListLines (lls:=A_ListLines)?0:0 - Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - Loop Parse, Chars - if InStr(s, A_LoopField, 1) - s:=RegExReplace(s, "[" A_LoopField "]", ((i:=A_Index-1)>>5&1) - . (i>>4&1) . (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)) - s:=RegExReplace(RegExReplace(s,"[^01]+"),"10*$") - ListLines lls - return s -} - -bit2base64(s) -{ - ListLines (lls:=A_ListLines)?0:0 - s:=RegExReplace(s,"[^01]+") - s.=SubStr("100000",1,6-Mod(StrLen(s),6)) - s:=RegExReplace(s,".{6}","|$0") - Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - Loop Parse, Chars - s:=StrReplace(s, "|" . ((i:=A_Index-1)>>5&1) - . (i>>4&1) . (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1), A_LoopField) - ListLines lls - return s -} - -ASCII(s) -{ - if RegExMatch(s, "\$(\d+)\.([\w+/]+)", &r) - { - s:=RegExReplace(this.base64tobit(r[2]),".{" r[1] "}","$0`n") - s:=StrReplace(StrReplace(s,"0","_"),"1","0") - } - else s:="" - return s -} - -; 可以在脚本的开头用 FindText().PicLib(Text,1) 导入字库, -; 然后使用 FindText().PicLib("说明文字1|说明文字2|...") 获取字库中的数据 - -PicLib(comments, add_to_Lib:=0, index:=1) -{ - (!IsObject(this.Lib) && this.Lib:=Map()), Lib:=this.Lib - , (!Lib.Has(index) && Lib[index]:=Map()), Lib:=Lib[index] - if (add_to_Lib) - { - re:="<([^>\n]*)>[^$\n]+\$[^`"'\r\n]+" - Loop Parse, comments, "|" - if RegExMatch(A_LoopField, re, &r) - { - s1:=Trim(r[1]), s2:="" - Loop Parse, s1 - s2.=Format("_{:d}", Ord(A_LoopField)) - (s2!="") && Lib[s2]:=r[0] - } - } - else - { - Text:="" - Loop Parse, comments, "|" - { - s1:=Trim(A_LoopField), s2:="" - Loop Parse, s1 - s2.=Format("_{:d}", Ord(A_LoopField)) - (Lib.Has(s2)) && Text.="|" Lib[s2] - } - return Text - } -} - -; 分割字符串为单个文字并获取数据 - -PicN(Number, index:=1) -{ - return this.PicLib(RegExReplace(Number,".","|$0"), 0, index) -} - -; 使用 FindText().PicX(Text) 可以将文字分割成多个单字的组合,从而适应间隔变化 -; 但是不能用于“颜色位置二值化”模式, 因为位置是与整体图像相关的 - -PicX(Text) -{ - if !RegExMatch(Text, "(<[^$\n]+)\$(\d+)\.([\w+/]+)", &r) - return Text - v:=this.base64tobit(r[3]), Text:="" - c:=StrLen(StrReplace(v,"0"))<=StrLen(v)//2 ? "1":"0" - txt:=RegExReplace(v,".{" r[2] "}","$0`n") - While InStr(txt,c) - { - While !(txt~="m`n)^" c) - txt:=RegExReplace(txt,"m`n)^.") - i:=0 - While (txt~="m`n)^.{" i "}" c) - i:=Format("{:d}",i+1) - v:=RegExReplace(txt,"m`n)^(.{" i "}).*","$1") - txt:=RegExReplace(txt,"m`n)^.{" i "}") - if (v!="") - Text.="|" r[1] "$" i "." this.bit2base64(v) - } - return Text -} - -; 截屏,作为后续操作要用的“上一次的截屏” - -ScreenShot(x1:=0, y1:=0, x2:=0, y2:=0) -{ - this.FindText(,, x1, y1, x2, y2) -} - -; 从“上一次的截屏”中快速获取指定坐标的RGB颜色 -; 如果坐标超出了屏幕范围,将返回白色 - -GetColor(x, y, fmt:=1) -{ - bits:=this.GetBitsFromScreen(,,,,0,&zx,&zy,&zw,&zh), x-=zx, y-=zy - , c:=(x>=0 && x=0 && y=0 && x=0 && ymax_X ? x : max_X) - While (min_X!="" && min_X<=max_X) - { - LeftX:="" - For k,v in ok - { - x:=v.1, y:=v.2 - if (xoffsetY) - Continue - ; Get the leftmost X coordinates - if (LeftX="" || xdx ? "*":"") . LeftOCR - ; Update for next search - min_X:=LeftX+LeftW-(overlapW>LeftW//2 ? LeftW//2:overlapW) - , dx:=LeftX+LeftW+offsetX, ocr_Y:=LeftY - , (LeftYmax_Y && max_Y:=LeftY+LeftH) - } - (ocr_X="") && ocr_X:=min_Y:=min_X:=max_Y:=0 - return {text:ocr_Text, x:ocr_X, y:min_Y, w:min_X-ocr_X, h:max_Y-min_Y} -} - -; 按照从左到右、从上到下的顺序排序FindText()的结果 -; 忽略轻微的Y坐标差距,返回排序后的数组对象 - -Sort(ok, dy:=10) -{ - if !IsObject(ok) - return ok - s:="", n:=150000, ypos:=[] - For k,v in ok - { - x:=v.x, y:=v.y, add:=1 - For k1,v1 in ypos - if Abs(y-v1)<=dy - { - y:=v1, add:=0 - Break - } - if (add) - ypos.Push(y) - s.=(y*n+x) "." k "|" - } - s:=Trim(s,"|") - s:=Sort(s, "N D|") - ok2:=[] - For k,v in StrSplit(s,"|") - ok2.Push(ok[SubStr(v,InStr(v,".")+1)]) - return ok2 -} - -; 以指定点为中心,按从近到远排序FindText()的结果,返回排序后的数组 - -Sort2(ok, px, py) -{ - if !IsObject(ok) - return ok - s:="" - For k,v in ok - s.=((v.x-px)**2+(v.y-py)**2) "." k "|" - s:=Trim(s,"|") - s:=Sort(s, "N D|") - ok2:=[] - For k,v in StrSplit(s,"|") - ok2.Push(ok[SubStr(v,InStr(v,".")+1)]) - return ok2 -} - -; 按指定的查找方向,排序FindText()的结果,返回排序后的数组 - -Sort3(ok, dir:=1) -{ - if !IsObject(ok) - return ok - s:="", n:=150000 - For k,v in ok - x:=v.1, y:=v.2 - , s.=(dir=1 ? y*n+x - : dir=2 ? y*n-x - : dir=3 ? -y*n+x - : dir=4 ? -y*n-x - : dir=5 ? x*n+y - : dir=6 ? x*n-y - : dir=7 ? -x*n+y - : dir=8 ? -x*n-y : y*n+x) "." k "|" - s:=Trim(s,"|") - s:=Sort(s, "N D|") - ok2:=[] - For k,v in StrSplit(s,"|") - ok2.Push(ok[SubStr(v,InStr(v,".")+1)]) - return ok2 -} - -; 提示某个坐标的位置,或远程控制中当前鼠标的位置 - -MouseTip(x:="", y:="", w:=10, h:=10, d:=3) -{ - if (x="") - { - pt:=Buffer(16,0), DllCall("GetCursorPos", "Ptr",pt) - x:=NumGet(pt,0,"uint"), y:=NumGet(pt,4,"uint") - } - Loop 4 - { - this.RangeTip(x-w, y-h, 2*w+1, 2*h+1, (A_Index & 1 ? "Red":"Blue"), d) - Sleep 500 - } - this.RangeTip() -} - -; 显示范围的边框,类似于 ToolTip - -RangeTip(x:="", y:="", w:="", h:="", color:="Red", d:=3, num:=1) -{ - ListLines (lls:=A_ListLines)?0:0 - static tab:=Map() - (!tab.Has(num) && tab[num]:=[0,0,0,0]), Range:=tab[num] - if (x="") - { - if (Range[1]) - Loop 4 - Range[A_Index].Destroy(), Range[A_Index]:="" - ListLines lls - return - } - if !(Range[1]) - { - Loop 4 - Range[A_Index]:=Gui("+AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x08000000") - } - x:=this.Floor(x), y:=this.Floor(y), w:=this.Floor(w), h:=this.Floor(h), d:=this.Floor(d) - Loop 4 - { - i:=A_Index - , x1:=(i=2 ? x+w : x-d) - , y1:=(i=3 ? y+h : y-d) - , w1:=(i=1 || i=3 ? w+2*d : d) - , h1:=(i=2 || i=4 ? h+2*d : d) - Range[i].BackColor:=color - Range[i].Show("NA x" x1 " y" y1 " w" w1 " h" h1) - } - ListLines lls -} - -State(key) -{ - return GetKeyState(key,"P") || GetKeyState(key) -} - -; 用鼠标左右键选取屏幕范围 - -GetRange(ww:=25, hh:=8, key:="RButton") -{ - static KeyOff:="", hk - if (!KeyOff) - KeyOff:=this.GetRange.Bind(this, "Off") - if (ww=="Off") - return hk:=Trim(A_ThisHotkey, "*") - ;--------------------- - GetRange_HotkeyIf:=_Gui:=Gui() - _Gui.Opt("-Caption +ToolWindow +E0x80000") - _Gui.Title:="GetRange_HotkeyIf" - _Gui.Show("NA x0 y0 w0 h0") - ;--------------------- - if GetKeyState("Ctrl") - Send "{Ctrl Up}" - HotIfWinExist "GetRange_HotkeyIf" - keys:=key "|Up|Down|Left|Right" - For k,v in StrSplit(keys, "|") - { - if GetKeyState(v) - Send "{" v " Up}" - Try Hotkey "*" v, KeyOff, "On" - } - HotIfWinExist - ;--------------------- - Critical (cri:=A_IsCritical)?"Off":"Off" - CoordMode "Mouse" - tip:=this.Lang("s5") - hk:="", oldx:=oldy:="", keydown:=0 - Loop - { - Sleep 50 - MouseGetPos &x2, &y2 - if (hk=key) || this.State(key) || this.State("Ctrl") - { - keydown++ - if (keydown=1) - MouseGetPos &x1, &y1, &Bind_ID - timeout:=A_TickCount+3000 - While (A_TickCount=2) - Break - } - else if (hk="Up") || this.State("Up") - (hh>1 && hh--), hk:="" - else if (hk="Down") || this.State("Down") - hh++, hk:="" - else if (hk="Left") || this.State("Left") - (ww>1 && ww--), hk:="" - else if (hk="Right") || this.State("Right") - ww++, hk:="" - x:=(keydown?x1:x2), y:=(keydown?y1:y2) - this.RangeTip(x-ww, y-hh, 2*ww+1, 2*hh+1, (A_MSec<500?"Red":"Blue")) - if (oldx=x2 && oldy=y2) - Continue - oldx:=x2, oldy:=y2 - ToolTip "x: " x " y: " y "`n" tip - } - ToolTip - this.RangeTip() - HotIfWinExist "GetRange_HotkeyIf" - For k,v in StrSplit(keys, "|") - Try Hotkey "*" v, KeyOff, "Off" - HotIfWinExist - GetRange_HotkeyIf.Destroy() - Critical cri - return [x-ww, y-hh, x+ww, y+hh, Bind_ID] -} - -GetRange2(key:="LButton") -{ - FindText_GetRange:=_Gui:=Gui() - _Gui.Opt("+LastFound +AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x08000000") - _Gui.BackColor:="White" - WinSetTransparent(10) - this.GetBitsFromScreen(,,,,0,&x,&y,&w,&h) - _Gui.Title:="FindText_GetRange" - _Gui.Show("NA x" x " y" y " w" w " h" h) - CoordMode "Mouse" - tip:=this.Lang("s7"), oldx:=oldy:="" - Loop - { - Sleep 50 - MouseGetPos &x1, &y1 - if (oldx=x1 && oldy=y1) - Continue - oldx:=x1, oldy:=y1 - ToolTip "x: " x1 " y: " y1 " w: 0 h: 0`n" tip - } - Until this.State(key) || this.State("Ctrl") - Loop - { - Sleep 50 - MouseGetPos &x2, &y2 - x:=Min(x1,x2), y:=Min(y1,y2), w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1 - this.RangeTip(x, y, w, h, (A_MSec<500 ? "Red":"Blue")) - if (oldx=x2 && oldy=y2) - Continue - oldx:=x2, oldy:=y2 - ToolTip "x: " x " y: " y " w: " w " h: " h "`n" tip - } - Until !(this.State(key) || this.State("Ctrl")) - ToolTip - this.RangeTip() - FindText_GetRange.Destroy() - A_Clipboard:=x "," y "," (x+w-1) "," (y+h-1) - return [x, y, x+w-1, y+h-1] -} - -BitmapFromScreen(&x:=0, &y:=0, &w:=0, &h:=0 - , ScreenShot:=1, &zx:=0, &zy:=0, &zw:=0, &zh:=0) -{ - bits:=this.GetBitsFromScreen(&x,&y,&w,&h,ScreenShot,&zx,&zy,&zw,&zh) - if (w<1 || h<1 || !bits.hBM) - return - hBM:=this.CreateDIBSection(w, h) - this.CopyHBM(hBM, 0, 0, bits.hBM, x-zx, y-zy, w, h, 1) - return hBM -} - -; 快速保存截图为BMP文件,可用于调试 -; 如果 file=0 或 "" ,会保存到剪贴板 - -SavePic(file:=0, x1:=0, y1:=0, x2:=0, y2:=0, ScreenShot:=1) -{ - x1:=this.Floor(x1), y1:=this.Floor(y1), x2:=this.Floor(x2), y2:=this.Floor(y2) - if (x1=0 && y1=0 && x2=0 && y2=0) - n:=150000, x:=y:=-n, w:=h:=2*n - else - x:=Min(x1,x2), y:=Min(y1,y2), w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1 - hBM:=this.BitmapFromScreen(&x, &y, &w, &h, ScreenShot) - this.SaveBitmapToFile(file, hBM) - DllCall("DeleteObject", "Ptr",hBM) -} - -; 保存图像到文件,如果 file=0 或者 "",保存到剪贴板 -; 参数可以是位图句柄或者文件路径,例如: "c:\a.bmp" - -SaveBitmapToFile(file, hBM_or_file, x:=0, y:=0, w:=0, h:=0) -{ - if IsNumber(hBM_or_file) - hBM_or_file:="HBITMAP:*" hBM_or_file - if !hBM:=DllCall("CopyImage", "Ptr",LoadPicture(hBM_or_file) - , "int",0, "int",0, "int",0, "uint",0x2008) - return - if (file) || (w!=0 && h!=0) - { - (w=0 || h=0) && this.GetBitmapWH(hBM, &w, &h) - hBM2:=this.CreateDIBSection(w, -h, bpp:=(file ? 24 : 32)) - this.CopyHBM(hBM2, 0, 0, hBM, x, y, w, h) - DllCall("DeleteObject", "Ptr",hBM), hBM:=hBM2 - } - dib:=Buffer(dib_size:=(A_PtrSize=8 ? 104:84), 0) - , DllCall("GetObject", "Ptr",hBM, "int",dib_size, "Ptr",dib) - , pbi:=dib.Ptr+(bitmap_size:=A_PtrSize=8 ? 32:24) - , size:=NumGet(pbi+20, "uint"), pBits:=NumGet(pbi-A_PtrSize, "Ptr") - if (!file) - { - hdib:=DllCall("GlobalAlloc", "uint",2, "Ptr",40+size, "Ptr") - pdib:=DllCall("GlobalLock", "Ptr",hdib, "Ptr") - DllCall("RtlMoveMemory", "Ptr",pdib, "Ptr",pbi, "Ptr",40) - DllCall("RtlMoveMemory", "Ptr",pdib+40, "Ptr",pBits, "Ptr",size) - DllCall("GlobalUnlock", "Ptr",hdib) - DllCall("OpenClipboard", "Ptr",0) - DllCall("EmptyClipboard") - DllCall("SetClipboardData", "uint",8, "Ptr",hdib) - DllCall("CloseClipboard") - } - else - { - if InStr(file,"\") && !FileExist(dir:=RegExReplace(file,"[^\\]*$")) - Try DirCreate(dir) - bf:=Buffer(14, 0), NumPut("short", 0x4D42, bf) - NumPut("uint", 54+size, bf, 2), NumPut("uint", 54, bf, 10) - f:=FileOpen(file, "w"), f.RawWrite(bf, 14) - , f.RawWrite(pbi+0, 40), f.RawWrite(pBits+0, size), f.Close() - } - DllCall("DeleteObject", "Ptr",hBM) -} - -; 显示保存的图像 - -ShowPic(file:="", show:=1, &x:="", &y:="", &w:="", &h:="") -{ - if (file="") - { - this.ShowScreenShot() - return - } - if !(hBM:=LoadPicture(file)) - return - this.GetBitmapWH(hBM, &w, &h) - bits:=this.GetBitsFromScreen(,,,,0,&x,&y,&zw,&zh) - this.UpdateBits(bits, x, y, Max(w,zw), Max(h,zh)) - this.CopyHBM(bits.hBM, 0, 0, hBM, 0, 0, w, h) - DllCall("DeleteObject", "Ptr",hBM) - if (show) - this.ShowScreenShot(x, y, x+w-1, y+h-1, 0) - return 1 -} - -; 显示内存中的屏幕截图用于调试 - -ShowScreenShot(x1:=0, y1:=0, x2:=0, y2:=0, ScreenShot:=1) -{ - static hPic, oldx, oldy, oldw, oldh, FindText_Screen:="" - x1:=this.Floor(x1), y1:=this.Floor(y1), x2:=this.Floor(x2), y2:=this.Floor(y2) - if (x1=0 && y1=0 && x2=0 && y2=0) - { - if (FindText_Screen) - FindText_Screen.Destroy(), FindText_Screen:="" - return - } - x:=Min(x1,x2), y:=Min(y1,y2), w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1 - if !hBM:=this.BitmapFromScreen(&x,&y,&w,&h,ScreenShot) - return - ;--------------- - if (!FindText_Screen) - { - FindText_Screen:=_Gui:=Gui() ; WS_EX_NOACTIVATE:=0x08000000 - _Gui.Opt("+AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x08000000") - _Gui.MarginX:=0, _Gui.MarginY:=0 - id:=_Gui.Add("Pic", "w" w " h" h), hPic:=id.Hwnd - _Gui.Title:="Show Pic" - _Gui.Show("NA x" x " y" y " w" w " h" h) - oldx:=x, oldy:=y, oldw:=w, oldh:=h - } - else if (oldx!=x || oldy!=y || oldw!=w || oldh!=h) - { - if (oldw!=w || oldh!=h) - FindText_Screen[hPic].Move(,, w, h) - FindText_Screen.Show("NA x" x " y" y " w" w " h" h) - oldx:=x, oldy:=y, oldw:=w, oldh:=h - } - this.BitmapToWindow(hPic, 0, 0, hBM, 0, 0, w, h) - DllCall("DeleteObject", "Ptr",hBM) -} - -BitmapToWindow(hwnd, x1, y1, hBM, x2, y2, w, h) -{ - mDC:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr") - oBM:=DllCall("SelectObject", "Ptr",mDC, "Ptr",hBM, "Ptr") - hDC:=DllCall("GetDC", "Ptr",hwnd, "Ptr") - DllCall("BitBlt", "Ptr",hDC, "int",x1, "int",y1, "int",w, "int",h - , "Ptr",mDC, "int",x2, "int",y2, "uint",0xCC0020) - DllCall("ReleaseDC", "Ptr",hwnd, "Ptr",hDC) - DllCall("SelectObject", "Ptr",mDC, "Ptr",oBM) - DllCall("DeleteDC", "Ptr",mDC) -} - -; 快速获取屏幕图像的搜索文本数据 - -GetTextFromScreen(x1:=0, y1:=0, x2:=0, y2:=0, Threshold:="" - , ScreenShot:=1, &rx:="", &ry:="", cut:=1) -{ - if (x1=0 && y1=0 && x2=0 && y2=0) - return this.Gui("CaptureS", ScreenShot) - x1:=this.Floor(x1), y1:=this.Floor(y1), x2:=this.Floor(x2), y2:=this.Floor(y2) - x:=Min(x1,x2), y:=Min(y1,y2), w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1 - bits:=this.GetBitsFromScreen(&x,&y,&w,&h,ScreenShot,&zx,&zy) - if (w<1 || h<1 || !bits.Scan0) - { - return - } - ListLines (lls:=A_ListLines)?0:0 - gs:=Map(), gs.Default:=0 - j:=bits.Stride-w*4, p:=bits.Scan0+(y-zy)*bits.Stride+(x-zx)*4-j-4 - Loop h + 0*(k:=0) - Loop w + 0*(p+=j) - c:=NumGet(p+=4,"uint") - , gs[++k]:=(((c>>16)&0xFF)*38+((c>>8)&0xFF)*75+(c&0xFF)*15)>>7 - if InStr(Threshold,"**") - { - Threshold:=Trim(Threshold,"* "), (Threshold="" && Threshold:=50) - s:="", sw:=w, w-=2, h-=2, x++, y++ - Loop h + 0*(y1:=0) - Loop w + 0*(y1++) - i:=y1*sw+A_Index+1, j:=gs[i]+Threshold - , s.=( gs[i-1]>j || gs[i+1]>j - || gs[i-sw]>j || gs[i+sw]>j - || gs[i-sw-1]>j || gs[i-sw+1]>j - || gs[i+sw-1]>j || gs[i+sw+1]>j ) ? "1":"0" - Threshold:="**" Threshold - } - else - { - Threshold:=Trim(Threshold,"* ") - if (Threshold="") - { - pp:=Map(), pp.Default:=0 - Loop 256 - pp[A_Index-1]:=0 - Loop w*h - pp[gs[A_Index]]++ - IP0:=IS0:=0 - Loop 256 - k:=A_Index-1, IP0+=k*pp[k], IS0+=pp[k] - Threshold:=Floor(IP0/IS0) - Loop 20 - { - LastThreshold:=Threshold - IP1:=IS1:=0 - Loop LastThreshold+1 - k:=A_Index-1, IP1+=k*pp[k], IS1+=pp[k] - IP2:=IP0-IP1, IS2:=IS0-IS1 - if (IS1!=0 && IS2!=0) - Threshold:=Floor((IP1/IS1+IP2/IS2)/2) - if (Threshold=LastThreshold) - Break - } - } - s:="" - Loop w*h - s.=gs[A_Index]<=Threshold ? "1":"0" - Threshold:="*" Threshold - } - ListLines lls - ;-------------------- - w:=Format("{:d}",w), CutUp:=CutDown:=0 - if (cut=1) - { - re1:="(^0{" w "}|^1{" w "})" - re2:="(0{" w "}$|1{" w "}$)" - While (s~=re1) - s:=RegExReplace(s,re1), CutUp++ - While (s~=re2) - s:=RegExReplace(s,re2), CutDown++ - } - rx:=x+w//2, ry:=y+CutUp+(h-CutUp-CutDown)//2 - s:="|<>" Threshold "$" w "." this.bit2base64(s) - ;-------------------- - return s -} - -; 等待几秒钟直到屏幕图像改变,需要先调用FindText().ScreenShot() - -WaitChange(time:=-1, x1:=0, y1:=0, x2:=0, y2:=0) -{ - hash:=this.GetPicHash(x1, y1, x2, y2, 0) - time:=this.Floor(time), timeout:=A_TickCount+Round(time*1000) - Loop - { - if (hash!=this.GetPicHash(x1, y1, x2, y2, 1)) - return 1 - if (time>=0 && A_TickCount>=timeout) - Break - Sleep 10 - } - return 0 -} - -; 等待屏幕图像稳定下来 - -WaitNotChange(time:=1, timeout:=30, x1:=0, y1:=0, x2:=0, y2:=0) -{ - oldhash:="", time:=this.Floor(time) - , timeout:=A_TickCount+Round(this.Floor(timeout)*1000) - Loop - { - hash:=this.GetPicHash(x1, y1, x2, y2, 1), t:=A_TickCount - if (hash!=oldhash) - oldhash:=hash, timeout2:=t+Round(time*1000) - if (t>=timeout2) - return 1 - if (t>=timeout) - return 0 - Sleep 100 - } -} - -GetPicHash(x1:=0, y1:=0, x2:=0, y2:=0, ScreenShot:=1) -{ - static init:=DllCall("LoadLibrary", "Str","ntdll", "Ptr") - x1:=this.Floor(x1), y1:=this.Floor(y1), x2:=this.Floor(x2), y2:=this.Floor(y2) - if (x1=0 && y1=0 && x2=0 && y2=0) - n:=150000, x:=y:=-n, w:=h:=2*n - else - x:=Min(x1,x2), y:=Min(y1,y2), w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1 - bits:=this.GetBitsFromScreen(&x,&y,&w,&h,ScreenShot,&zx,&zy), x-=zx, y-=zy - if (w<1 || h<1 || !bits.Scan0) - return 0 - hash:=0, Stride:=bits.Stride, p:=bits.Scan0+(y-1)*Stride+x*4, w*=4 - ListLines (lls:=A_ListLines)?0:0 - Loop h - hash:=(hash*31+DllCall("ntdll\RtlComputeCrc32", "uint",0 - , "Ptr",p+=Stride, "uint",w, "uint"))&0xFFFFFFFF - ListLines lls - return hash -} - -WindowToScreen(&x, &y, x1, y1, id:="") -{ - if (!id) - id:=WinGetID("A") - rect:=Buffer(16, 0) - , DllCall("GetWindowRect", "Ptr",id, "Ptr",rect) - , x:=x1+NumGet(rect,"int"), y:=y1+NumGet(rect,4,"int") -} - -ScreenToWindow(&x, &y, x1, y1, id:="") -{ - this.WindowToScreen(&dx, &dy, 0, 0, id), x:=x1-dx, y:=y1-dy -} - -ClientToScreen(&x, &y, x1, y1, id:="") -{ - if (!id) - id:=WinGetID("A") - pt:=Buffer(8, 0), NumPut("int64", 0, pt) - , DllCall("ClientToScreen", "Ptr",id, "Ptr",pt) - , x:=x1+NumGet(pt,"int"), y:=y1+NumGet(pt,4,"int") -} - -ScreenToClient(&x, &y, x1, y1, id:="") -{ - this.ClientToScreen(&dx, &dy, 0, 0, id), x:=x1-dx, y:=y1-dy -} - -; 不像 FindText 总是使用屏幕坐标,它使用与内置命令 -; PixelGetColor 一样的 CoordMode 设置的坐标模式 - -PixelGetColor(x, y, ScreenShot:=1, id:="") -{ - if (A_CoordModePixel="Window") - this.WindowToScreen(&x, &y, x, y, id) - else if (A_CoordModePixel="Client") - this.ClientToScreen(&x, &y, x, y, id) - if (ScreenShot) - this.ScreenShot(x, y, x, y) - return this.GetColor(x, y) -} - -; 不像 FindText 总是使用屏幕坐标,它使用与内置命令 -; ImageSearch 一样的 CoordMode 设置的坐标模式 -; 图片文件参数可以使用 "*n *TransBlack/White/RRGGBB-DRDGDB... d:\a.bmp" - -ImageSearch(&rx:="", &ry:="", x1:=0, y1:=0, x2:=0, y2:=0 - , ImageFile:="", ScreenShot:=1, FindAll:=0, dir:=1) -{ - dx:=dy:=0 - if (A_CoordModePixel="Window") - this.WindowToScreen(&dx, &dy, 0, 0) - else if (A_CoordModePixel="Client") - this.ClientToScreen(&dx, &dy, 0, 0) - text:="" - Loop Parse, ImageFile, "|" - if (v:=Trim(A_LoopField))!="" - { - text.=InStr(v,"$") ? "|" v : "|##" - . (RegExMatch(v, "(^|\s)\*(\d+)\s", &r) - ? Format("{:06X}", r[2]<<16|r[2]<<8|r[2]) : "000000") - . (RegExMatch(v, "i)(^|\s)\*Trans(\S+)\s", &r) ? "/" Trim(r[2],"/"):"") - . "$" Trim(RegExReplace(v,"(^|\s)\*\S+")) - } - x1:=this.Floor(x1), y1:=this.Floor(y1), x2:=this.Floor(x2), y2:=this.Floor(y2) - if (x1=0 && y1=0 && x2=0 && y2=0) - n:=150000, x1:=y1:=-n, x2:=y2:=n - if (ok:=this.FindText(,, x1+dx, y1+dy, x2+dx, y2+dy - , 0, 0, text, ScreenShot, FindAll,,,, dir)) - { - For k,v in ok ; you can use ok:=FindText().ok - v.1-=dx, v.2-=dy, v.x-=dx, v.y-=dy - rx:=ok[1].1, ry:=ok[1].2 - return ok - } - else - { - rx:=ry:="" - return 0 - } -} - -; 不像 FindText 总是使用屏幕坐标,它使用与内置命令 -; PixelSearch 一样的 CoordMode 设置的坐标模式 -; 颜色参数可以是 "RRGGBB-DRDGDB|RRGGBB-DRDGDB", Variation 取值 0-255 - -PixelSearch(&rx:="", &ry:="", x1:=0, y1:=0, x2:=0, y2:=0 - , ColorID:="", Variation:=0, ScreenShot:=1, FindAll:=0, dir:=1) -{ - n:=this.Floor(Variation), text:=Format("##{:06X}$0/0/", n<<16|n<<8|n) - . Trim(StrReplace(ColorID, "|", "/"), "- /") - return this.ImageSearch(&rx, &ry, x1, y1, x2, y2, text, ScreenShot, FindAll, dir) -} - -; 屏幕坐标指示的范围内的某些颜色的像素计数 -; 颜色参数可以是 "RRGGBB-DRDGDB|RRGGBB-DRDGDB", Variation 取值 0-255 - -PixelCount(x1:=0, y1:=0, x2:=0, y2:=0, ColorID:="", Variation:=0, ScreenShot:=1) -{ - x1:=this.Floor(x1), y1:=this.Floor(y1), x2:=this.Floor(x2), y2:=this.Floor(y2) - if (x1=0 && y1=0 && x2=0 && y2=0) - n:=150000, x:=y:=-n, w:=h:=2*n - else - x:=Min(x1,x2), y:=Min(y1,y2), w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1 - bits:=this.GetBitsFromScreen(&x,&y,&w,&h,ScreenShot,&zx,&zy), x-=zx, y-=zy - sum:=0, s1:=Buffer(4), s0:=Buffer(4), ss:=Buffer(w*(h+3)) - ini:={ bits:bits, ss:ss.Ptr, s1:s1.Ptr, s0:s0.Ptr, allpos:0, allpos_max:0 - , err1:0, err0:0, zoomW:1, zoomH:1 } - n:=this.Floor(Variation), text:=Format("##{:06X}$0/0/", n<<16|n<<8|n) - . Trim(StrReplace(ColorID, "|", "/"), "- /") - if IsObject(j:=this.PicInfo(text)) - sum:=this.PicFind(ini, j, 1, x, y, w, h) - return sum -} - -; 创建包含特定颜色的色块,可以限定这个色块中符合颜色的数量 -; ColorID 可以使用 "RRGGBB-DRDGDB|RRGGBB-DRDGDB", "*128", "**50" -; Count1, Count0 是这个色块二值化后黑点和白点的数量最小值 - -ColorBlock(ColorID, w, h, Count1:=0, Count0:=0) -{ - (Count0>0 && Count1:=0) - Text:="|<>[" (1-Count1/(w*h)) "," (1-Count0/(w*h)) "]" - . Trim(StrReplace(ColorID,"|","/"),"- /") . Format("${:d}.",w) - . this.bit2base64(StrReplace(Format(Format("{{}:0{:d}d{}}",w*h),0),"0" - , (Count0>0 ? "0":"1"))) - return Text -} - -Click(x:="", y:="", other1:="", other2:="", GoBack:=0) -{ - CoordMode "Mouse", (bak:=A_CoordModeMouse)?"Screen":"Screen" - if GoBack - MouseGetPos &oldx, &oldy - MouseMove x, y, 0 - Sleep 30 - Click x "," y "," other1 "," other2 - if GoBack - MouseMove oldx, oldy, 0 - CoordMode "Mouse", bak - return 1 -} - -; 动态运行AHK代码作为新线程 - -Class Thread -{ - __New(args*) - { - this.pid:=this.Exec(args*) - } - __Delete() - { - ProcessClose this.pid - } - Exec(s, Ahk:="", args:="") ; required AHK v1.1.34+ and Ahk2Exe Use .exe - { - Ahk:=Ahk ? Ahk : A_IsCompiled ? A_ScriptFullPath : A_AhkPath - s:="`nDllCall(`"SetWindowText`",`"Ptr`",A_ScriptHwnd,`"Str`",`"`")`n" - . "`n`n" . s, s:=RegExReplace(s, "\R", "`r`n") - Try - { - shell:=ComObject("WScript.Shell") - oExec:=shell.Exec("`"" Ahk "`" /script /force /CP0 * " args) - oExec.StdIn.Write(s) - oExec.StdIn.Close(), pid:=oExec.ProcessID - } - Catch - { - f:=A_Temp "\~ahk.tmp" - s:="`r`nTry FileDelete `"" f "`"`r`n" s - Try FileDelete f - FileAppend s, f - r:=this.Clear.Bind(this) - SetTimer r, -3000 - Run "`"" Ahk "`" /script /force /CP0 `"" f "`" " args,,, &pid - } - return pid - } - Clear() - { - Try FileDelete A_Temp "\~ahk.tmp" - SetTimer(,0) - } -} - -; FindText().QPC() 用法类似于 A_TickCount - -QPC() -{ - static f:=0, c:=DllCall("QueryPerformanceFrequency", "Int64*",&f)+(f/=1000) - return (!DllCall("QueryPerformanceCounter", "Int64*",&c))*0+(c/f) -} - -; FindText().ToolTip() 用法类似于 ToolTip - -ToolTip(s:="", x:="", y:="", num:=1, arg:="") -{ - static ini:=Map(), tip:=Map(), timer:=Map() - f:="ToolTip_" . this.Floor(num) - if (s="") - { - Try tip[f].Destroy() - ini[f]:="", tip[f]:="" - return - } - ;----------------- - r1:=A_CoordModeToolTip - r2:=A_CoordModeMouse - CoordMode "Mouse", "Screen" - MouseGetPos &x1, &y1 - CoordMode "Mouse", r1 - MouseGetPos &x2, &y2 - CoordMode "Mouse", r2 - (x!="" && x:="x" (this.Floor(x)+x1-x2)) - , (y!="" && y:="y" (this.Floor(y)+y1-y2)) - , (x="" && y="" && x:="x" (x1+16) " y" (y1+16)) - ;----------------- - (!IsObject(arg) && arg:={}) - bgcolor:=arg.HasOwnProp("bgcolor") ? arg.bgcolor : "FAFBFC" - color:=arg.HasOwnProp("color") ? arg.color : "Black" - font:=arg.HasOwnProp("font") ? arg.font : "Consolas" - size:=arg.HasOwnProp("size") ? arg.size : "10" - bold:=arg.HasOwnProp("bold") ? arg.bold : "" - trans:=arg.HasOwnProp("trans") ? arg.trans & 255 : 255 - timeout:=arg.HasOwnProp("timeout") ? arg.timeout : "" - ;----------------- - r:=bgcolor "|" color "|" font "|" size "|" bold "|" trans "|" s - if (!ini.Has(f) || ini[f]!=r) - { - ini[f]:=r - Try tip[f].Destroy() - tip[f]:=_Gui:=Gui() ; WS_EX_LAYERED:=0x80000, WS_EX_TRANSPARENT:=0x20 - _Gui.Opt("+LastFound +AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x80020") - _Gui.MarginX:=2, _Gui.MarginY:=2 - _Gui.BackColor:=bgcolor - _Gui.SetFont("c" color " s" size " " bold, font) - _Gui.Add("Text",, s) - _Gui.Title:=f - _Gui.Show("Hide") - WinSetTransparent(trans) - } - tip[f].Opt("+AlwaysOnTop") - tip[f].Show("NA " x " " y) - if (timeout) - { - (!timer.Has(f) && timer[f]:=this.ToolTip.Bind(this,"","","",num)) - SetTimer timer[f], -Round(Abs(this.Floor(timeout)*1000))-1 - } -} - -; FindText().ObjView() 查看对象的值用于调试 - -ObjView(obj, keyname:="") -{ - if IsObject(obj) - { - s:="" - For k,v in (HasMethod(obj,"__Enum") ? obj : obj.OwnProps()) - s.=this.ObjView(v, keyname "[" ((k is Integer) ? k : "`"" k "`"") "]") - } - else - s:=keyname ": " ((obj is Number) ? obj : "`"" obj "`"") "`n" - if (keyname!="") - return s - ;------------------ - _Gui:=Gui("+AlwaysOnTop") - _Gui.Add("Button", "y270 w350 Default", "OK").OnEvent("Click",(*)=>WinHide()) - _Gui.Add("Edit", "xp y10 w350 h250 -Wrap -WantReturn") - _Gui["Edit1"].Value:=s - _Gui.Title:="Debug view object values" - _Gui.Show() - DetectHiddenWindows 0 - WinWaitClose "ahk_id " _Gui.Hwnd - _Gui.Destroy() -} - -EditScroll(hEdit, regex:="", line:=0, pos:=0) -{ - s:=ControlGetText(hEdit) - pos:=(regex!="") ? InStr(SubStr(s,1,s~=regex) " ","`n",0,-1) - : (line>1) ? InStr(s,"`n",0,1,line-1) : pos - SendMessage 0xB1, pos, pos, hEdit - SendMessage 0xB7,,, hEdit -} - -LastCtrl() -{ - For Ctrl in GuiFromHwnd(WinExist()) - last:=Ctrl - return last -} - -Hide(args*) -{ - WinMinimize - WinHide - ToolTip - DetectHiddenWindows 0 - WinWaitClose "ahk_id " WinExist() -} - -SC(RGB, hwnd) -{ - SendMessage 0x2001,0,(RGB&0xFF)<<16|RGB&0xFF00|(RGB>>16)&0xFF,hwnd -} - - -;==== Optional GUI interface ==== - - -Gui(cmd, arg1:="", args*) -{ - static - local cri, lls, _Gui - ListLines InStr("MouseMove|ToolTipOff",cmd)?0:A_ListLines - static init:=0 - if (!init && init:=1) - { - SavePicDir:=A_Temp "\Ahk_ScreenShot\" - G_ := this.Gui.Bind(this) - G_G := this.Gui.Bind(this, "G") - G_Run := this.Gui.Bind(this, "Run") - G_Show := this.Gui.Bind(this, "Show") - G_KeyDown := this.Gui.Bind(this, "KeyDown") - G_LButtonDown := this.Gui.Bind(this, "LButtonDown") - G_RButtonDown := this.Gui.Bind(this, "RButtonDown") - G_MouseMove := this.Gui.Bind(this, "MouseMove") - G_ScreenShot := this.Gui.Bind(this, "ScreenShot") - G_ShowPic := this.Gui.Bind(this, "ShowPic") - G_Slider := this.Gui.Bind(this, "Slider") - G_ToolTip := this.Gui.Bind(this, "ToolTip") - G_ToolTipOff := this.Gui.Bind(this, "ToolTipOff") - G_SaveScr := this.Gui.Bind(this, "SaveScr") - G_PicShowOK := this.Gui.Bind(this, "PicShowOK") - G_Drag := this.Gui.Bind(this, "Drag") - FindText_Capture:=FindText_Main:="" - PrevControl:=x:=y:=oldx:=oldy:="" - Pics:=Map(), hBM_old:=dx:=dy:=0 - cri:=A_IsCritical - Critical - Lang:=this.Lang(,1), Tip_Text:=this.Lang(,2) - G_.Call("MakeCaptureWindow") - G_.Call("MakeMainWindow") - OnMessage(0x100, G_KeyDown) - OnMessage(0x201, G_LButtonDown) - OnMessage(0x204, G_RButtonDown) - OnMessage(0x200, G_MouseMove) - MenuTray:=A_TrayMenu - MenuTray.Add - MenuTray.Add Lang["s1"], G_Show - if (!A_IsCompiled && A_LineFile=A_ScriptFullPath) - { - MenuTray.Default:=Lang["s1"] - MenuTray.ClickCount:=1 - TraySetIcon "Shell32.dll", 23 - } - Critical cri - Gui("+LastFound").Destroy() - } - Switch cmd, 1 - { - Case "G": - id:=this.LastCtrl() - Try id.OnEvent("Click", G_Run) - Catch - Try id.OnEvent("Change", G_Run) - return - Case "Run": - Critical - G_.Call(arg1.Name) - return - Case "Show": - FindText_Main.Show(arg1 ? "Center" : "") - ControlFocus hscr - return - Case "Cancel", "Cancel2": - WinHide - return - Case "MakeCaptureWindow": - WindowColor:="0xDDEEFF" - Try FindText_Capture.Destroy() - FindText_Capture:=_Gui:=Gui() - _Gui.Opt("+LastFound +AlwaysOnTop -DPIScale") - _Gui.MarginX:=15, _Gui.MarginY:=10 - _Gui.BackColor:=WindowColor - _Gui.SetFont("s12", "Verdana") - Tab:=_Gui.Add("Tab3", "vMyTab1 -Wrap", StrSplit(Lang["s18"],"|")) - Tab.UseTab(1) - C_:=Map(), Cid_:=Map() - , nW:=71, nH:=25, w:=h:=12, pW:=nW*(w+1)-1, pH:=(nH+1)*(h+1)-1 - id:=_Gui.Add("Text", "w" pW " h" pH), Cid_[id.Hwnd]:=-1 - _Gui.Opt("-Theme") - ListLines (lls:=A_ListLines)?0:0 - Loop nW*(nH+1) - { - i:=A_Index, j:=i=1 ? "xp yp Section" : Mod(i,nW)=1 ? "xs y+1":"x+1" - id:=_Gui.Add("Progress", j " w" w " h" h " -E0x20000 Smooth") - C_[i]:=id.Hwnd, Cid_[id.Hwnd]:=i - } - ListLines lls - _Gui.Opt("+Theme") - _Gui.Add("Slider", "xs w" pW " vMySlider1 +Center Page20 Line10 NoTicks AltSubmit") - G_G.Call() - _Gui.Add("Slider", "ys h" pH " vMySlider2 +Center Page20 Line10 NoTicks AltSubmit +Vertical") - G_G.Call() - Tab.UseTab(2) - id:=_Gui.Add("Pic", "w" (pW-135) " h" pH " +Border -Background Section"), hPic:=id.Hwnd - Pic_hBM:=this.CreateDIBSection(Pic_w:=(pW-135), Pic_h:=pH) - _Gui.Add("Slider", "xs wp vMySlider3 +Center Page20 Line10 NoTicks AltSubmit") - G_G.Call() - _Gui.Add("Slider", "ys h" pH " vMySlider4 +Center Page20 Line10 NoTicks AltSubmit +Vertical") - G_G.Call() - _Gui.Add("ListBox", "ys w120 h200 vSelectBox AltSubmit 0x100") - G_G.Call() - _Gui.Add("Button", "y+0 wp vClearAll", Lang["ClearAll"]) - G_G.Call() - _Gui.Add("Button", "y+0 wp vOpenDir", Lang["OpenDir"]) - G_G.Call() - _Gui.Add("Button", "y+0 wp vLoadPic", Lang["LoadPic"]) - G_G.Call() - _Gui.Add("Button", "y+0 wp vSavePic", Lang["SavePic"]) - G_G.Call() - Tab.UseTab() - ;-------------- - _Gui.Add("Text", "xm Section", Lang["SelGray"]) - _Gui.Add("Edit", "x+5 yp-3 w80 vSelGray ReadOnly") - _Gui.Add("Text", "x+15 ys", Lang["SelColor"]) - _Gui.Add("Edit", "x+5 yp-3 w150 vSelColor ReadOnly") - _Gui.Add("Text", "x+15 ys", Lang["SelR"]) - _Gui.Add("Edit", "x+5 yp-3 w80 vSelR ReadOnly") - _Gui.Add("Text", "x+5 ys", Lang["SelG"]) - _Gui.Add("Edit", "x+5 yp-3 w80 vSelG ReadOnly") - _Gui.Add("Text", "x+5 ys", Lang["SelB"]) - _Gui.Add("Edit", "x+5 yp-3 w80 vSelB ReadOnly") - ;-------------- - id:=_Gui.Add("Button", "xm Hidden Section", Lang["Auto"]) - id.GetPos(&pX, &pY, &pW, &pH) - w:=Round(pW*0.75), i:=Round(w*3+15+pW*0.5-w*1.5) - _Gui.Add("Button", "xm+" i " yp w" w " hp -Wrap vRepU", Lang["RepU"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp hp -Wrap vCutU", Lang["CutU"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp hp -Wrap vCutU3", Lang["CutU3"]) - G_G.Call() - _Gui.Add("Button", "xm wp hp -Wrap vRepL", Lang["RepL"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp hp -Wrap vCutL", Lang["CutL"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp hp -Wrap vCutL3", Lang["CutL3"]) - G_G.Call() - _Gui.Add("Button", "x+15 w" pW " hp -Wrap vAuto", Lang["Auto"]) - G_G.Call() - _Gui.Add("Button", "x+15 w" w " hp -Wrap vRepR", Lang["RepR"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp hp -Wrap vCutR", Lang["CutR"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp hp -Wrap vCutR3", Lang["CutR3"]) - G_G.Call() - _Gui.Add("Button", "xm+" i " wp hp -Wrap vRepD", Lang["RepD"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp hp -Wrap vCutD", Lang["CutD"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp hp -Wrap vCutD3", Lang["CutD3"]) - G_G.Call() - ;-------------- - Tab:=_Gui.Add("Tab3", "ys -Wrap", StrSplit(Lang["s2"],"|")) - Tab.UseTab(1) - _Gui.Add("Text", "x+30 y+35", Lang["Threshold"]) - _Gui.Add("Edit", "x+15 w100 vThreshold") - _Gui.Add("Button", "x+15 yp-3 vGray2Two", Lang["Gray2Two"]) - G_G.Call() - Tab.UseTab(2) - _Gui.Add("Text", "x+30 y+35", Lang["GrayDiff"]) - _Gui.Add("Edit", "x+15 w100 vGrayDiff", "50") - _Gui.Add("Button", "x+15 yp-3 vGrayDiff2Two", Lang["GrayDiff2Two"]) - G_G.Call() - Tab.UseTab(3) - _Gui.Add("Text", "x+10 y+15 Section", Lang["Similar1"] " 0") - _Gui.Add("Slider", "x+0 w100 vSimilar1 +Center Page1 NoTicks ToolTip") - G_G.Call() - _Gui.Add("Text", "x+0", "100") - _Gui.Add("Button", "x+10 ys-2 vAddColorSim", Lang["AddColorSim"]) - G_G.Call() - _Gui.Add("Text", "x+25 ys+4", Lang["DiffRGB2"]) - _Gui.Add("Edit", "x+5 ys w80 vDiffRGB2 Limit3") - _Gui.Add("UpDown", "vdRGB2 Range0-255 Wrap", 50) - _Gui.Add("Button", "x+10 ys-2 vAddColorDiff", Lang["AddColorDiff"]) - G_G.Call() - _Gui.Add("Button", "xs vUndo2", Lang["Undo2"]) - G_G.Call() - _Gui.Add("Edit", "x+10 yp+2 w340 vColorList") - _Gui.Add("Button", "x+10 yp-2 vColor2Two", Lang["Color2Two"]) - G_G.Call() - Tab.UseTab(4) - _Gui.Add("Text", "x+30 y+35", Lang["Similar2"] " 0") - _Gui.Add("Slider", "x+0 w120 vSimilar2 +Center Page1 NoTicks ToolTip") - G_G.Call() - _Gui.Add("Text", "x+0", "100") - _Gui.Add("Button", "x+15 yp-3 vColorPos2Two", Lang["ColorPos2Two"]) - G_G.Call() - Tab.UseTab(5) - _Gui.Add("Text", "x+30 y+15 Section", Lang["Similar3"] " 0") - _Gui.Add("Slider", "x+0 w120 vSimilar3 +Center Page1 NoTicks ToolTip") - G_G.Call() - _Gui.Add("Text", "x+0", "100") - _Gui.Add("Button", "x+15 ys-2 vUndo", Lang["Undo"]) - G_G.Call() - _Gui.Add("Checkbox", "xs vMultiColor", Lang["MultiColor"]) - G_G.Call() - _Gui.Add("Checkbox", "x+50 vFindShape", Lang["FindShape"]) - G_G.Call() - Tab.UseTab() - ;-------------- - _Gui.Add("Button", "xm vReset", Lang["Reset"]) - G_G.Call() - _Gui.Add("Checkbox", "x+15 yp+5 vModify", Lang["Modify"]) - G_G.Call() - _Gui.Add("Text", "x+30", Lang["Comment"]) - _Gui.Add("Edit", "x+5 yp-2 w250 vComment") - _Gui.Add("Button", "x+10 yp-3 vSplitAdd", Lang["SplitAdd"]) - G_G.Call() - _Gui.Add("Button", "x+10 vAllAdd", Lang["AllAdd"]) - G_G.Call() - _Gui.Add("Button", "x+30 wp vOK", Lang["OK"]) - G_G.Call() - _Gui.Add("Button", "x+15 wp vCancel", Lang["Cancel"]) - G_G.Call() - _Gui.Add("Button", "xm vBind0", Lang["Bind0"]) - G_G.Call() - _Gui.Add("Button", "x+10 vBind1", Lang["Bind1"]) - G_G.Call() - _Gui.Add("Button", "x+10 vBind2", Lang["Bind2"]) - G_G.Call() - _Gui.Add("Button", "x+10 vBind3", Lang["Bind3"]) - G_G.Call() - _Gui.Add("Button", "x+10 vBind4", Lang["Bind4"]) - G_G.Call() - _Gui.Add("Button", "x+30 vSavePic2", Lang["SavePic2"]) - G_G.Call() - _Gui.Title:=Lang["s3"] - _Gui.Show("Hide") - _Gui.OnEvent("DropFiles", G_Drag) - return - Case "Drag": - Try G_.Call("LoadPic", args[2][1]) - return - Case "MakeMainWindow": - Try FindText_Main.Destroy() - FindText_Main:=_Gui:=Gui() - _Gui.Opt("+LastFound +AlwaysOnTop -DPIScale") - _Gui.MarginX:=15, _Gui.MarginY:=10 - _Gui.BackColor:=WindowColor - _Gui.SetFont("s12", "Verdana") - _Gui.Add("Text", "xm", Lang["NowHotkey"]) - _Gui.Add("Edit", "x+5 w160 vNowHotkey ReadOnly") - _Gui.Add("Hotkey", "x+5 w160 vSetHotkey1") - s:="F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|LWin|Ctrl|Shift|Space|MButton" - . "|ScrollLock|CapsLock|Ins|Esc|BS|Del|Tab|Home|End|PgUp|PgDn" - . "|NumpadDot|NumpadSub|NumpadAdd|NumpadDiv|NumpadMult" - _Gui.Add("DDL", "x+5 w160 vSetHotkey2", StrSplit(s,"|")) - _Gui.Add("Button", "x+15 vApply", Lang["Apply"]) - G_G.Call() - _Gui.Add("GroupBox", "xm y+0 w280 h55 vMyGroup cBlack") - _Gui.Add("Text", "xp+15 yp+20 Section", Lang["Myww"] ": ") - _Gui.Add("Text", "x+0 w80", nW//2) - _Gui.Add("UpDown", "vMyww Range1-100", nW//2) - _Gui.Add("Text", "x+15 ys", Lang["Myhh"] ": ") - _Gui.Add("Text", "x+0 w80", nH//2) - id:=_Gui.Add("UpDown", "vMyhh Range1-100", nH//2) - id.GetPos(&pX, &pY, &pW, &pH) - _Gui["MyGroup"].Move(,, pX+pW, pH+30) - id:=_Gui.Add("Checkbox", "x+100 ys vAddFunc", Lang["AddFunc"] " FindText()") - id.GetPos(&pX, &pY, &pW, &pH) - pW:=pX+pW-15, pW:=(pW<720?720:pW), w:=pW//5 - _Gui.Add("Button", "xm y+18 w" w " vCutL2", Lang["CutL2"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp vCutR2", Lang["CutR2"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp vCutU2", Lang["CutU2"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp vCutD2", Lang["CutD2"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp vUpdate", Lang["Update"]) - G_G.Call() - _Gui.SetFont("s6 bold", "Verdana") - _Gui.Add("Edit", "xm y+10 w" pW " h260 vMyPic -Wrap HScroll") - _Gui.SetFont("s12 norm", "Verdana") - w:=pW//3 - _Gui.Add("Button", "xm w" w " vCapture", Lang["Capture"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp vTest", Lang["Test"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp vCopy", Lang["Copy"]) - G_G.Call() - _Gui.Add("Button", "xm y+0 wp vCaptureS", Lang["CaptureS"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp vGetRange", Lang["GetRange"]) - G_G.Call() - _Gui.Add("Button", "x+0 wp vGetOffset", Lang["GetOffset"]) - G_G.Call() - _Gui.Add("Edit", "xm y+10 w130 hp vClipText") - _Gui.Add("Button", "x+0 vPaste", Lang["Paste"]) - G_G.Call() - _Gui.Add("Button", "x+0 vTestClip", Lang["TestClip"]) - G_G.Call() - id:=_Gui.Add("Button", "x+0 vGetClipOffset", Lang["GetClipOffset"]) - G_G.Call() - id.GetPos(&x,, &w) - w:=((pW+15)-(x+w))//2 - _Gui.Add("Edit", "x+0 w" w " hp vOffset") - _Gui.Add("Button", "x+0 wp vCopyOffset", Lang["CopyOffset"]) - G_G.Call() - _Gui.SetFont("cBlue") - id:=_Gui.Add("Edit", "xm w" pW " h250 vscr -Wrap HScroll"), hscr:=id.Hwnd - _Gui.Title:=Lang["s4"] - _Gui.Show("Hide") - G_.Call("LoadScr") - OnExit(G_SaveScr) - return - Case "LoadScr": - f:=A_Temp "\~scr2.tmp" - Try s:="", s:=FileRead(f) - FindText_Main["scr"].Value:=s - return - Case "SaveScr": - f:=A_Temp "\~scr2.tmp" - s:=FindText_Main["scr"].Value - Try FileDelete f - FileAppend s, f - return - Case "Capture", "CaptureS": - _Gui:=FindText_Main - if show_gui:=WinExist("ahk_id " _Gui.Hwnd) - this.Hide() - if (cmd="Capture") - { - w:=_Gui["Myww"].Value - h:=_Gui["Myhh"].Value - p:=this.GetRange(w, h) - sx:=p[1], sy:=p[2], sw:=p[3]-p[1]+1, sh:=p[4]-p[2]+1 - , Bind_ID:=p[5], bind_mode:="" - _Gui:=FindText_Capture - _Gui["MyTab1"].Choose(1) - } - else - { - sx:=0, sy:=0, sw:=1, sh:=1, Bind_ID:=WinExist("A"), bind_mode:="" - _Gui:=FindText_Capture - _Gui["MyTab1"].Choose(2) - } - n:=150000, x:=y:=-n, w:=h:=2*n - hBM:=this.BitmapFromScreen(&x,&y,&w,&h,(arg1=0?0:1)) - Pics:=Map(), Pics[hBM]:=1, hBM_x:=hBM_y:=0 - G_.Call("CaptureUpdate") - G_.Call("PicUpdate") - Names:=["HBITMAP:*" hBM], s:="" - Loop Files, SavePicDir "*.bmp" - Names.Push(v:=A_LoopFileFullPath), s.="|" RegExReplace(v,"i)^.*\\|\.bmp$") - _Gui["SelectBox"].Delete() - _Gui["SelectBox"].Add(StrSplit(Trim(s,"|"),"|")) - ;------------------------ - s:="SelGray|SelColor|SelR|SelG|SelB|Threshold|Comment|ColorList" - Loop Parse, s, "|" - _Gui[A_LoopField].Value:="" - For k,v in ["Similar1","Similar2","Similar3"] - _Gui[v].Value:=90 - _Gui["Modify"].Value:=Modify:=0 - _Gui["MultiColor"].Value:=MultiColor:=0 - _Gui["FindShape"].Value:=FindShape:=0 - _Gui["GrayDiff"].Value:=50 - _Gui["Gray2Two"].Focus() - _Gui["Gray2Two"].Opt("+Default") - _Gui.Show("Center") - Event:=Result:="" - DetectHiddenWindows 0 - Critical "Off" - WinWaitClose "ahk_id " _Gui.Hwnd - Critical - ToolTip - Pics[hBM]:=1, hBM_old:=0 - For k,v in Pics - Try DllCall("DeleteObject", "Ptr",k) - Text:=RegExMatch(Result,"\|<[^>\n]*>[^$\n]+\$[^`"'\r\n]+",&r)?r[0]:"" - ;------------------------ - _Gui:=FindText_Main - if (bind_mode!="") - { - tt:=WinGetTitle(Bind_ID) - tc:=WinGetClass(Bind_ID) - tt:=Trim(SubStr(tt,1,30) (tc ? " ahk_class " tc:"")) - tt:=StrReplace(RegExReplace(tt, "[;``]", "``$0"), "`"","```"") - Result:="`nSetTitleMatchMode 2`nid:=WinExist(`"" tt "`")" - . "`nFindText().BindWindow(id" (bind_mode=0 ? "":"," bind_mode) - . ") `; " Lang["s6"] " FindText().BindWindow(0)`n`n" Result - } - if (Event="OK") - { - s:="" - if (!A_IsCompiled) - Try s:=FileRead(A_LineFile) - re:="i)\n\s*FindText[^\n]+args\*[\s\S]*?Script_End[(){}\s]+}" - s:=RegExMatch(s, re, &r) ? "`n;==========`n" r[0] "`n" : "" - _Gui["scr"].Value:=Result "`n" s - _Gui["MyPic"].Value:=Trim(this.ASCII(Result),"`n") - } - else if (Event="SplitAdd" || Event="AllAdd") - { - s:=_Gui["scr"].Value - r:=SubStr(s, 1, InStr(s,"=FindText(")) - i:=j:=0, re:="<[^>\n]*>[^$\n]+\$[^`"'\r\n]+" - While j:=RegExMatch(r, re,, j+1) - i:=InStr(r, "`n", 0, j) - _Gui["scr"].Value:=SubStr(s,1,i) . Result . SubStr(s,i+1) - _Gui["MyPic"].Value:=Trim(this.ASCII(Result),"`n") - } - if (Event) && RegExMatch(Result, "\$\d+\.[\w+/]{1,100}", &r) - this.EditScroll(hscr, "\Q" r[0] "\E") - Event:=Result:=s:="" - ;---------------------- - if (show_gui && arg1="") - G_Show.Call() - else A_Clipboard:=Text - return Text - Case "CaptureUpdate": - nX:=sx, nY:=sy, nW:=sw, nH:=sh - bits:=this.GetBitsFromScreen(&nX,&nY,&nW,&nH,0,&zx,&zy) - cors:=Map(), cors.Default:=0 - , show:=Map(), show.Default:=0 - , ascii:=Map(), ascii.Default:=0 - , SelPos:=bg:=color:=Result:="" - , dx:=dy:=CutLeft:=CutRight:=CutUp:=CutDown:=0 - ListLines (lls:=A_ListLines)?0:0 - if (nW>0 && nH>0 && bits.Scan0) - { - j:=bits.Stride-nW*4, p:=bits.Scan0+(nY-zy)*bits.Stride+(nX-zx)*4-j-4 - Loop nH + 0*(k:=0) - Loop nW + 0*(p+=j) - show[++k]:=1, cors[k]:=NumGet(p+=4,"uint") - } - Loop 25 + 0*(ty:=dy-1)*(k:=0) - Loop 71 + 0*(tx:=dx-1)*(ty++) - this.SC(((++tx)71 - _Gui["MySlider2"].Enabled:=nH>25 - _Gui["MySlider1"].Value:=0 - _Gui["MySlider2"].Value:=0 - return - Case "PicUpdate": - Try i:=0, i:=Pics.Has(hBM_old) - Try (!i) && DllCall("DeleteObject", "Ptr",hBM_old) - this.GetBitmapWH(hBM, &hBM_w, &hBM_h), hBM_old:=hBM - G_.Call("PicShow", 1) - return - Case "MySlider3", "MySlider4": - hBM_x:=Round(FindText_Capture["MySlider3"].Value*(hBM_w-Pic_w)/100) - hBM_y:=Round(FindText_Capture["MySlider4"].Value*(hBM_h-Pic_h)/100) - G_.Call("PicShow") - return - Case "PicShow": - w:=hBM_w-Pic_w, h:=hBM_h-Pic_h - , hBM_x:=Max(Min(hBM_x,w),0), hBM_y:=Max(Min(hBM_y,h),0) - if (w<0 || h<0) - this.DrawHBM(Pic_hBM, [[0, 0, Pic_w, Pic_h, WindowColor]]) - this.CopyHBM(Pic_hBM,0,0,hBM,hBM_x,hBM_y,Min(Pic_w,hBM_w),Min(Pic_h,hBM_h)) - if (arg1) - G_PicShowOK.Call() - else - { - this.BitmapToWindow(hPic,0,0,Pic_hBM,0,0,Pic_w,Pic_h) - SetTimer G_PicShowOK, -1000 - } - FindText_Capture["MySlider3"].Value:=w>0?Round(hBM_x/w*100):0 - FindText_Capture["MySlider4"].Value:=h>0?Round(hBM_y/h*100):0 - return - Case "PicShowOK": - FindText_Capture[hPic].Value:="*w0 *h0 HBITMAP:*" Pic_hBM - return - Case "Reset": - G_.Call("CaptureUpdate") - return - Case "LoadPic": - FindText_Capture.Opt("+OwnDialogs") - f:=arg1 - if (f="") - { - if !FileExist(SavePicDir) - DirCreate SavePicDir - f:=SavePicDir "*.bmp" - Loop Files, f - f:=A_LoopFileFullPath - f:=FileSelect(, f, "Select Picture") - } - if !InStr(f,"HBITMAP:") && !FileExist(f) - { - MsgBox Lang["s17"], "Tip", "4096 T1" - return - } - if !this.ShowPic(f, 0, &sx, &sy, &sw, &sh) - return - hBM:=this.BitmapFromScreen(&sx, &sy, &sw, &sh, 0) - sw:=Min(sw,71), sh:=Min(sh,25) - G_.Call("CaptureUpdate") - G_.Call("PicUpdate") - return - Case "SavePic": - FindText_Capture.Hide() - this.ScreenShot(), this.ShowPic("HBITMAP:*" hBM) - Try GuiFromHwnd(WinExist("Show Pic")).Opt("+OwnDialogs") - Loop - { - p:=this.GetRange2() - r:=MsgBox(Lang["s15"], "Tip", "4099") - if (r!="No") - Break - } - if (r="Yes") - G_.Call("ScreenShot", p[1] "|" p[2] "|" p[3] "|" p[4] "|0") - this.ShowPic() - return - Case "SelectBox": - SelectBox:=FindText_Capture["SelectBox"].Value - Try f:="", f:=Names[SelectBox] - if (f!="") - G_.Call("LoadPic", f) - return - Case "ClearAll": - FindText_Capture.Opt("+OwnDialogs") - if MsgBox(Lang["s19"], "Tip", "4100")="Yes" - { - FindText_Capture.Hide() - Try FileDelete SavePicDir "*.bmp" - } - return - Case "OpenDir": - if !FileExist(SavePicDir) - DirCreate SavePicDir - Run SavePicDir - return - Case "GetRange": - _Gui:=FindText_Main - _Gui.Opt("+LastFound") - this.Hide() - p:=this.GetRange2(), v:=p[1] ", " p[2] ", " p[3] ", " p[4] - s:=_Gui["scr"].Value - re:="i)(=FindText\([^\n]*?)([^(,\n]*,){4}([^,\n]*,[^,\n]*,[^,\n]*Text)" - if SubStr(s,1,s~="i)\n\s*FindText[^\n]+args\*")~=re - { - s:=RegExReplace(s, re, "$1 " v ",$3",, 1) - _Gui["scr"].Value:=s - } - _Gui["Offset"].Value:=v - G_Show.Call() - return - Case "Test", "TestClip": - _Gui:=FindText_Main - _Gui.Opt("+LastFound") - this.Hide() - ;---------------------- - if (cmd="Test") - s:=_Gui["scr"].Value - else - s:=_Gui["ClipText"].Value - if (cmd="Test") && InStr(s, "MCode(") - { - s:="`nA_TrayMenu.ClickCount:=1`n" s "`nExitApp`n" - Thread1:=FindTextClass.Thread(s) - DetectHiddenWindows 1 - if WinWait("ahk_class AutoHotkey ahk_pid " Thread1.pid,, 3) - WinWaitClose(,, 30) - ; Thread1:="" ; kill the Thread - } - else - { - t:=A_TickCount, v:=X:=Y:="" - if RegExMatch(s, "<[^>\n]*>[^$\n]+\$[^`"'\r\n]+", &r) - v:=this.FindText(&X, &Y, 0,0,0,0, 0,0, r[0]) - r:=StrSplit(Lang["s8"] "||||", "|") - MsgBox r[1] ":`t" (IsObject(v)?v.Length:v) "`n`n" - . r[2] ":`t" (A_TickCount-t) " " r[3] "`n`n" - . r[4] ":`t" X ", " Y "`n`n" - . r[5] ":`t<" (IsObject(v)?v[1].id:"") ">", "Tip", "4096 T3" - Try For i,j in v - if (i<=2) - this.MouseTip(j.x, j.y) - v:="", A_Clipboard:=X "," Y - } - ;---------------------- - G_Show.Call() - return - Case "GetOffset", "GetClipOffset": - FindText_Main.Hide() - p:=this.GetRange() - _Gui:=FindText_Main - if (cmd="GetOffset") - s:=_Gui["scr"].Value - else - s:=_Gui["ClipText"].Value - if RegExMatch(s, "<[^>\n]*>[^$\n]+\$[^`"'\r\n]+", &r) - && this.FindText(&X, &Y, 0,0,0,0, 0,0, r[0]) - { - r:=StrReplace("X+" ((p[1]+p[3])//2-X) - . ", Y+" ((p[2]+p[4])//2-Y), "+-", "-") - if (cmd="GetOffset") - { - re:="i)(\(\)\.\w*Click\w*\()[^,\n]*,[^,)\n]*" - if SubStr(s,1,s~="i)\n\s*FindText[^\n]+args\*")~=re - s:=RegExReplace(s, re, "$1" r,, 1) - _Gui["scr"].Value:=s - } - _Gui["Offset"].Value:=r - } - s:="", G_Show.Call() - return - Case "Paste": - if RegExMatch(A_Clipboard, "\|?<[^>\n]*>[^$\n]+\$[^`"'\r\n]+", &r) - { - FindText_Main["ClipText"].Value:=r[0] - FindText_Main["MyPic"].Value:=Trim(this.ASCII(r[0]),"`n") - } - return - Case "CopyOffset": - A_Clipboard:=FindText_Main["Offset"].Value - return - Case "Copy": - s:=EditGetSelectedText(hscr) - if (s="") - { - s:=FindText_Main["scr"].Value - r:=FindText_Main["AddFunc"].Value - if (r != 1) - s:=RegExReplace(s, "i)\n\s*FindText[^\n]+args\*[\s\S]*") - , s:=RegExReplace(s, "i)\n; ok:=FindText[\s\S]*") - , s:=SubStr(s, (s~="i)\n[ \t]*Text")) - } - A_Clipboard:=RegExReplace(s, "\R", "`r`n") - ControlFocus hscr - return - Case "Apply": - _Gui:=FindText_Main - NowHotkey:=_Gui["NowHotkey"].Value - SetHotkey1:=_Gui["SetHotkey1"].Value - SetHotkey2:=_Gui["SetHotkey2"].Text - if (NowHotkey!="") - Try Hotkey "*" NowHotkey,, "Off" - k:=SetHotkey1!="" ? SetHotkey1 : SetHotkey2 - if (k!="") - Try Hotkey "*" k, G_ScreenShot, "On" - _Gui["NowHotkey"].Value:=k - _Gui["SetHotkey1"].Value:="" - _Gui["SetHotkey2"].Choose(0) - return - Case "ScreenShot": - Critical - if !FileExist(SavePicDir) - DirCreate SavePicDir - Loop - f:=SavePicDir . Format("{:03d}.bmp",A_Index) - Until !FileExist(f) - this.SavePic(f, StrSplit(arg1,"|")*) - CoordMode "ToolTip" - this.ToolTip(Lang["s9"],, 0,, { bgcolor:"Yellow", color:"Red" - , size:48, bold:"bold", trans:200, timeout:0.2 }) - return - Case "Bind0", "Bind1", "Bind2", "Bind3", "Bind4": - this.BindWindow(Bind_ID, bind_mode:=SubStr(cmd,5)) - n:=150000, x:=y:=-n, w:=h:=2*n - hBM:=this.BitmapFromScreen(&x,&y,&w,&h,1) - G_.Call("PicUpdate") - FindText_Capture["MyTab1"].Choose(2) - this.BindWindow(0) - return - Case "MySlider1", "MySlider2": - SetTimer G_Slider, -10 - return - Case "Slider": - Critical - dx:=nW>71 ? Round(FindText_Capture["MySlider1"].Value*(nW-71)/100):0 - dy:=nH>25 ? Round(FindText_Capture["MySlider2"].Value*(nH-25)/100):0 - if (oldx=dx && oldy=dy) - return - ListLines (lls:=A_ListLines)?0:0 - Loop 25 + 0*(ty:=dy-1)*(k:=0) - Loop 71 + 0*(tx:=dx-1)*(ty++) - this.SC(((++tx)>=nW || ty>=nH || !show[i:=ty*nW+tx+1] - ? WindowColor : bg="" ? cors[i] : ascii[i] ? 0:0xFFFFFF), C_[++k]) - Loop 71*(oldx!=dx) + 0*(i:=nW*nH+dx)*(k:=71*25) - this.SC((show[++i]?0xFF0000:0xFFFFAA), C_[++k]) - ListLines lls - oldx:=dx, oldy:=dy - return - Case "RepColor", "CutColor": - if (cmd="RepColor") - show[k]:=1, c:=(bg="" ? cors[k] : ascii[k] ? 0:0xFFFFFF) - else - show[k]:=0, c:=WindowColor - if (tx:=Mod(k-1,nW)-dx)>=0 && tx<71 && (ty:=(k-1)//nW-dy)>=0 && ty<25 - this.SC(c, C_[ty*71+tx+1]) - return - Case "RepL": - if (CutLeft<=0) || (bg!="" && InStr(color,"**") && CutLeft=1) - return - k:=CutLeft-nW, CutLeft-- - Loop nH - k+=nW, (A_Index>CutUp && A_Index=nW) - return - CutLeft++, k:=CutLeft-nW - Loop nH - k+=nW, (A_Index>CutUp && A_IndexCutUp && A_Index=nW) - return - CutRight++, k:=1-CutRight - Loop nH - k+=nW, (A_Index>CutUp && A_IndexCutLeft && A_Index=nH) - return - CutUp++, k:=(CutUp-1)*nW - Loop nW - k++, (A_Index>CutLeft && A_IndexCutLeft && A_Index=nH) - return - CutDown++, k:=(nH-CutDown)*nW - Loop nW - k++, (A_Index>CutLeft && A_Index>16)&0xFF)*38+((c>>8)&0xFF)*75+(c&0xFF)*15)>>7 - _Gui:=FindText_Capture - _Gui["Threshold"].Focus() - Threshold:=_Gui["Threshold"].Value - if (Threshold="") - { - pp:=Map(), pp.Default:=0 - Loop 256 - pp[A_Index-1]:=0 - Loop nW*nH - if (show[A_Index]) - pp[gs[A_Index]]++ - IP0:=IS0:=0 - Loop 256 - k:=A_Index-1, IP0+=k*pp[k], IS0+=pp[k] - Threshold:=Floor(IP0/IS0) - Loop 20 - { - LastThreshold:=Threshold - IP1:=IS1:=0 - Loop LastThreshold+1 - k:=A_Index-1, IP1+=k*pp[k], IS1+=pp[k] - IP2:=IP0-IP1, IS2:=IS0-IS1 - if (IS1!=0 && IS2!=0) - Threshold:=Floor((IP1/IS1+IP2/IS2)/2) - if (Threshold=LastThreshold) - Break - } - _Gui["Threshold"].Value:=Threshold - } - Threshold:=Round(Threshold) - color:="*" Threshold, k:=i:=0 - Loop nW*nH - ascii[++k]:=v:=(gs[k]<=Threshold) - , (show[k] && i:=(v?i+1:i-1)) - bg:=(i>0 ? "1":"0"), G_.Call("BlackWhite") - ListLines lls - return - Case "GrayDiff2Two": - _Gui:=FindText_Capture - GrayDiff:=_Gui["GrayDiff"].Value - if (GrayDiff="") - { - _Gui.Opt("+OwnDialogs") - MsgBox Lang["s11"], "Tip", "4096 T1" - return - } - ListLines (lls:=A_ListLines)?0:0 - gs:=Map(), gs.Default:=0, k:=0 - Loop nW*nH - gs[++k]:=((((c:=cors[k])>>16)&0xFF)*38+((c>>8)&0xFF)*75+(c&0xFF)*15)>>7 - if (CutLeft=0) - G_.Call("CutL") - if (CutRight=0) - G_.Call("CutR") - if (CutUp=0) - G_.Call("CutU") - if (CutDown=0) - G_.Call("CutD") - GrayDiff:=Round(GrayDiff) - color:="**" GrayDiff, k:=i:=0 - Loop nW*nH - j:=gs[++k]+GrayDiff - , ascii[k]:=v:=( gs[k-1]>j || gs[k+1]>j - || gs[k-nW]>j || gs[k+nW]>j - || gs[k-nW-1]>j || gs[k-nW+1]>j - || gs[k+nW-1]>j || gs[k+nW+1]>j ) - , (show[k] && i:=(v?i+1:i-1)) - bg:=(i>0 ? "1":"0"), G_.Call("BlackWhite") - ListLines lls - return - Case "AddColorSim", "AddColorDiff": - _Gui:=FindText_Capture - c:=StrReplace(_Gui["SelColor"].Value, "0x") - if (c="") - { - _Gui.Opt("+OwnDialogs") - MsgBox Lang["s12"], "Tip", "4096 T1" - return - } - s:=_Gui["ColorList"].Value - if InStr(cmd, "Sim") - v:=_Gui["Similar1"].Value, v:=c "-" Round(v/100,2) - else - v:=_Gui["dRGB2"].Value, v:=c "-" Format("{:06X}",v<<16|v<<8|v) - s:=RegExReplace("/" s, "/" c "-[^/]*") . "/" v - _Gui["ColorList"].Value:=Trim(s,"/") - ControlSend "{End}", _Gui["ColorList"].Hwnd - G_.Call("Color2Two") - return - Case "Undo2": - _Gui:=FindText_Capture - s:=_Gui["ColorList"].Value - s:=RegExReplace("/" s, "/[^/]+$") - _Gui["ColorList"].Value:=Trim(s,"/") - ControlSend "{End}", _Gui["ColorList"].Hwnd - return - Case "Color2Two": - _Gui:=FindText_Capture - color:=RegExReplace(_Gui["ColorList"].Value, "i)\s|0x") - if (color="") - { - _Gui.Opt("+OwnDialogs") - MsgBox Lang["s16"], "Tip", "4096 T1" - return - } - ListLines (lls:=A_ListLines)?0:0 - k:=i:=v:=0, arr:=StrSplit(Trim(StrReplace(color,"@","-"), "/"), "/") - Loop nW*nH - { - c:=cors[++k], rr:=(c>>16)&0xFF, gg:=(c>>8)&0xFF, bb:=c&0xFF - For k1,v1 in arr - { - r:=StrSplit(Trim(v1,"-") "-", "-"), c:=this.ToRGB(r[1]), n:=r[2] - , r:=((c>>16)&0xFF)-rr, g:=((c>>8)&0xFF)-gg, b:=(c&0xFF)-bb - if InStr(n, ".") + GetBitsFromScreen(&x := 0, &y := 0, &w := 0, &h := 0 + , ScreenShot := 1, &zx := 0, &zy := 0, &zw := 0, &zh := 0) { + static CAPTUREBLT := "" + if (CAPTUREBLT = "") ; thanks Descolada { - n:=this.Floor(n), n:=(n<=0||n>1?0:Floor(9*255*255*(1-n)*(1-n))) - if v:=(3*r*r+4*g*g+2*b*b<=n) - Break + DllCall("Dwmapi\DwmIsCompositionEnabled", "Int*", &i := 0) + CAPTUREBLT := i ? 0 : 0x40000000 + } + if InStr(A_OSVersion, ".") ; thanks QQ:349029755 + try DllCall("SetThreadDpiAwarenessContext", "Ptr", -3, "Ptr") + (!IsObject(this.bits) && this.bits := { Scan0: 0, hBM: 0, oldzw: 0, oldzh: 0 }) + , bits := this.bits + if (!ScreenShot && bits.Scan0) { + zx := bits.zx, zy := bits.zy, zw := bits.zw, zh := bits.zh + , w := Min(x + w, zx + zw), x := Max(x, zx), w -= x + , h := Min(y + h, zy + zh), y := Max(y, zy), h -= y + return bits + } + cri := A_IsCritical + Critical + bits.BindWindow := id := this.BindWindow(0, 0, 1) + if (id) { + try + WinGetPos &zx, &zy, &zw, &zh, id + catch + id := 0 + } + if (!id) { + zx := SysGet(76) + , zy := SysGet(77) + , zw := SysGet(78) + , zh := SysGet(79) + } + this.UpdateBits(bits, zx, zy, zw, zh) + , w := Min(x + w, zx + zw), x := Max(x, zx), w -= x + , h := Min(y + h, zy + zh), y := Max(y, zy), h -= y + if (!ScreenShot || w < 1 || h < 1 || !bits.hBM) { + Critical cri + return bits + } + if IsSet(GetBitsFromScreen2) && (GetBitsFromScreen2 is Func) + && GetBitsFromScreen2(bits, x - zx, y - zy, w, h) { + ; Get the bind window use bits.BindWindow + ; Each small range of data obtained from DXGI must be + ; copied to the screenshot cache using FindText().CopyBits() + zx := bits.zx, zy := bits.zy, zw := bits.zw, zh := bits.zh + Critical cri + return bits + } + mDC := DllCall("CreateCompatibleDC", "Ptr", 0, "Ptr") + oBM := DllCall("SelectObject", "Ptr", mDC, "Ptr", bits.hBM, "Ptr") + if (id) { + if (mode := this.BindWindow(0, 0, 0, 1)) < 2 { + hDC := DllCall("GetDCEx", "Ptr", id, "Ptr", 0, "int", 3, "Ptr") + DllCall("BitBlt", "Ptr", mDC, "int", x - zx, "int", y - zy, "int", w, "int", h + , "Ptr", hDC, "int", x - zx, "int", y - zy, "uint", 0xCC0020 | CAPTUREBLT) + DllCall("ReleaseDC", "Ptr", id, "Ptr", hDC) + } + else { + hBM2 := this.CreateDIBSection(zw, zh) + mDC2 := DllCall("CreateCompatibleDC", "Ptr", 0, "Ptr") + oBM2 := DllCall("SelectObject", "Ptr", mDC2, "Ptr", hBM2, "Ptr") + DllCall("UpdateWindow", "Ptr", id) + ; RDW_INVALIDATE=0x1|RDW_ERASE=0x4|RDW_ALLCHILDREN=0x80|RDW_FRAME=0x400 + ; DllCall("RedrawWindow", "Ptr",id, "Ptr",0, "Ptr",0, "uint", 0x485) + DllCall("PrintWindow", "Ptr", id, "Ptr", mDC2, "uint", (mode > 3) * 3) + DllCall("BitBlt", "Ptr", mDC, "int", x - zx, "int", y - zy, "int", w, "int", h + , "Ptr", mDC2, "int", x - zx, "int", y - zy, "uint", 0xCC0020) + DllCall("SelectObject", "Ptr", mDC2, "Ptr", oBM2) + DllCall("DeleteDC", "Ptr", mDC2) + DllCall("DeleteObject", "Ptr", hBM2) + } + } + else { + hDC := DllCall("GetWindowDC", "Ptr", id := DllCall("GetDesktopWindow", "Ptr"), "Ptr") + DllCall("BitBlt", "Ptr", mDC, "int", x - zx, "int", y - zy, "int", w, "int", h + , "Ptr", hDC, "int", x, "int", y, "uint", 0xCC0020 | CAPTUREBLT) + DllCall("ReleaseDC", "Ptr", id, "Ptr", hDC) + } + if this.CaptureCursor(0, 0, 0, 0, 0, 1) + this.CaptureCursor(mDC, zx, zy, zw, zh) + DllCall("SelectObject", "Ptr", mDC, "Ptr", oBM) + DllCall("DeleteDC", "Ptr", mDC) + Critical cri + return bits + } + UpdateBits(bits, zx, zy, zw, zh) { + if (zw > bits.oldzw || zh > bits.oldzh || !bits.hBM) { + try DllCall("DeleteObject", "Ptr", bits.hBM) + bits.hBM := this.CreateDIBSection(zw, zh, bpp := 32, &ppvBits) + , bits.Scan0 := (!bits.hBM ? 0 : ppvBits) + , bits.Stride := ((zw * bpp + 31) // 32) * 4 + , bits.oldzw := zw, bits.oldzh := zh + } + bits.zx := zx, bits.zy := zy, bits.zw := zw, bits.zh := zh + } + CreateDIBSection(w, h, bpp := 32, &ppvBits := 0) { + NumPut("int", 40, "int", w, "int", -h, "short", 1, "short", bpp, bi := Buffer(40, 0)) + return DllCall("CreateDIBSection", "Ptr", 0, "Ptr", bi + , "int", 0, "Ptr*", &ppvBits := 0, "Ptr", 0, "int", 0, "Ptr") + } + GetBitmapWH(hBM, &w, &h) { + bm := Buffer(size := (A_PtrSize = 8 ? 32 : 24), 0) + , DllCall("GetObject", "Ptr", hBM, "int", size, "Ptr", bm) + , w := NumGet(bm, 4, "int"), h := Abs(NumGet(bm, 8, "int")) + } + CopyHBM(hBM1, x1, y1, hBM2, x2, y2, w, h, Clear := 0) { + if (w < 1 || h < 1 || !hBM1 || !hBM2) + return + mDC1 := DllCall("CreateCompatibleDC", "Ptr", 0, "Ptr") + oBM1 := DllCall("SelectObject", "Ptr", mDC1, "Ptr", hBM1, "Ptr") + mDC2 := DllCall("CreateCompatibleDC", "Ptr", 0, "Ptr") + oBM2 := DllCall("SelectObject", "Ptr", mDC2, "Ptr", hBM2, "Ptr") + DllCall("BitBlt", "Ptr", mDC1, "int", x1, "int", y1, "int", w, "int", h + , "Ptr", mDC2, "int", x2, "int", y2, "uint", 0xCC0020) + if (Clear) + DllCall("BitBlt", "Ptr", mDC1, "int", x1, "int", y1, "int", w, "int", h + , "Ptr", mDC1, "int", x1, "int", y1, "uint", MERGECOPY := 0xC000CA) + DllCall("SelectObject", "Ptr", mDC1, "Ptr", oBM1) + DllCall("DeleteDC", "Ptr", mDC1) + DllCall("SelectObject", "Ptr", mDC2, "Ptr", oBM2) + DllCall("DeleteDC", "Ptr", mDC2) + } + CopyBits(Scan01, Stride1, x1, y1, Scan02, Stride2, x2, y2, w, h, Reverse := 0) { + if (w < 1 || h < 1 || !Scan01 || !Scan02) + return + static init := 0, MFCopyImage + if (!init && init := 1) { + MFCopyImage := DllCall("GetProcAddress", "Ptr" + , DllCall("LoadLibrary", "Str", "Mfplat.dll", "Ptr") + , "AStr", "MFCopyImage", "Ptr") + } + if (MFCopyImage && !Reverse) ; thanks QQ:121507989 + { + return DllCall(MFCopyImage + , "Ptr", Scan01 + y1 * Stride1 + x1 * 4, "int", Stride1 + , "Ptr", Scan02 + y2 * Stride2 + x2 * 4, "int", Stride2 + , "uint", w * 4, "uint", h) + } + ListLines (lls := A_ListLines) ? 0 : 0 + p1 := Scan01 + (y1 - 1) * Stride1 + x1 * 4 + , p2 := Scan02 + (y2 - 1) * Stride2 + x2 * 4, w *= 4 + , (Reverse) && (p2 += (h + 1) * Stride2, Stride2 := -Stride2) + loop h + DllCall("RtlMoveMemory", "Ptr", p1 += Stride1, "Ptr", p2 += Stride2, "Ptr", w) + ListLines lls + } + DrawHBM(hBM, lines) { + mDC := DllCall("CreateCompatibleDC", "Ptr", 0, "Ptr") + oBM := DllCall("SelectObject", "Ptr", mDC, "Ptr", hBM, "Ptr") + oldc := "", brush := 0, rect := Buffer(16) + for k, v in lines ; [ [x, y, w, h, color] ] + if IsObject(v) { + if (oldc != v[5]) { + oldc := v[5], BGR := (oldc & 0xFF) << 16 | oldc & 0xFF00 | (oldc >> 16) & 0xFF + DllCall("DeleteObject", "Ptr", brush) + brush := DllCall("CreateSolidBrush", "uint", BGR, "Ptr") + } + DllCall("SetRect", "Ptr", rect, "int", v[1], "int", v[2] + , "int", v[1] + v[3], "int", v[2] + v[4]) + DllCall("FillRect", "Ptr", mDC, "Ptr", rect, "Ptr", brush) + } + DllCall("DeleteObject", "Ptr", brush) + DllCall("SelectObject", "Ptr", mDC, "Ptr", oBM) + DllCall("DeleteObject", "Ptr", mDC) + } + ; 绑定窗口从而可以后台查找这个窗口的图像 + ; 相当于始终在前台。解绑窗口使用 FindText().BindWindow(0) + BindWindow(bind_id := 0, bind_mode := 0, get_id := 0, get_mode := 0) { + (!IsObject(this.bind) && this.bind := { id: 0, mode: 0, oldStyle: 0 }) + , bind := this.bind + if (get_id) + return bind.id + if (get_mode) + return bind.mode + if (bind_id) { + bind.id := bind_id := this.Floor(bind_id) + , bind.mode := bind_mode, bind.oldStyle := 0 + if (bind_mode & 1) { + i := WinGetExStyle(bind_id) + bind.oldStyle := i + WinSetTransparent(255, bind_id) + loop 30 { + Sleep 100 + i := WinGetTransparent(bind_id) + } + until (i = 255) + } + } + else { + bind_id := bind.id + if (bind.mode & 1) + WinSetExStyle(bind.oldStyle, bind_id) + bind.id := 0, bind.mode := 0, bind.oldStyle := 0 + } + } + ; 使用 FindText().CaptureCursor(1) 设置抓图时捕获鼠标 + ; 使用 FindText().CaptureCursor(0) 取消抓图时捕获鼠标 + CaptureCursor(hDC := 0, zx := 0, zy := 0, zw := 0, zh := 0, get_cursor := 0) { + if (get_cursor) + return this.Cursor + if (hDC = 1 || hDC = 0) && (zw = 0) { + this.Cursor := hDC + return + } + mi := Buffer(40, 0), NumPut("int", 16 + A_PtrSize, mi) + DllCall("GetCursorInfo", "Ptr", mi) + bShow := NumGet(mi, 4, "int") + hCursor := NumGet(mi, 8, "Ptr") + x := NumGet(mi, 8 + A_PtrSize, "int") + y := NumGet(mi, 12 + A_PtrSize, "int") + if (!bShow) || (x < zx || y < zy || x >= zx + zw || y >= zy + zh) + return + ni := Buffer(40, 0) + DllCall("GetIconInfo", "Ptr", hCursor, "Ptr", ni) + xCenter := NumGet(ni, 4, "int") + yCenter := NumGet(ni, 8, "int") + hBMMask := NumGet(ni, (A_PtrSize = 8 ? 16 : 12), "Ptr") + hBMColor := NumGet(ni, (A_PtrSize = 8 ? 24 : 16), "Ptr") + DllCall("DrawIconEx", "Ptr", hDC + , "int", x - xCenter - zx, "int", y - yCenter - zy, "Ptr", hCursor + , "int", 0, "int", 0, "int", 0, "int", 0, "int", 3) + DllCall("DeleteObject", "Ptr", hBMMask) + DllCall("DeleteObject", "Ptr", hBMColor) + } + MCode(hex) { + flag := ((hex ~= "[^A-Fa-f\d\s]") ? 1 : 4), len := 0 + loop 2 + if !DllCall("crypt32\CryptStringToBinary", "Str", hex, "uint", 0, "uint", flag + , "Ptr", (A_Index = 1 ? 0 : (p := Buffer(len)).Ptr), "uint*", &len, "Ptr", 0, "Ptr", 0) + return + if DllCall("VirtualProtect", "Ptr", p.Ptr, "Ptr", len, "uint", 0x40, "uint*", 0) + return p + } + bin2hex(addr, size, base64 := 0) { + flag := (base64 ? 1 : 4) | 0x40000000, len := 0 + loop 2 + DllCall("crypt32\CryptBinaryToString", "Ptr", addr, "uint", size, "uint", flag + , "Ptr", (A_Index = 1 ? 0 : (p := Buffer(len * 2)).Ptr), "uint*", &len) + return RegExReplace(StrGet(p.Ptr, len), "\s+") + } + base64tobit(s) { + ListLines (lls := A_ListLines) ? 0 : 0 + Chars := "0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + loop parse, Chars + if InStr(s, A_LoopField, 1) + s := RegExReplace(s, "[" A_LoopField "]", ((i := A_Index - 1) >> 5 & 1) + . (i >> 4 & 1) . (i >> 3 & 1) . (i >> 2 & 1) . (i >> 1 & 1) . (i & 1)) + s := RegExReplace(RegExReplace(s, "[^01]+"), "10*$") + ListLines lls + return s + } + bit2base64(s) { + ListLines (lls := A_ListLines) ? 0 : 0 + s := RegExReplace(s, "[^01]+") + s .= SubStr("100000", 1, 6 - Mod(StrLen(s), 6)) + s := RegExReplace(s, ".{6}", "|$0") + Chars := "0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + loop parse, Chars + s := StrReplace(s, "|" . ((i := A_Index - 1) >> 5 & 1) + . (i >> 4 & 1) . (i >> 3 & 1) . (i >> 2 & 1) . (i >> 1 & 1) . (i & 1), A_LoopField) + ListLines lls + return s + } + ASCII(s) { + if RegExMatch(s, "\$(\d+)\.([\w+/]+)", &r) { + s := RegExReplace(this.base64tobit(r[2]), ".{" r[1] "}", "$0`n") + s := StrReplace(StrReplace(s, "0", "_"), "1", "0") + } + else s := "" + return s + } + ; 可以在脚本的开头用 FindText().PicLib(Text,1) 导入字库, + ; 然后使用 FindText().PicLib("说明文字1|说明文字2|...") 获取字库中的数据 + PicLib(comments, add_to_Lib := 0, index := 1) { + (!IsObject(this.Lib) && this.Lib := Map()), Lib := this.Lib + , (!Lib.Has(index) && Lib[index] := Map()), Lib := Lib[index] + if (add_to_Lib) { + re := "<([^>\n]*)>[^$\n]+\$[^`"'\r\n]+" + loop parse, comments, "|" + if RegExMatch(A_LoopField, re, &r) { + s1 := Trim(r[1]), s2 := "" + loop parse, s1 + s2 .= Format("_{:d}", Ord(A_LoopField)) + (s2 != "") && Lib[s2] := r[0] + } + } + else { + Text := "" + loop parse, comments, "|" { + s1 := Trim(A_LoopField), s2 := "" + loop parse, s1 + s2 .= Format("_{:d}", Ord(A_LoopField)) + (Lib.Has(s2)) && Text .= "|" Lib[s2] + } + return Text + } + } + ; 分割字符串为单个文字并获取数据 + PicN(Number, index := 1) { + return this.PicLib(RegExReplace(Number, ".", "|$0"), 0, index) + } + ; 使用 FindText().PicX(Text) 可以将文字分割成多个单字的组合,从而适应间隔变化 + ; 但是不能用于“颜色位置二值化”模式, 因为位置是与整体图像相关的 + PicX(Text) { + if !RegExMatch(Text, "(<[^$\n]+)\$(\d+)\.([\w+/]+)", &r) + return Text + v := this.base64tobit(r[3]), Text := "" + c := StrLen(StrReplace(v, "0")) <= StrLen(v) // 2 ? "1" : "0" + txt := RegExReplace(v, ".{" r[2] "}", "$0`n") + while InStr(txt, c) { + while !(txt ~= "m`n)^" c) + txt := RegExReplace(txt, "m`n)^.") + i := 0 + while (txt ~= "m`n)^.{" i "}" c) + i := Format("{:d}", i + 1) + v := RegExReplace(txt, "m`n)^(.{" i "}).*", "$1") + txt := RegExReplace(txt, "m`n)^.{" i "}") + if (v != "") + Text .= "|" r[1] "$" i "." this.bit2base64(v) + } + return Text + } + ; 截屏,作为后续操作要用的“上一次的截屏” + ScreenShot(x1 := 0, y1 := 0, x2 := 0, y2 := 0) { + this.FindText(, , x1, y1, x2, y2) + } + ; 从“上一次的截屏”中快速获取指定坐标的RGB颜色 + ; 如果坐标超出了屏幕范围,将返回白色 + GetColor(x, y, fmt := 1) { + bits := this.GetBitsFromScreen(, , , , 0, &zx, &zy, &zw, &zh), x -= zx, y -= zy + , c := (x >= 0 && x < zw && y >= 0 && y < zh && bits.Scan0) + ? NumGet(bits.Scan0 + y * bits.Stride + x * 4, "uint") : 0xFFFFFF + return (fmt ? Format("0x{:06X}", c & 0xFFFFFF) : c) + } + ; 在“上一次的截屏”中设置点的RGB颜色 + SetColor(x, y, color := 0x000000) { + bits := this.GetBitsFromScreen(, , , , 0, &zx, &zy, &zw, &zh), x -= zx, y -= zy + if (x >= 0 && x < zw && y >= 0 && y < zh && bits.Scan0) + NumPut("uint", color, bits.Scan0 + y * bits.Stride + x * 4) + } + ; 根据 FindText() 的结果识别一行文字或验证码 + ; offsetX 为两个文字的最大间隔,超过会插入*号 + ; offsetY 为两个文字的最大高度差 + ; overlapW 用于设置覆盖的宽度 + ; 最后返回数组:{text:识别结果, x:结果左上角X, y:结果左上角Y, w:宽, h:高} + Ocr(ok, offsetX := 20, offsetY := 20, overlapW := 0) { + ocr_Text := ocr_X := ocr_Y := min_X := dx := "" + for k, v in ok + x := v.1 + , min_X := (A_Index = 1 || x < min_X ? x : min_X) + , max_X := (A_Index = 1 || x > max_X ? x : max_X) + while (min_X != "" && min_X <= max_X) { + LeftX := "" + for k, v in ok { + x := v.1, y := v.2 + if (x < min_X) || (ocr_Y != "" && Abs(y - ocr_Y) > offsetY) + continue + ; Get the leftmost X coordinates + if (LeftX = "" || x < LeftX) + LeftX := x, LeftY := y, LeftW := v.3, LeftH := v.4, LeftOCR := v.id + } + if (LeftX = "") + break + if (ocr_X = "") + ocr_X := LeftX, min_Y := LeftY, max_Y := LeftY + LeftH + ; If the interval exceeds the set value, add "*" to the result + ocr_Text .= (ocr_Text != "" && LeftX > dx ? "*" : "") . LeftOCR + ; Update for next search + min_X := LeftX + LeftW - (overlapW > LeftW // 2 ? LeftW // 2 : overlapW) + , dx := LeftX + LeftW + offsetX, ocr_Y := LeftY + , (LeftY < min_Y && min_Y := LeftY) + , (LeftY + LeftH > max_Y && max_Y := LeftY + LeftH) + } + (ocr_X = "") && ocr_X := min_Y := min_X := max_Y := 0 + return { text: ocr_Text, x: ocr_X, y: min_Y, w: min_X - ocr_X, h: max_Y - min_Y } + } + ; 按照从左到右、从上到下的顺序排序FindText()的结果 + ; 忽略轻微的Y坐标差距,返回排序后的数组对象 + Sort(ok, dy := 10) { + if !IsObject(ok) + return ok + s := "", n := 150000, ypos := [] + for k, v in ok { + x := v.x, y := v.y, add := 1 + for k1, v1 in ypos + if Abs(y - v1) <= dy { + y := v1, add := 0 + break + } + if (add) + ypos.Push(y) + s .= (y * n + x) "." k "|" + } + s := Trim(s, "|") + s := Sort(s, "N D|") + ok2 := [] + for k, v in StrSplit(s, "|") + ok2.Push(ok[SubStr(v, InStr(v, ".") + 1)]) + return ok2 + } + ; 以指定点为中心,按从近到远排序FindText()的结果,返回排序后的数组 + Sort2(ok, px, py) { + if !IsObject(ok) + return ok + s := "" + for k, v in ok + s .= ((v.x - px) ** 2 + (v.y - py) ** 2) "." k "|" + s := Trim(s, "|") + s := Sort(s, "N D|") + ok2 := [] + for k, v in StrSplit(s, "|") + ok2.Push(ok[SubStr(v, InStr(v, ".") + 1)]) + return ok2 + } + ; 按指定的查找方向,排序FindText()的结果,返回排序后的数组 + Sort3(ok, dir := 1) { + if !IsObject(ok) + return ok + s := "", n := 150000 + for k, v in ok + x := v.1, y := v.2 + , s .= (dir = 1 ? y * n + x + : dir = 2 ? y * n - x + : dir = 3 ? -y * n + x + : dir = 4 ? -y * n - x + : dir = 5 ? x * n + y + : dir = 6 ? x * n - y + : dir = 7 ? -x * n + y + : dir = 8 ? -x * n - y : y * n + x) "." k "|" + s := Trim(s, "|") + s := Sort(s, "N D|") + ok2 := [] + for k, v in StrSplit(s, "|") + ok2.Push(ok[SubStr(v, InStr(v, ".") + 1)]) + return ok2 + } + ; 提示某个坐标的位置,或远程控制中当前鼠标的位置 + MouseTip(x := "", y := "", w := 10, h := 10, d := 3) { + if (x = "") { + pt := Buffer(16, 0), DllCall("GetCursorPos", "Ptr", pt) + x := NumGet(pt, 0, "uint"), y := NumGet(pt, 4, "uint") + } + loop 4 { + this.RangeTip(x - w, y - h, 2 * w + 1, 2 * h + 1, (A_Index & 1 ? "Red" : "Blue"), d) + Sleep 500 + } + this.RangeTip() + } + ; 显示范围的边框,类似于 ToolTip + RangeTip(x := "", y := "", w := "", h := "", color := "Red", d := 3, num := 1) { + ListLines (lls := A_ListLines) ? 0 : 0 + static tab := Map() + (!tab.Has(num) && tab[num] := [0, 0, 0, 0]), Range := tab[num] + if (x = "") { + if (Range[1]) + loop 4 + Range[A_Index].Destroy(), Range[A_Index] := "" + ListLines lls + return + } + if !(Range[1]) { + loop 4 + Range[A_Index] := Gui("+AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x08000000") + } + x := this.Floor(x), y := this.Floor(y), w := this.Floor(w), h := this.Floor(h), d := this.Floor(d) + loop 4 { + i := A_Index + , x1 := (i = 2 ? x + w : x - d) + , y1 := (i = 3 ? y + h : y - d) + , w1 := (i = 1 || i = 3 ? w + 2 * d : d) + , h1 := (i = 2 || i = 4 ? h + 2 * d : d) + Range[i].BackColor := color + Range[i].Show("NA x" x1 " y" y1 " w" w1 " h" h1) + } + ListLines lls + } + State(key) { + return GetKeyState(key, "P") || GetKeyState(key) + } + ; 用鼠标左右键选取屏幕范围 + GetRange(ww := 25, hh := 8, key := "RButton") { + static KeyOff := "", hk + if (!KeyOff) + KeyOff := this.GetRange.Bind(this, "Off") + if (ww == "Off") + return hk := Trim(A_ThisHotkey, "*") + ;--------------------- + GetRange_HotkeyIf := _Gui := Gui() + _Gui.Opt("-Caption +ToolWindow +E0x80000") + _Gui.Title := "GetRange_HotkeyIf" + _Gui.Show("NA x0 y0 w0 h0") + ;--------------------- + if GetKeyState("Ctrl") + Send "{Ctrl Up}" + HotIfWinExist "GetRange_HotkeyIf" + keys := key "|Up|Down|Left|Right" + for k, v in StrSplit(keys, "|") { + if GetKeyState(v) + Send "{" v " Up}" + try Hotkey "*" v, KeyOff, "On" + } + HotIfWinExist + ;--------------------- + Critical (cri := A_IsCritical) ? "Off" : "Off" + CoordMode "Mouse" + tip := this.Lang("s5") + hk := "", oldx := oldy := "", keydown := 0 + loop { + Sleep 50 + MouseGetPos &x2, &y2 + if (hk = key) || this.State(key) || this.State("Ctrl") { + keydown++ + if (keydown = 1) + MouseGetPos &x1, &y1, &Bind_ID + timeout := A_TickCount + 3000 + while (A_TickCount < timeout) && (this.State(key) || this.State("Ctrl")) + Sleep 50 + hk := "" + if (keydown >= 2) + break + } + else if (hk = "Up") || this.State("Up") + (hh > 1 && hh--), hk := "" + else if (hk = "Down") || this.State("Down") + hh++, hk := "" + else if (hk = "Left") || this.State("Left") + (ww > 1 && ww--), hk := "" + else if (hk = "Right") || this.State("Right") + ww++, hk := "" + x := (keydown ? x1 : x2), y := (keydown ? y1 : y2) + this.RangeTip(x - ww, y - hh, 2 * ww + 1, 2 * hh + 1, (A_MSec < 500 ? "Red" : "Blue")) + if (oldx = x2 && oldy = y2) + continue + oldx := x2, oldy := y2 + ToolTip "x: " x " y: " y "`n" tip + } + ToolTip + this.RangeTip() + HotIfWinExist "GetRange_HotkeyIf" + for k, v in StrSplit(keys, "|") + try Hotkey "*" v, KeyOff, "Off" + HotIfWinExist + GetRange_HotkeyIf.Destroy() + Critical cri + return [x - ww, y - hh, x + ww, y + hh, Bind_ID] + } + GetRange2(key := "LButton") { + FindText_GetRange := _Gui := Gui() + _Gui.Opt("+LastFound +AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x08000000") + _Gui.BackColor := "White" + WinSetTransparent(10) + this.GetBitsFromScreen(, , , , 0, &x, &y, &w, &h) + _Gui.Title := "FindText_GetRange" + _Gui.Show("NA x" x " y" y " w" w " h" h) + CoordMode "Mouse" + tip := this.Lang("s7"), oldx := oldy := "" + loop { + Sleep 50 + MouseGetPos &x1, &y1 + if (oldx = x1 && oldy = y1) + continue + oldx := x1, oldy := y1 + ToolTip "x: " x1 " y: " y1 " w: 0 h: 0`n" tip + } + until this.State(key) || this.State("Ctrl") + loop { + Sleep 50 + MouseGetPos &x2, &y2 + x := Min(x1, x2), y := Min(y1, y2), w := Abs(x2 - x1) + 1, h := Abs(y2 - y1) + 1 + this.RangeTip(x, y, w, h, (A_MSec < 500 ? "Red" : "Blue")) + if (oldx = x2 && oldy = y2) + continue + oldx := x2, oldy := y2 + ToolTip "x: " x " y: " y " w: " w " h: " h "`n" tip + } + until !(this.State(key) || this.State("Ctrl")) + ToolTip + this.RangeTip() + FindText_GetRange.Destroy() + A_Clipboard := x "," y "," (x + w - 1) "," (y + h - 1) + return [x, y, x + w - 1, y + h - 1] + } + BitmapFromScreen(&x := 0, &y := 0, &w := 0, &h := 0 + , ScreenShot := 1, &zx := 0, &zy := 0, &zw := 0, &zh := 0) { + bits := this.GetBitsFromScreen(&x, &y, &w, &h, ScreenShot, &zx, &zy, &zw, &zh) + if (w < 1 || h < 1 || !bits.hBM) + return + hBM := this.CreateDIBSection(w, h) + this.CopyHBM(hBM, 0, 0, bits.hBM, x - zx, y - zy, w, h, 1) + return hBM + } + ; 快速保存截图为BMP文件,可用于调试 + ; 如果 file=0 或 "" ,会保存到剪贴板 + SavePic(file := 0, x1 := 0, y1 := 0, x2 := 0, y2 := 0, ScreenShot := 1) { + x1 := this.Floor(x1), y1 := this.Floor(y1), x2 := this.Floor(x2), y2 := this.Floor(y2) + if (x1 = 0 && y1 = 0 && x2 = 0 && y2 = 0) + n := 150000, x := y := -n, w := h := 2 * n + else + x := Min(x1, x2), y := Min(y1, y2), w := Abs(x2 - x1) + 1, h := Abs(y2 - y1) + 1 + hBM := this.BitmapFromScreen(&x, &y, &w, &h, ScreenShot) + this.SaveBitmapToFile(file, hBM) + DllCall("DeleteObject", "Ptr", hBM) + } + ; 保存图像到文件,如果 file=0 或者 "",保存到剪贴板 + ; 参数可以是位图句柄或者文件路径,例如: "c:\a.bmp" + SaveBitmapToFile(file, hBM_or_file, x := 0, y := 0, w := 0, h := 0) { + if IsNumber(hBM_or_file) + hBM_or_file := "HBITMAP:*" hBM_or_file + if !hBM := DllCall("CopyImage", "Ptr", LoadPicture(hBM_or_file) + , "int", 0, "int", 0, "int", 0, "uint", 0x2008) + return + if (file) || (w != 0 && h != 0) { + (w = 0 || h = 0) && this.GetBitmapWH(hBM, &w, &h) + hBM2 := this.CreateDIBSection(w, -h, bpp := (file ? 24 : 32)) + this.CopyHBM(hBM2, 0, 0, hBM, x, y, w, h) + DllCall("DeleteObject", "Ptr", hBM), hBM := hBM2 + } + dib := Buffer(dib_size := (A_PtrSize = 8 ? 104 : 84), 0) + , DllCall("GetObject", "Ptr", hBM, "int", dib_size, "Ptr", dib) + , pbi := dib.Ptr + (bitmap_size := A_PtrSize = 8 ? 32 : 24) + , size := NumGet(pbi + 20, "uint"), pBits := NumGet(pbi - A_PtrSize, "Ptr") + if (!file) { + hdib := DllCall("GlobalAlloc", "uint", 2, "Ptr", 40 + size, "Ptr") + pdib := DllCall("GlobalLock", "Ptr", hdib, "Ptr") + DllCall("RtlMoveMemory", "Ptr", pdib, "Ptr", pbi, "Ptr", 40) + DllCall("RtlMoveMemory", "Ptr", pdib + 40, "Ptr", pBits, "Ptr", size) + DllCall("GlobalUnlock", "Ptr", hdib) + DllCall("OpenClipboard", "Ptr", 0) + DllCall("EmptyClipboard") + DllCall("SetClipboardData", "uint", 8, "Ptr", hdib) + DllCall("CloseClipboard") + } + else { + if InStr(file, "\") && !FileExist(dir := RegExReplace(file, "[^\\]*$")) + try DirCreate(dir) + bf := Buffer(14, 0), NumPut("short", 0x4D42, bf) + NumPut("uint", 54 + size, bf, 2), NumPut("uint", 54, bf, 10) + f := FileOpen(file, "w"), f.RawWrite(bf, 14) + , f.RawWrite(pbi + 0, 40), f.RawWrite(pBits + 0, size), f.Close() + } + DllCall("DeleteObject", "Ptr", hBM) + } + ; 显示保存的图像 + ShowPic(file := "", show := 1, &x := "", &y := "", &w := "", &h := "") { + if (file = "") { + this.ShowScreenShot() + return + } + if !(hBM := LoadPicture(file)) + return + this.GetBitmapWH(hBM, &w, &h) + bits := this.GetBitsFromScreen(, , , , 0, &x, &y, &zw, &zh) + this.UpdateBits(bits, x, y, Max(w, zw), Max(h, zh)) + this.CopyHBM(bits.hBM, 0, 0, hBM, 0, 0, w, h) + DllCall("DeleteObject", "Ptr", hBM) + if (show) + this.ShowScreenShot(x, y, x + w - 1, y + h - 1, 0) + return 1 + } + ; 显示内存中的屏幕截图用于调试 + ShowScreenShot(x1 := 0, y1 := 0, x2 := 0, y2 := 0, ScreenShot := 1) { + static hPic, oldx, oldy, oldw, oldh, FindText_Screen := "" + x1 := this.Floor(x1), y1 := this.Floor(y1), x2 := this.Floor(x2), y2 := this.Floor(y2) + if (x1 = 0 && y1 = 0 && x2 = 0 && y2 = 0) { + if (FindText_Screen) + FindText_Screen.Destroy(), FindText_Screen := "" + return + } + x := Min(x1, x2), y := Min(y1, y2), w := Abs(x2 - x1) + 1, h := Abs(y2 - y1) + 1 + if !hBM := this.BitmapFromScreen(&x, &y, &w, &h, ScreenShot) + return + ;--------------- + if (!FindText_Screen) { + FindText_Screen := _Gui := Gui() ; WS_EX_NOACTIVATE:=0x08000000 + _Gui.Opt("+AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x08000000") + _Gui.MarginX := 0, _Gui.MarginY := 0 + id := _Gui.Add("Pic", "w" w " h" h), hPic := id.Hwnd + _Gui.Title := "Show Pic" + _Gui.Show("NA x" x " y" y " w" w " h" h) + oldx := x, oldy := y, oldw := w, oldh := h + } + else if (oldx != x || oldy != y || oldw != w || oldh != h) { + if (oldw != w || oldh != h) + FindText_Screen[hPic].Move(, , w, h) + FindText_Screen.Show("NA x" x " y" y " w" w " h" h) + oldx := x, oldy := y, oldw := w, oldh := h + } + this.BitmapToWindow(hPic, 0, 0, hBM, 0, 0, w, h) + DllCall("DeleteObject", "Ptr", hBM) + } + BitmapToWindow(hwnd, x1, y1, hBM, x2, y2, w, h) { + mDC := DllCall("CreateCompatibleDC", "Ptr", 0, "Ptr") + oBM := DllCall("SelectObject", "Ptr", mDC, "Ptr", hBM, "Ptr") + hDC := DllCall("GetDC", "Ptr", hwnd, "Ptr") + DllCall("BitBlt", "Ptr", hDC, "int", x1, "int", y1, "int", w, "int", h + , "Ptr", mDC, "int", x2, "int", y2, "uint", 0xCC0020) + DllCall("ReleaseDC", "Ptr", hwnd, "Ptr", hDC) + DllCall("SelectObject", "Ptr", mDC, "Ptr", oBM) + DllCall("DeleteDC", "Ptr", mDC) + } + ; 快速获取屏幕图像的搜索文本数据 + GetTextFromScreen(x1 := 0, y1 := 0, x2 := 0, y2 := 0, Threshold := "" + , ScreenShot := 1, &rx := "", &ry := "", cut := 1) { + if (x1 = 0 && y1 = 0 && x2 = 0 && y2 = 0) + return this.Gui("CaptureS", ScreenShot) + x1 := this.Floor(x1), y1 := this.Floor(y1), x2 := this.Floor(x2), y2 := this.Floor(y2) + x := Min(x1, x2), y := Min(y1, y2), w := Abs(x2 - x1) + 1, h := Abs(y2 - y1) + 1 + bits := this.GetBitsFromScreen(&x, &y, &w, &h, ScreenShot, &zx, &zy) + if (w < 1 || h < 1 || !bits.Scan0) { + return + } + ListLines (lls := A_ListLines) ? 0 : 0 + gs := Map(), gs.Default := 0 + j := bits.Stride - w * 4, p := bits.Scan0 + (y - zy) * bits.Stride + (x - zx) * 4 - j - 4 + loop h + 0 * (k := 0) + loop w + 0 * (p += j) + c := NumGet(p += 4, "uint") + , gs[++k] := (((c >> 16) & 0xFF) * 38 + ((c >> 8) & 0xFF) * 75 + (c & 0xFF) * 15) >> 7 + if InStr(Threshold, "**") { + Threshold := Trim(Threshold, "* "), (Threshold = "" && Threshold := 50) + s := "", sw := w, w -= 2, h -= 2, x++, y++ + loop h + 0 * (y1 := 0) + loop w + 0 * (y1++) + i := y1 * sw + A_Index + 1, j := gs[i] + Threshold + , s .= (gs[i - 1] > j || gs[i + 1] > j + || gs[i - sw] > j || gs[i + sw] > j + || gs[i - sw - 1] > j || gs[i - sw + 1] > j + || gs[i + sw - 1] > j || gs[i + sw + 1] > j) ? "1" : "0" + Threshold := "**" Threshold + } + else { + Threshold := Trim(Threshold, "* ") + if (Threshold = "") { + pp := Map(), pp.Default := 0 + loop 256 + pp[A_Index - 1] := 0 + loop w * h + pp[gs[A_Index]]++ + IP0 := IS0 := 0 + loop 256 + k := A_Index - 1, IP0 += k * pp[k], IS0 += pp[k] + Threshold := Floor(IP0 / IS0) + loop 20 { + LastThreshold := Threshold + IP1 := IS1 := 0 + loop LastThreshold + 1 + k := A_Index - 1, IP1 += k * pp[k], IS1 += pp[k] + IP2 := IP0 - IP1, IS2 := IS0 - IS1 + if (IS1 != 0 && IS2 != 0) + Threshold := Floor((IP1 / IS1 + IP2 / IS2) / 2) + if (Threshold = LastThreshold) + break + } + } + s := "" + loop w * h + s .= gs[A_Index] <= Threshold ? "1" : "0" + Threshold := "*" Threshold + } + ListLines lls + ;-------------------- + w := Format("{:d}", w), CutUp := CutDown := 0 + if (cut = 1) { + re1 := "(^0{" w "}|^1{" w "})" + re2 := "(0{" w "}$|1{" w "}$)" + while (s ~= re1) + s := RegExReplace(s, re1), CutUp++ + while (s ~= re2) + s := RegExReplace(s, re2), CutDown++ + } + rx := x + w // 2, ry := y + CutUp + (h - CutUp - CutDown) // 2 + s := "|<>" Threshold "$" w "." this.bit2base64(s) + ;-------------------- + return s + } + ; 等待几秒钟直到屏幕图像改变,需要先调用FindText().ScreenShot() + WaitChange(time := -1, x1 := 0, y1 := 0, x2 := 0, y2 := 0) { + hash := this.GetPicHash(x1, y1, x2, y2, 0) + time := this.Floor(time), timeout := A_TickCount + Round(time * 1000) + loop { + if (hash != this.GetPicHash(x1, y1, x2, y2, 1)) + return 1 + if (time >= 0 && A_TickCount >= timeout) + break + Sleep 10 + } + return 0 + } + ; 等待屏幕图像稳定下来 + WaitNotChange(time := 1, timeout := 30, x1 := 0, y1 := 0, x2 := 0, y2 := 0) { + oldhash := "", time := this.Floor(time) + , timeout := A_TickCount + Round(this.Floor(timeout) * 1000) + loop { + hash := this.GetPicHash(x1, y1, x2, y2, 1), t := A_TickCount + if (hash != oldhash) + oldhash := hash, timeout2 := t + Round(time * 1000) + if (t >= timeout2) + return 1 + if (t >= timeout) + return 0 + Sleep 100 + } + } + GetPicHash(x1 := 0, y1 := 0, x2 := 0, y2 := 0, ScreenShot := 1) { + static init := DllCall("LoadLibrary", "Str", "ntdll", "Ptr") + x1 := this.Floor(x1), y1 := this.Floor(y1), x2 := this.Floor(x2), y2 := this.Floor(y2) + if (x1 = 0 && y1 = 0 && x2 = 0 && y2 = 0) + n := 150000, x := y := -n, w := h := 2 * n + else + x := Min(x1, x2), y := Min(y1, y2), w := Abs(x2 - x1) + 1, h := Abs(y2 - y1) + 1 + bits := this.GetBitsFromScreen(&x, &y, &w, &h, ScreenShot, &zx, &zy), x -= zx, y -= zy + if (w < 1 || h < 1 || !bits.Scan0) + return 0 + hash := 0, Stride := bits.Stride, p := bits.Scan0 + (y - 1) * Stride + x * 4, w *= 4 + ListLines (lls := A_ListLines) ? 0 : 0 + loop h + hash := (hash * 31 + DllCall("ntdll\RtlComputeCrc32", "uint", 0 + , "Ptr", p += Stride, "uint", w, "uint")) & 0xFFFFFFFF + ListLines lls + return hash + } + WindowToScreen(&x, &y, x1, y1, id := "") { + if (!id) + id := WinGetID("A") + rect := Buffer(16, 0) + , DllCall("GetWindowRect", "Ptr", id, "Ptr", rect) + , x := x1 + NumGet(rect, "int"), y := y1 + NumGet(rect, 4, "int") + } + ScreenToWindow(&x, &y, x1, y1, id := "") { + this.WindowToScreen(&dx, &dy, 0, 0, id), x := x1 - dx, y := y1 - dy + } + ClientToScreen(&x, &y, x1, y1, id := "") { + if (!id) + id := WinGetID("A") + pt := Buffer(8, 0), NumPut("int64", 0, pt) + , DllCall("ClientToScreen", "Ptr", id, "Ptr", pt) + , x := x1 + NumGet(pt, "int"), y := y1 + NumGet(pt, 4, "int") + } + ScreenToClient(&x, &y, x1, y1, id := "") { + this.ClientToScreen(&dx, &dy, 0, 0, id), x := x1 - dx, y := y1 - dy + } + ; 不像 FindText 总是使用屏幕坐标,它使用与内置命令 + ; PixelGetColor 一样的 CoordMode 设置的坐标模式 + PixelGetColor(x, y, ScreenShot := 1, id := "") { + if (A_CoordModePixel = "Window") + this.WindowToScreen(&x, &y, x, y, id) + else if (A_CoordModePixel = "Client") + this.ClientToScreen(&x, &y, x, y, id) + if (ScreenShot) + this.ScreenShot(x, y, x, y) + return this.GetColor(x, y) + } + ; 不像 FindText 总是使用屏幕坐标,它使用与内置命令 + ; ImageSearch 一样的 CoordMode 设置的坐标模式 + ; 图片文件参数可以使用 "*n *TransBlack/White/RRGGBB-DRDGDB... d:\a.bmp" + ImageSearch(&rx := "", &ry := "", x1 := 0, y1 := 0, x2 := 0, y2 := 0 + , ImageFile := "", ScreenShot := 1, FindAll := 0, dir := 1) { + dx := dy := 0 + if (A_CoordModePixel = "Window") + this.WindowToScreen(&dx, &dy, 0, 0) + else if (A_CoordModePixel = "Client") + this.ClientToScreen(&dx, &dy, 0, 0) + text := "" + loop parse, ImageFile, "|" + if (v := Trim(A_LoopField)) != "" { + text .= InStr(v, "$") ? "|" v : "|##" + . (RegExMatch(v, "(^|\s)\*(\d+)\s", &r) + ? Format("{:06X}", r[2] << 16 | r[2] << 8 | r[2]) : "000000") + . (RegExMatch(v, "i)(^|\s)\*Trans(\S+)\s", &r) ? "/" Trim(r[2], "/") : "") + . "$" Trim(RegExReplace(v, "(^|\s)\*\S+")) + } + x1 := this.Floor(x1), y1 := this.Floor(y1), x2 := this.Floor(x2), y2 := this.Floor(y2) + if (x1 = 0 && y1 = 0 && x2 = 0 && y2 = 0) + n := 150000, x1 := y1 := -n, x2 := y2 := n + if (ok := this.FindText(, , x1 + dx, y1 + dy, x2 + dx, y2 + dy + , 0, 0, text, ScreenShot, FindAll, , , , dir)) { + for k, v in ok ; you can use ok:=FindText().ok + v.1 -= dx, v.2 -= dy, v.x -= dx, v.y -= dy + rx := ok[1].1, ry := ok[1].2 + return ok + } + else { + rx := ry := "" + return 0 + } + } + ; 不像 FindText 总是使用屏幕坐标,它使用与内置命令 + ; PixelSearch 一样的 CoordMode 设置的坐标模式 + ; 颜色参数可以是 "RRGGBB-DRDGDB|RRGGBB-DRDGDB", Variation 取值 0-255 + PixelSearch(&rx := "", &ry := "", x1 := 0, y1 := 0, x2 := 0, y2 := 0 + , ColorID := "", Variation := 0, ScreenShot := 1, FindAll := 0, dir := 1) { + n := this.Floor(Variation), text := Format("##{:06X}$0/0/", n << 16 | n << 8 | n) + . Trim(StrReplace(ColorID, "|", "/"), "- /") + return this.ImageSearch(&rx, &ry, x1, y1, x2, y2, text, ScreenShot, FindAll, dir) + } + ; 屏幕坐标指示的范围内的某些颜色的像素计数 + ; 颜色参数可以是 "RRGGBB-DRDGDB|RRGGBB-DRDGDB", Variation 取值 0-255 + PixelCount(x1 := 0, y1 := 0, x2 := 0, y2 := 0, ColorID := "", Variation := 0, ScreenShot := 1) { + x1 := this.Floor(x1), y1 := this.Floor(y1), x2 := this.Floor(x2), y2 := this.Floor(y2) + if (x1 = 0 && y1 = 0 && x2 = 0 && y2 = 0) + n := 150000, x := y := -n, w := h := 2 * n + else + x := Min(x1, x2), y := Min(y1, y2), w := Abs(x2 - x1) + 1, h := Abs(y2 - y1) + 1 + bits := this.GetBitsFromScreen(&x, &y, &w, &h, ScreenShot, &zx, &zy), x -= zx, y -= zy + sum := 0, s1 := Buffer(4), s0 := Buffer(4), ss := Buffer(w * (h + 3)) + ini := { bits: bits, ss: ss.Ptr, s1: s1.Ptr, s0: s0.Ptr, allpos: 0, allpos_max: 0, err1: 0, err0: 0, zoomW: 1, zoomH: 1 } + n := this.Floor(Variation), text := Format("##{:06X}$0/0/", n << 16 | n << 8 | n) + . Trim(StrReplace(ColorID, "|", "/"), "- /") + if IsObject(j := this.PicInfo(text)) + sum := this.PicFind(ini, j, 1, x, y, w, h) + return sum + } + ; 创建包含特定颜色的色块,可以限定这个色块中符合颜色的数量 + ; ColorID 可以使用 "RRGGBB-DRDGDB|RRGGBB-DRDGDB", "*128", "**50" + ; Count1, Count0 是这个色块二值化后黑点和白点的数量最小值 + ColorBlock(ColorID, w, h, Count1 := 0, Count0 := 0) { + (Count0 > 0 && Count1 := 0) + Text := "|<>[" (1 - Count1 / (w * h)) "," (1 - Count0 / (w * h)) "]" + . Trim(StrReplace(ColorID, "|", "/"), "- /") . Format("${:d}.", w) + . this.bit2base64(StrReplace(Format(Format("{{}:0{:d}d{}}", w * h), 0), "0" + , (Count0 > 0 ? "0" : "1"))) + return Text + } + Click(x := "", y := "", other1 := "", other2 := "", GoBack := 0) { + CoordMode "Mouse", (bak := A_CoordModeMouse) ? "Screen" : "Screen" + if GoBack + MouseGetPos &oldx, &oldy + MouseMove x, y, 0 + Sleep 30 + Click x "," y "," other1 "," other2 + if GoBack + MouseMove oldx, oldy, 0 + CoordMode "Mouse", bak + return 1 + } + ; 动态运行AHK代码作为新线程 + class Thread { + __New(args*) { + this.pid := this.Exec(args*) + } + __Delete() { + ProcessClose this.pid + } + Exec(s, Ahk := "", args := "") ; required AHK v1.1.34+ and Ahk2Exe Use .exe + { + Ahk := Ahk ? Ahk : A_IsCompiled ? A_ScriptFullPath : A_AhkPath + s := "`nDllCall(`"SetWindowText`",`"Ptr`",A_ScriptHwnd,`"Str`",`"`")`n" + . "`n`n" . s, s := RegExReplace(s, "\R", "`r`n") + try + { + shell := ComObject("WScript.Shell") + oExec := shell.Exec("`"" Ahk "`" /script /force /CP0 * " args) + oExec.StdIn.Write(s) + oExec.StdIn.Close(), pid := oExec.ProcessID + } + catch { + f := A_Temp "\~ahk.tmp" + s := "`r`nTry FileDelete `"" f "`"`r`n" s + try FileDelete f + FileAppend s, f + r := this.Clear.Bind(this) + SetTimer r, -3000 + Run "`"" Ahk "`" /script /force /CP0 `"" f "`" " args, , , &pid + } + return pid + } + Clear() { + try FileDelete A_Temp "\~ahk.tmp" + SetTimer(, 0) + } + } + ; FindText().QPC() 用法类似于 A_TickCount + QPC() { + static f := 0, c := DllCall("QueryPerformanceFrequency", "Int64*", &f) + (f /= 1000) + return (!DllCall("QueryPerformanceCounter", "Int64*", &c)) * 0 + (c / f) + } + ; FindText().ToolTip() 用法类似于 ToolTip + ToolTip(s := "", x := "", y := "", num := 1, arg := "") { + static ini := Map(), tip := Map(), timer := Map() + f := "ToolTip_" . this.Floor(num) + if (s = "") { + try tip[f].Destroy() + ini[f] := "", tip[f] := "" + return + } + ;----------------- + r1 := A_CoordModeToolTip + r2 := A_CoordModeMouse + CoordMode "Mouse", "Screen" + MouseGetPos &x1, &y1 + CoordMode "Mouse", r1 + MouseGetPos &x2, &y2 + CoordMode "Mouse", r2 + (x != "" && x := "x" (this.Floor(x) + x1 - x2)) + , (y != "" && y := "y" (this.Floor(y) + y1 - y2)) + , (x = "" && y = "" && x := "x" (x1 + 16) " y" (y1 + 16)) + ;----------------- + (!IsObject(arg) && arg := {} + ) + bgcolor := arg.HasOwnProp("bgcolor") ? arg.bgcolor : "FAFBFC" + color := arg.HasOwnProp("color") ? arg.color : "Black" + font := arg.HasOwnProp("font") ? arg.font : "Consolas" + size := arg.HasOwnProp("size") ? arg.size : "10" + bold := arg.HasOwnProp("bold") ? arg.bold : "" + trans := arg.HasOwnProp("trans") ? arg.trans & 255 : 255 + timeout := arg.HasOwnProp("timeout") ? arg.timeout : "" + ;----------------- + r := bgcolor "|" color "|" font "|" size "|" bold "|" trans "|" s + if (!ini.Has(f) || ini[f] != r) { + ini[f] := r + try tip[f].Destroy() + tip[f] := _Gui := Gui() ; WS_EX_LAYERED:=0x80000, WS_EX_TRANSPARENT:=0x20 + _Gui.Opt("+LastFound +AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x80020") + _Gui.MarginX := 2, _Gui.MarginY := 2 + _Gui.BackColor := bgcolor + _Gui.SetFont("c" color " s" size " " bold, font) + _Gui.Add("Text", , s) + _Gui.Title := f + _Gui.Show("Hide") + WinSetTransparent(trans) + } + tip[f].Opt("+AlwaysOnTop") + tip[f].Show("NA " x " " y) + if (timeout) { + (!timer.Has(f) && timer[f] := this.ToolTip.Bind(this, "", "", "", num)) + SetTimer timer[f], -Round(Abs(this.Floor(timeout) * 1000)) - 1 + } + } + ; FindText().ObjView() 查看对象的值用于调试 + ObjView(obj, keyname := "") { + if IsObject(obj) { + s := "" + for k, v in (HasMethod(obj, "__Enum") ? obj : obj.OwnProps()) + s .= this.ObjView(v, keyname "[" ((k is Integer) ? k : "`"" k "`"") "]") } else - { - c:=this.Floor("0x" n), dR:=(c>>16)&0xFF, dG:=(c>>8)&0xFF, dB:=c&0xFF - if v:=(Abs(r)<=dR && Abs(g)<=dG && Abs(b)<=dB) - Break + s := keyname ": " ((obj is Number) ? obj : "`"" obj "`"") "`n" + if (keyname != "") + return s + ;------------------ + _Gui := Gui("+AlwaysOnTop") + _Gui.Add("Button", "y270 w350 Default", "OK").OnEvent("Click", (*) => WinHide()) + _Gui.Add("Edit", "xp y10 w350 h250 -Wrap -WantReturn") + _Gui["Edit1"].Value := s + _Gui.Title := "Debug view object values" + _Gui.Show() + DetectHiddenWindows 0 + WinWaitClose "ahk_id " _Gui.Hwnd + _Gui.Destroy() + } + EditScroll(hEdit, regex := "", line := 0, pos := 0) { + s := ControlGetText(hEdit) + pos := (regex != "") ? InStr(SubStr(s, 1, s ~= regex) " ", "`n", 0, -1) + : (line > 1) ? InStr(s, "`n", 0, 1, line - 1) : pos + SendMessage 0xB1, pos, pos, hEdit + SendMessage 0xB7, , , hEdit + } + LastCtrl() { + for Ctrl in GuiFromHwnd(WinExist()) + last := Ctrl + return last + } + Hide(args*) { + WinMinimize + WinHide + ToolTip + DetectHiddenWindows 0 + WinWaitClose "ahk_id " WinExist() + } + SC(RGB, hwnd) { + SendMessage 0x2001, 0, (RGB & 0xFF) << 16 | RGB & 0xFF00 | (RGB >> 16) & 0xFF, hwnd + } + ;==== Optional GUI interface ==== + Gui(cmd, arg1 := "", args*) { + static + local cri, lls, _Gui + ListLines InStr("MouseMove|ToolTipOff", cmd) ? 0 : A_ListLines + static init := 0 + if (!init && init := 1) { + SavePicDir := A_Temp "\Ahk_ScreenShot\" + G_ := this.Gui.Bind(this) + G_G := this.Gui.Bind(this, "G") + G_Run := this.Gui.Bind(this, "Run") + G_Show := this.Gui.Bind(this, "Show") + G_KeyDown := this.Gui.Bind(this, "KeyDown") + G_LButtonDown := this.Gui.Bind(this, "LButtonDown") + G_RButtonDown := this.Gui.Bind(this, "RButtonDown") + G_MouseMove := this.Gui.Bind(this, "MouseMove") + G_ScreenShot := this.Gui.Bind(this, "ScreenShot") + G_ShowPic := this.Gui.Bind(this, "ShowPic") + G_Slider := this.Gui.Bind(this, "Slider") + G_ToolTip := this.Gui.Bind(this, "ToolTip") + G_ToolTipOff := this.Gui.Bind(this, "ToolTipOff") + G_SaveScr := this.Gui.Bind(this, "SaveScr") + G_PicShowOK := this.Gui.Bind(this, "PicShowOK") + G_Drag := this.Gui.Bind(this, "Drag") + FindText_Capture := FindText_Main := "" + PrevControl := x := y := oldx := oldy := "" + Pics := Map(), hBM_old := dx := dy := 0 + cri := A_IsCritical + Critical + Lang := this.Lang(, 1), Tip_Text := this.Lang(, 2) + G_.Call("MakeCaptureWindow") + G_.Call("MakeMainWindow") + OnMessage(0x100, G_KeyDown) + OnMessage(0x201, G_LButtonDown) + OnMessage(0x204, G_RButtonDown) + OnMessage(0x200, G_MouseMove) + MenuTray := A_TrayMenu + MenuTray.Add + MenuTray.Add Lang["s1"], G_Show + if (!A_IsCompiled && A_LineFile = A_ScriptFullPath) { + MenuTray.Default := Lang["s1"] + MenuTray.ClickCount := 1 + TraySetIcon "Shell32.dll", 23 + } + Critical cri + Gui("+LastFound").Destroy() } - } - ascii[k]:=v, (show[k] && i:=(v?i+1:i-1)) - } - bg:=(i>0 ? "1":"0"), G_.Call("BlackWhite") - ListLines lls - return - Case "ColorPos2Two": - _Gui:=FindText_Capture - c:=_Gui["SelColor"].Value - if (c="") - { - _Gui.Opt("+OwnDialogs") - MsgBox Lang["s12"], "Tip", "4096 T1" - return - } - n:=_Gui["Similar2"].Value, n:=Round(n/100,2), color:="#" c "-" n - , n:=(n<=0||n>1?0:Floor(9*255*255*(1-n)*(1-n))) - , rr:=(c>>16)&0xFF, gg:=(c>>8)&0xFF, bb:=c&0xFF, k:=i:=0 - ListLines (lls:=A_ListLines)?0:0 - Loop nW*nH - c:=cors[++k], r:=((c>>16)&0xFF)-rr, g:=((c>>8)&0xFF)-gg, b:=(c&0xFF)-bb - , ascii[k]:=v:=3*r*r+4*g*g+2*b*b<=n, (show[k] && i:=(v?i+1:i-1)) - bg:=(i>0 ? "1":"0"), G_.Call("BlackWhite") - ListLines lls - return - Case "BlackWhite": - Loop 25 + 0*(ty:=dy-1)*(k:=0) - Loop 71 + 0*(tx:=dx-1)*(ty++) - if (k++)*0 + (++tx)