From b8046b2df6e309f8c2d9ed7bb0f64f3151e5ea43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E4=B8=80=E4=B8=80?= <1204244136@qq.com> Date: Thu, 1 May 2025 01:19:01 +0800 Subject: [PATCH 01/40] =?UTF-8?q?build:=20=E9=9B=86=E6=88=90FindText?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/FindText.ahk | 3649 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3649 insertions(+) create mode 100644 lib/FindText.ahk diff --git a/lib/FindText.ahk b/lib/FindText.ahk new file mode 100644 index 0000000..99ad688 --- /dev/null +++ b/lib/FindText.ahk @@ -0,0 +1,3649 @@ +;/* +;=========================================== +; FindText - 屏幕抓字生成字库工具与找字函数 +; https://www.autohotkey.com/boards/viewtopic.php?f=83&t=116471 +; +; 脚本作者 : FeiYue +; 最新版本 : 10.0 +; 更新时间 : 2024-10-06 +; +; 用法: (需要最新版本 AHK v2.0.2+) +; 1. 将本脚本保存为“FindText.ahk”并复制到AHK执行程序的Lib子目录中(手动建立目录) +; 2. 抓图并生成调用FindText()的代码 +; 2.1 方式一:直接点击“抓图”按钮 +; 2.2 方式二:先设定截屏热键,使用热键截屏,再点击“截屏抓图”按钮 +; 3. 测试一下调用的代码是否成功:直接点击“测试”按钮 +; 4. 复制调用的代码到自己的脚本中 +; 4.1 方式一:打勾“附加FindText()函数”的选框,然后点击“复制”按钮(不推荐) +; 4.2 方式二:取消“附加FindText()函数”的选框,然后点击“复制”按钮, +; 然后粘贴到自己的脚本中,然后在自己的脚本开头加上一行: +; #Include ; Lib目录中必须有FindText.ahk +; 5. 多色查找模式可以一定程度上适应图像的放大缩小,常用于游戏中找图 +; 6. 这个库还可以用于快速截屏、获取颜色、写入颜色、编辑后另存图片 +; 7. 如果要调用FindTextClass类中的函数,请用无参数的FindText()获取类实例对象 +; +;=========================================== +;*/ + + +if (!A_IsCompiled && A_LineFile=A_ScriptFullPath) + FindText().Gui("Show") + + +;===== 复制下面的函数和类到你的代码中仅仅一次 ===== + + +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 " +( +;-------------------------------- +; FindText - 屏幕找字函数 +; 版本 : 10.0 (2024-10-06) +;-------------------------------- +; 返回变量:=FindText( +; &OutputX --> 保存返回的X坐标的变量名称 +; , &OutputY --> 保存返回的Y坐标的变量名称 +; , X1 --> 查找范围的左上角X坐标 +; , Y1 --> 查找范围的左上角Y坐标 +; , X2 --> 查找范围的右下角X坐标 +; , Y2 --> 查找范围的右下角Y坐标 +; , err1 --> 文字的黑点容错百分率(0.1=10%) +; , err0 --> 背景的白点容错百分率(0.1=10%) +; 设置 err1<0 或 err0<0 可以打开左右膨胀算法 +; 忽略文字线条的轻微错位,此时容错值应该非常小 +; 在找图模式中,err0 可以设置要跳过的行列数,加快速度 +; , Text --> 由工具生成的查找图像的数据,可以一次查找多个,用“|”分隔 +; , ScreenShot --> 是否截屏,为0则使用上一次的截屏数据 +; , FindAll --> 是否搜索所有位置,为0则找到一个位置就返回 +; , JoinText --> 如果想组合查找,可以为1,或者是要查找单词的数组 +; , offsetX --> 组合图像的每个字和前一个字的最大横向间隔 +; , offsetY --> 组合图像的每个字和前一个字的最大高低间隔 +; , dir --> 查找的方向,有上、下、左、右、中心9种 +; 默认 dir=0,这种返回的结果将按最小误差排序, +; 即使设置了较大的容错,第一个结果也是误差最小的 +; , zoomW --> 图像宽度的缩放百分率(1.0=100%) +; , zoomH --> 图像高度的缩放百分率(1.0=100%) +; ) +; +; 返回变量 --> 如果没找到结果会返回0。否则返回一个二级数组, +; 第一级是每个结果对象,第二级是结果对象的具体信息对象: +; { 1:左上角X, 2:左上角Y, 3:图像宽度W, 4:图像高度H +; , x:中心点X, y:中心点Y, id:图像识别文本 } +; 所有坐标都是相对于屏幕,颜色使用RGB格式 +; 所有 RRGGBB 可以使用 Black、White、Red、Green、Blue 代替, +; 所有 DRDGDB 可以使用相似度 1.0(100%) 代替,它是浮点数 +; +; 如果 OutputX 等于 'wait' 或 'wait1' 意味着等待图像出现, +; 如果 OutputX 等于 'wait0' 意味着等待图像消失 +; 此时 OutputY 设置等待时间的秒数,如果小于0则无限等待 +; 如果超时则返回0,意味着失败,如果等待图像出现成功,则返回位置数组 +; 如果等待图像消失成功,则返回 1 +; 例1: FindText(&X:='wait', &Y:=3, 0,0,0,0,0,0,Text) ; 等待3秒等图像出现 +; 例2: FindText(&X:='wait0', &Y:=-1, 0,0,0,0,0,0,Text) ; 无限等待等图像消失 +; +; : 找色 是仅有一个点的 多点找色 +; Text:='|<>##DRDGDB $ 0/0/RRGGBB1-DRDGDB1/RRGGBB2, xn/yn/-RRGGBB3/RRGGBB4, ...' +; '##'之后的颜色 (0xDRDGDB) 是所有颜色的默认偏色(各个分量允许的变化值) +; 初始点 (0,0) 匹配 0xRRGGBB1(+/-0xDRDGDB1) 或者 0xRRGGBB2(+/-0xDRDGDB), +; 点 (xn,yn) 匹配 排除 0xRRGGBB3(+/-0xDRDGDB) 和排除 0xRRGGBB4(+/-0xDRDGDB) +; 点坐标后面以 '-' 开头表示要排除后面的所有颜色,其他颜色都匹配 +; 每个点最多允许匹配10组颜色 (xn/yn/RRGGBB1/.../RRGGBB10) +; +; : 类似于 FindMultiColor,仅是把具体颜色替换为 +; 这一点的颜色是否与第一点的颜色是否相似 +; Text:='|<>##DRDGDB $ 0/0/1, x1/y1/0, x2/y2/1, xn/yn/0, ...' +; +; : Text 参数需要手动输入 +; Text:='|<>##DRDGDB/RRGGBB1-DRDGDB1/RRGGBB2... $ d:\a.bmp' +; '##'之后的颜色 (0xDRDGDB) 是所有颜色的默认偏色(各个分量允许的变化值) +; 这个 0xRRGGBB1(+/-0xDRDGDB1) 和 0xRRGGBB2(+/-0xDRDGDB)... 都是透明色 +; +;-------------------------------- +)" +} + +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 (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 " +( + +//***** C source code of machine code ***** +// gcc.exe -m32/-m64 -O2 + +int __attribute__((__stdcall__)) PicFind( + int mode, unsigned int c, unsigned int n, int dir + , unsigned char * Bmp, int Stride + , int sx, int sy, int sw, int sh + , unsigned char * ss, unsigned int * s1, unsigned int * s0 + , unsigned char * text, int w, int h + , int err1, int err0, int more_err + , unsigned int * allpos, int allpos_max + , int new_w, int new_h ) +{ + int ok, o, i, j, k, v, e1, e0, len1, len0, max, pic, shape, sort; + int x, y, x1, y1, x2, y2, x3, y3, r, g, b, rr, gg, bb, dR, dG, dB; + int ii, jj, RunDir, DirCount, RunCount, AllCount1, AllCount2; + unsigned int c1, c2, *cors, *arr; + unsigned char *ts, *gs; + ok=0; o=0; v=0; len1=0; len0=0; ts=ss+sw; gs=ss+sw*3; + arr=allpos+allpos_max; sort=(dir==0); + //---------------------- + if (mode==5) + { + if (pic=(c==2)) // FindPic + { + cors=(unsigned int *)(text+w*h*4); j=(err0>>10)+1; n*=2; + for (y=0; y>16)&0xFF)-rr; g=((c1>>8)&0xFF)-gg; b=(c1&0xFF)-bb; + v=(c2<0x1000000) ? (3*r*r+4*g*g+2*b*b<=c2) + : (r*r<=((c2>>16)&0xFF)*((c2>>16)&0xFF) + && g*g<=((c2>>8)&0xFF)*((c2>>8)&0xFF) && b*b<=(c2&0xFF)*(c2&0xFF)); + if (v) goto NoMatch1; + } + s1[len1]=(y*new_h/h)*Stride+(x*new_w/w)*4; + s0[len1++]=rr<<16|gg<<8|bb; + NoMatch1:; + } + } + c2=cors[1]; r=(c2>>16)&0xFF; g=(c2>>8)&0xFF; b=c2&0xFF; dR=r*r; dG=g*g; dB=b*b; + } + else // FindMultiColor or FindColor + { + shape=(c==1); // FindShape + cors=(unsigned int *)text; + for (i=0; i>16; x=c&0xFFFF; + s1[len1]=(y*new_h/h)*Stride+(x*new_w/w)*4; + s0[len1++]=o+cors[o+1]*2; + } + cors+=2; + } + goto StartLookUp; + } + //---------------------- + // Generate Lookup Table + for (y=0; y>16; x=c&0xFFFF; + c=(y*new_h/h)*Stride+(x*new_w/w)*4; + goto StartLookUp; + } + //---------------------- + // Generate Two Value Image + o=sy*Stride+sx*4; j=Stride-sw*4; i=0; + if (mode==1) // Color Mode + { + cors=(unsigned int *)(text+w*h); n*=2; + for (y=0; y>16)&0xFF)-rr; g=((c1>>8)&0xFF)-gg; b=(c1&0xFF)-bb; + v=(c2<0x1000000) ? (3*r*r+4*g*g+2*b*b<=c2) + : (r*r<=((c2>>16)&0xFF)*((c2>>16)&0xFF) + && g*g<=((c2>>8)&0xFF)*((c2>>8)&0xFF) && b*b<=(c2&0xFF)*(c2&0xFF)); + if (v) break; + } + ts[i]=(v) ? 1:0; + } + } + } + else if (mode==2) // Gray Threshold Mode + { + c=(c+1)<<7; + for (y=0; y>7; + } + for (i=0, y=0; yn || gs[i+1]>n + || gs[i-sw]>n || gs[i+sw]>n + || gs[i-sw-1]>n || gs[i-sw+1]>n + || gs[i+sw-1]>n || gs[i+sw+1]>n) ? 1:0; + } + } + //---------------------- + StartLookUp: + for (i=0, y=0; y=4) { ss[i]=4; continue; } + r=ts[i]; g=(x==0 ? 3 : ts[i-1]); b=(x==sw-1 ? 3 : ts[i+1]); + if (more_err) + ss[i]=4|(r==2||r==1||g==1||b==1)<<1|(r==2||r==0||g==0||b==0); + else + ss[i]=4|(r==2||r==1)<<1|(r==2||r==0); + } + } + if (mode<4 && more_err) sx++; + err1=(len1*err1)>>10; + err0=(len0*err0)>>10; + if (err1>=len1) len1=0; + if (err0>=len0) len0=0; + max=(len1>len0) ? len1 : len0; + w=new_w; h=new_h; x1=0; y1=0; x2=sw-w; y2=sh-h; + // 1 ==> ( Left to Right ) Top to Bottom + // 2 ==> ( Right to Left ) Top to Bottom + // 3 ==> ( Left to Right ) Bottom to Top + // 4 ==> ( Right to Left ) Bottom to Top + // 5 ==> ( Top to Bottom ) Left to Right + // 6 ==> ( Bottom to Top ) Left to Right + // 7 ==> ( Top to Bottom ) Right to Left + // 8 ==> ( Bottom to Top ) Right to Left + // 9 ==> Center to Four Sides + if (dir==9) + { + x=(x1+x2)/2; y=(y1+y2)/2; i=x2-x1+1; j=y2-y1+1; + AllCount1=i*j; i=(i>j?i:j)+8; + AllCount2=i*i; RunCount=0; DirCount=1; RunDir=0; + for (ii=0; RunCount=x1 && x<=x2 && y>=y1 && y<=y2) + { + RunCount++; + goto FindPos; + FindPos_GoBak:; + } + if (RunDir==0) y--; + else if (RunDir==1) x++; + else if (RunDir==2) y++; + else x--; + } + if (RunDir & 1) DirCount++; + RunDir = (++RunDir) & 3; + } + goto Return1; + } + if (dir<1 || dir>8) dir=1; + if (--dir>3) { r=y1; y1=x1; x1=r; r=y2; y2=x2; x2=r; } + for (y3=y1; y3<=y2; y3++) + { + for (x3=x1; x3<=x2; x3++) + { + y=(dir & 2) ? y1+y2-y3 : y3; + x=(dir & 1) ? x1+x2-x3 : x3; + if (dir>3) { r=y; y=x; x=r; } + //---------------------- + FindPos: + e1=err1; e0=err0; o=y*sw+x; + if (ss[o]<4) goto NoMatch; + if (mode<4) + { + for (i=0; i>16)&0xFF); + g=Bmp[1+j]-((c>>8)&0xFF); b=Bmp[j]-(c&0xFF); + v=(c2<0x1000000)?(3*r*r+4*g*g+2*b*b>c2):(r*r>dR||g*g>dG||b*b>dB); + if (v && (--e1)<0) goto NoMatch; + } + } + else + { + for (i=0; i0xFFFFFF, n=s0[i]; j>16)&0xFF)-rr; g=((c1>>8)&0xFF)-gg; b=(c1&0xFF)-bb; + v=(c2<0x1000000) ? (3*r*r+4*g*g+2*b*b<=c2) + : (r*r<=((c2>>16)&0xFF)*((c2>>16)&0xFF) + && g*g<=((c2>>8)&0xFF)*((c2>>8)&0xFF) && b*b<=(c2&0xFF)*(c2&0xFF)); + if (v) { if (k) goto NoMatch2; goto MatchOK; } + } + if (k) goto MatchOK; + NoMatch2: + if ((--e1)<0) goto NoMatch; + MatchOK:; + } + } + } + else // mode==4 + { + o=(sy+y)*Stride+(sx+x)*4; j=o+c; rr=Bmp[2+j]; gg=Bmp[1+j]; bb=Bmp[j]; + for (i=0; in && (--e1)<0) goto NoMatch; + } + if (i=allpos_max) goto Return1; + } + // Skip areas that may overlap + if (!sort) + { + r=y-h+1; if (r<0) r=0; rr=y+h-1; if (rr>sh-h) rr=sh-h; + g=x-w+1; if (g<0) g=0; gg=x+w-1; if (gg>sw-w) gg=sw-w; + for (i=r; i<=rr; i++) + for (j=g; j<=gg; j++) + ss[i*sw+j] &= 3; + } + NoMatch: + if (dir==9) goto FindPos_GoBak; + } + } + //---------------------- + Return1: + if (!sort || !allpos || w*h==1) + return ok; + // Sort by smallest error + for (i=1; i=0 && arr[j]>k; j--) + { + arr[j+1]=arr[j]; allpos[j+1]=allpos[j]; + } + arr[j+1]=k; allpos[j+1]=v; + } + // Clean up overlapping results + w*=w; h*=h; k=ok; ok=0; + for (i=0; i>16; + for (j=0; j>16)-y1; + if (x*x + 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] +} + +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, ".") + { + 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 + } + 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 + } + } + 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) StrLen(StrReplace(txt,"1")) ? "1":"0" + s:="", i:=0, k:=nW*nH+1+CutLeft + Loop w:=nW-CutLeft-CutRight + { + i++ + if (!show[k++] && A_Index" color "$" v "`"`n" + Comment:=SubStr(Comment, 2) + } + } + Event:=cmd, Result:=s + _Gui.Hide() + return + } + if (!MultiColor) + txt:=Format("{:d}.",InStr(txt,"`n")-1) . this.bit2base64(txt) + else + { + n:=_Gui["Similar3"].Value, n:=Round(n/100,2), color:="##" n + , n:=(n<=0||n>1?0:Floor(9*255*255*(1-n)*(1-n))) + , arr:=StrSplit(Trim(StrReplace(Result,",","/"),"/"),"/"), s:="", i:=1 + Loop arr.Length//3 + x1:=arr[i++], y1:=arr[i++], c1:=arr[i++], c:="0x" c1 + , (A_Index=1 && (x:=x1, y:=y1, rr:=(c>>16)&0xFF, gg:=(c>>8)&0xFF, bb:=c&0xFF)) + , r:=((c>>16)&0xFF)-rr, g:=((c>>8)&0xFF)-gg, b:=(c&0xFF)-bb + , s.="," (x1-x) "/" (y1-y) "/" (FindShape?3*r*r+4*g*g+2*b*b<=n:c1) + txt:=SubStr(s,2) + } + s:="`nText.=`"|<" Comment ">" color "$" txt "`"`n" + if (cmd="SplitAdd" || cmd="AllAdd") + { + Event:=cmd, Result:=s + _Gui.Hide() + return + } + x:=nX+CutLeft+(nW-CutLeft-CutRight)//2 + y:=nY+CutUp+(nH-CutUp-CutDown)//2 + s:=StrReplace(s, "Text.=", "Text:="), r:=StrSplit(Lang["s8"] "|||||||", "|") + s:="`; #Include `n" + . "`nt1:=A_TickCount, Text:=X:=Y:=`"`"`n" s + . "`nif (ok:=FindText(&X, &Y, " x "-150000, " + . y "-150000, " x "+150000, " y "+150000, 0, 0, Text))" + . "`n{" + . "`n `; FindText()." . "Click(" . "X, Y, `"L`")" + . "`n}`n" + . "`n`; ok:=FindText(&X:=`"wait`", &Y:=3, 0,0,0,0,0,0,Text) `; " r[7] + . "`n`; ok:=FindText(&X:=`"wait0`", &Y:=-1, 0,0,0,0,0,0,Text) `; " r[8] + . "`n`nMsgBox `"" r[1] ":``t`" (IsObject(ok)?ok.Length:ok)" + . "`n . `"``n``n" r[2] ":``t`" (A_TickCount-t1) `" " r[3] "`"" + . "`n . `"``n``n" r[4] ":``t`" X `", `" Y" + . "`n . `"``n``n" r[5] ":``t<`" (IsObject(ok)?ok[1].id:`"`") `">`", `"Tip`", 4096`n" + . "`nTry For i,v in ok `; ok " r[6] " ok:=FindText().ok" + . "`n if (i<=2)" + . "`n FindText().MouseTip(ok[i].x, ok[i].y)`n" + Event:=cmd, Result:=s + _Gui.Hide() + return + Case "SavePic2": + x:=nX+CutLeft, w:=nW-CutLeft-CutRight + y:=nY+CutUp, h:=nH-CutUp-CutDown + G_.Call("ScreenShot", x "|" y "|" (x+w-1) "|" (y+h-1) "|0") + return + Case "ShowPic": + i:=EditGetCurrentLine(hscr) + s:=EditGetLine(i, hscr) + FindText_Main["MyPic"].Value:=Trim(this.ASCII(s),"`n") + return + Case "KeyDown": + Critical + _Gui:=FindText_Main + if (WinExist()!=_Gui.Hwnd) + return + Try ctrl:="", ctrl:=args[3] + if (ctrl=hscr) + SetTimer G_ShowPic, -150 + else if (ctrl=_Gui["ClipText"].Hwnd) + { + s:=_Gui["ClipText"].Value + _Gui["MyPic"].Value:=Trim(this.ASCII(s),"`n") + } + return + Case "LButtonDown": + Critical + if (WinExist()!=FindText_Capture.Hwnd) + return G_.Call("KeyDown", arg1, args*) + CoordMode "Mouse" + MouseGetPos &k1, &k2,, &k6, 2 + if (k6=hPic) + { + ListLines (lls:=A_ListLines)?0:0 + Loop + { + Sleep 50 + MouseGetPos &k3, &k4 + this.RangeTip(Min(k1,k3), Min(k2,k4) + , Abs(k1-k3)+1, Abs(k2-k4)+1, (A_MSec<500 ? "Red":"Blue")) + } + Until !this.State("LButton") + ListLines lls + this.RangeTip() + this.GetBitsFromScreen(,,,,0,&zx,&zy) + this.ClientToScreen(&sx, &sy, 0, 0, hPic) + sx:=Min(k1,k3)-sx+hBM_x+zx, sy:=Min(k2,k4)-sy+hBM_y+zy + , sw:=Abs(k1-k3)+1, sh:=Abs(k2-k4)+1 + if (sw+sh)<5 + sx-=71//2, sy-=25//2, sw:=71, sh:=25 + G_.Call("CaptureUpdate") + FindText_Capture["MyTab1"].Choose(1) + return + } + if !(Cid_.Has(k6) && k5:=Cid_[k6]) + return + if (k5=-1) + { + MouseMove k1+2, k2+2, 0 + MouseGetPos(,,, &k6, 2) + MouseMove k1, k2, 0 + if !(Cid_.Has(k6) && k5:=Cid_[k6]) || (k5=-1) + return + } + if (k5>71*25) + { + k1:=nW*nH+dx+(k5-71*25) + this.SC(((show[k1]:=!show[k1])?0xFF0000:0xFFFFAA), k6) + return + } + k3:=Mod(k5-1,71)+dx, k4:=(k5-1)//71+dy + if (k3>=nW || k4>=nH) + return + k1:=k4*nW+k3+1 + if (Modify && bg!="" && show[k1]) + this.SC(((ascii[k1]:=!ascii[k1])?0:0xFFFFFF), k6) + else + { + k2:=cors[k1], SelPos:=k1 + _Gui:=FindText_Capture + _Gui["SelGray"].Value:=(((k2>>16)&0xFF)*38+((k2>>8)&0xFF)*75+(k2&0xFF)*15)>>7 + _Gui["SelColor"].Value:=Format("0x{:06X}",k2&0xFFFFFF) + _Gui["SelR"].Value:=(k2>>16)&0xFF + _Gui["SelG"].Value:=(k2>>8)&0xFF + _Gui["SelB"].Value:=k2&0xFF + } + if (MultiColor && show[k1]) + { + (FindShape && Result="") && G_.Call("ColorPos2Two") + k2:=Format(",{:d}/{:d}/{:06X}", nX+k3, nY+k4, cors[k1]&0xFFFFFF) + , Result.=InStr(Result,k2) ? "":k2 + ToolTip Trim(Result, ",") + } + return + Case "RButtonDown": + Critical + MouseGetPos(,,, &k2, 2) + if (k2!=hPic) + return + CoordMode "Mouse" + MouseGetPos &k1, &k2 + k5:=hBM_x, k6:=hBM_y + ListLines (lls:=A_ListLines)?0:0 + Loop + { + Sleep 10 + MouseGetPos &k3, &k4 + hBM_x:=k5+k1-k3, hBM_y:=k6+k2-k4 + G_.Call("PicShow") + } + Until !this.State("RButton") + ListLines lls + return + Case "MouseMove": + Try ctrl_name:="", ctrl_name:=GuiCtrlFromHwnd(args[3]).Name + if (PrevControl != ctrl_name) + { + ToolTip + PrevControl:=ctrl_name + Try SetTimer G_ToolTip, (PrevControl ? -500:0) + Try SetTimer G_ToolTipOff, (PrevControl ? -5500:0) + } + return + Case "ToolTip": + MouseGetPos(,, &_TT) + if WinExist("ahk_id " _TT " ahk_class AutoHotkeyGUI") + Try ToolTip Tip_Text[PrevControl] + return + Case "ToolTipOff": + ToolTip + return + Case "CutL2", "CutR2", "CutU2", "CutD2": + s:=FindText_Main["MyPic"].Value + s:=Trim(s,"`n") . "`n", v:=SubStr(cmd,4,1) + if (v="U") + s:=RegExReplace(s,"^[^\n]+\n") + else if (v="D") + s:=RegExReplace(s,"[^\n]+\n$") + else if (v="L") + s:=RegExReplace(s,"m`n)^[^\n]") + else if (v="R") + s:=RegExReplace(s,"m`n)[^\n]$") + FindText_Main["MyPic"].Value:=Trim(s,"`n") + return + Case "Update": + ControlFocus hscr + i:=EditGetCurrentLine(hscr) + s:=EditGetLine(i, hscr) + if !RegExMatch(s, "(<[^>\n]*>[^$\n]+\$)\d+\.[\w+/]+", &r) + return + v:=FindText_Main["MyPic"].Value + v:=Trim(v,"`n") . "`n", w:=Format("{:d}",InStr(v,"`n")-1) + v:=StrReplace(StrReplace(v,"0","1"),"_","0") + s:=StrReplace(s, r[0], r[1] . w "." this.bit2base64(v)) + v:="{End}{Shift Down}{Home}{Shift Up}{Del}" + ControlSend v, hscr + EditPaste s, hscr + ControlSend "{Home}", hscr + return + } +} + +Lang(text:="", getLang:=0) +{ + static Lang1:="", Lang2 + if (!Lang1) + { + s:=" + ( +Myww = 宽度 = 调整抓图范围的宽度 +Myhh = 高度 = 调整抓图范围的高度 +AddFunc = 附加 = 复制时带 FindText() 函数 +NowHotkey = 截屏热键 = 当前的截屏热键 +SetHotkey1 = = 第一优先级的截屏热键 +SetHotkey2 = = 第二优先级的截屏热键 +Apply = 应用 = 应用新的截屏热键 +CutU2 = 上删 = 裁剪下面编辑框中文字的上边缘 +CutL2 = 左删 = 裁剪下面编辑框中文字的左边缘 +CutR2 = 右删 = 裁剪下面编辑框中文字的右边缘 +CutD2 = 下删 = 裁剪下面编辑框中文字的下边缘 +Update = 更新 = 更新下面编辑框中文字到代码行中 +GetRange = 获取屏幕范围 = 获取屏幕范围到剪贴板并替换代码中的范围参数 +GetOffset = 获取相对坐标 = 获取相对图像位置的偏移坐标并替换代码中的点击坐标 +GetClipOffset = 获取相对坐标2 = 获取相对左边编辑框的图像的偏移坐标 +Capture = 抓图 = 开始屏幕抓图 +CaptureS = 截屏抓图 = 先截屏,然后显示截屏图像,再手动选择图像内的范围抓图 +Test = 测试 = 测试生成的代码是否可以查找成功 +TestClip = 测试2 = 测试左边文本框中的文字是否可以查找成功,结果复制到剪贴板 +Paste = 粘贴 = 粘贴剪贴板的文字数据 +CopyOffset = 复制2 = 复制左边的偏移坐标到剪贴板 +Copy = 复制 = 复制代码到剪贴板 +Reset = 重读 = 重新读取原来的彩色图像 +SplitAdd = 分割添加 = 点击黄色的标签来分割图像为多个图像数据,添加到旧代码中 +AllAdd = 整体添加 = 将文字数据整体添加到旧代码中 +Gray2Two = 灰度阈值二值化 = 灰度小于阈值的为黑色其余白色 +GrayDiff2Two = 灰度差值二值化 = 某点与周围灰度之差大于差值的为黑色其余白色 +Color2Two = 颜色二值化 = 通过颜色列表来转换图像为黑白图 +ColorPos2Two = 颜色位置二值化 = 指定颜色及相似色为黑色其余白色,但是记录该色的位置 +SelGray = 灰度 = 选定颜色的灰度值 (0-255) +SelColor = 颜色 = 选定颜色的RGB颜色值 +SelR = 红 = 选定颜色的红色分量 +SelG = 绿 = 选定颜色的绿色分量 +SelB = 蓝 = 选定颜色的蓝色分量 +RepU = -上 = 撤销裁剪上边缘1个像素 +CutU = 上 = 裁剪上边缘1个像素 +CutU3 = 上3 = 裁剪上边缘3个像素 +RepL = -左 = 撤销裁剪左边缘1个像素 +CutL = 左 = 裁剪左边缘1个像素 +CutL3 = 左3 = 裁剪左边缘3个像素 +Auto = 自动 = 二值化之后自动裁剪空白边缘 +RepR = -右 = 撤销裁剪右边缘1个像素 +CutR = 右 = 裁剪右边缘1个像素 +CutR3 = 右3 = 裁剪右边缘3个像素 +RepD = -下 = 撤销裁剪下边缘1个像素 +CutD = 下 = 裁剪下边缘1个像素 +CutD3 = 下3 = 裁剪下边缘3个像素 +Modify = 修改 = 二值化后可以用鼠标在预览区点击手动修改黑白点 +MultiColor = 多点找色 = 鼠标选择多种颜色,之后点击“确定”按钮 +FindShape = 找形状 = 鼠标选择多种颜色,会基于第一点的颜色二值化 +Undo = 撤销 = 撤销上一次选择的颜色 +Undo2 = 撤销 = 撤销上一次添加到颜色列表的颜色 +Comment = 识别文字 = 识别文本 (包含在<>中),分割添加时也会分解成单个文字 +Threshold = 灰度阈值 = 灰度阈值 (0-255) +GrayDiff = 灰度差值 = 灰度差值 (0-255) +Similar1 = 相似度 = 与选定颜色的相似度 +Similar2 = 相似度 = 与选定颜色的相似度 +Similar3 = 相似度 = 与选定颜色的相似度 +AddColorSim = 添加 = 颜色相似模式添加到颜色列表中再运行颜色二值化 +AddColorDiff = 添加 = 颜色偏色模式添加到颜色列表中再运行颜色二值化 +ColorList = = 颜色列表用于转换图像为二值图 +DiffRGB = 红/绿/蓝 = 多色查找时各分量允许的偏差 (0-255) +DiffRGB2 = 红/绿/蓝 = 多色查找时各分量允许的偏差 (0-255) +Bind0 = 绑定窗口1 = 绑定窗口使用GetDCEx()获取后台窗口图像 +Bind1 = 绑定窗口1+ = 绑定窗口使用GetDCEx()并修改窗口透明度 +Bind2 = 绑定窗口2 = 绑定窗口使用PrintWindow()获取后台窗口图像 +Bind3 = 绑定窗口2+ = 绑定窗口使用PrintWindow()并修改窗口透明度 +Bind4 = 绑定窗口3 = 绑定窗口使用PrintWindow(,,3)获取后台窗口图像 +OK = 确定 = 生成全新的代码替换旧代码 +OK2 = 确定 = 恢复截屏到屏幕然后再抓图 +Cancel = 取消 = 关闭窗口不做任何事 +Cancel2 = 取消 = 关闭窗口不做任何事 +ClearAll = 清空 = 清空所有保存的截图 +OpenDir = 打开目录 = 打开保存屏幕截图的目录 +SavePic = 保存图片 = 选择一个范围保存为图片 +SavePic2 = 保存图片 = 将修剪后的原始图像保存为图片 +LoadPic = 载入图片 = 载入一张图片作为抓取的图像 +ClipText = = 显示粘贴的文字数据 +Offset = = 显示“获取相对坐标2”或者“获取屏幕范围”的结果 +SelectBox = = 选择截图显示到屏幕左上角 +s1 = FindText找字工具 +s2 = 灰度阈值|灰度差值|颜色|颜色位置|多色查找 +s3 = 图像二值化及分割 +s4 = 抓图生成字库及找字代码 +s5 = 方向键微调选框\n先点击右键(Ctrl)一次\n把鼠标移开\n再点击右键(Ctrl)一次 +s6 = 解绑窗口使用 +s7 = 左键(Ctrl)拖动选择范围\n坐标复制到剪贴板 +s8 = 找到|时间|毫秒|位置|结果|值可以这样获取|等待3秒等图像出现|无限等待等图像消失 +s9 = 截屏成功 +s10 = 鼠标位置|穿透显示绑定窗口\n点击右键完成抓图 +s11 = 请先设定灰度差值! +s12 = 请先选择核心颜色! +s13 = 请先将图像二值化! +s14 = 不能用于颜色位置二值化模式, 因为分割后会导致位置错误 +s15 = 你确定选择的范围吗?\n\n如果不确定,可以重新选择 +s16 = 请先添加颜色到颜色列表! +s17 = 你想打开的图片没有找到! +s18 = 捕获|截图 +s19 = 你确定要删除所有的截图吗? + )" + Lang1:=Map(), Lang1.Default:="", Lang2:=Map(), Lang2.Default:="" + Loop Parse, s, "`n", "`r" + if InStr(v:=A_LoopField, "=") + r:=StrSplit(StrReplace(v "==","\n","`n"), "=", "`t ") + , Lang1[r[1]]:=r[2], Lang2[r[1]]:=r[3] + } + return getLang=1 ? Lang1 : getLang=2 ? Lang2 : Lang1[text] +} + +Script_End() { +} + +} ;// Class End + +;================= The End ================= + +; \ No newline at end of file From 17087aed5c6fb867b70e38011f3b8a21bf206b97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E4=B8=80=E4=B8=80?= <1204244136@qq.com> Date: Thu, 1 May 2025 21:35:23 +0800 Subject: [PATCH 02/40] =?UTF-8?q?perf:=20=E6=B7=BB=E5=8A=A0=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=8A=A5=E9=94=99=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E7=9B=B4=E6=8E=A5=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DoroHelper.ahk | 409 +++++++++++++++++++++++++++++++------------------ 1 file changed, 261 insertions(+), 148 deletions(-) diff --git a/DoroHelper.ahk b/DoroHelper.ahk index 5deb688..e18cd61 100644 --- a/DoroHelper.ahk +++ b/DoroHelper.ahk @@ -1,5 +1,6 @@ #Requires AutoHotkey >=v2.0 -#Include %A_ScriptDir%\lib\github.ahk +#Include +#Include CoordMode "Pixel", "Client" CoordMode "Mouse", "Client" ;操作间隔(单位:毫秒) @@ -27,6 +28,23 @@ IsSimilarColor(targetColor, color) { return true return false } +;坐标转换-点击 +UserClick(sX, sY, k) { + uX := Round(sX * k) ; 计算转换后的坐标 + uY := Round(sY * k) + Send "{Click " uX " " uY "}" ; 点击转换后的坐标 +} +;坐标转换-颜色 +UserCheckColor(sX, sY, sC, k) { + loop sX.Length { + uX := Round(sX[A_Index] * k) + uY := Round(sY[A_Index] * k) + uC := PixelGetColor(uX, uY) + if (!IsSimilarColor(uC, sC[A_Index])) + return 0 + } + return 1 +} ;检查更新 CheckForUpdateHandler(isManualCheck) { global currentVersion, usr, repo ; 确保能访问全局变量 @@ -73,23 +91,6 @@ CheckForUpdateHandler(isManualCheck) { ClickOnCheckForUpdate(*) { CheckForUpdateHandler(true) ; 调用核心函数,标记为手动检查 } -;坐标转换-点击 -UserClick(sX, sY, k) { - uX := Round(sX * k) - uY := Round(sY * k) - Send "{Click " uX " " uY "}" -} -;坐标转换-颜色 -UserCheckColor(sX, sY, sC, k) { - loop sX.Length { - uX := Round(sX[A_Index] * k) - uY := Round(sY[A_Index] * k) - uC := PixelGetColor(uX, uY) - if (!IsSimilarColor(uC, sC[A_Index])) - return 0 - } - return 1 -} ;判断自动按钮颜色 isAutoOff(sX, sY, k) { uX := Round(sX * k) @@ -137,21 +138,15 @@ Login() { while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { UserClick(stdTargetX, stdTargetY, scrRatio) Sleep sleepTime - if UserCheckColor([1973, 1969], [1368, 1432], ["0x00ADFB", "0x00ADFB"], scrRatio) { - UserClick(2127, 1400, scrRatio) - Sleep sleepTime - } - if UserCheckColor([1965, 1871], [1321, 1317], ["0x00A0EB", "0xF7F7F7"], scrRatio) { - UserClick(2191, 1350, scrRatio) - Sleep sleepTime - } - if UserCheckColor([1720, 2111], [1539, 1598], ["0x00AEFF", "0x00AEFF"], scrRatio) { - UserClick(1905, 1568, scrRatio) + ;点击蓝色的确认按钮(如果出现更新提示等消息) + Text:="|<确认>*192$51.zz1zyDy7s0s0TUzkz0601y3y7s0U0TkTkzksT3z3y7yC3kTwzkzlk00zzy7wC0073zkzU800kDy7s1X761zkz0AMMsDw7s1U07lzUT2A00yDw3sFU07lzUT2AMMyDs1sFX77kb2DWAEEy0kkwF007k663W800y0VsA1737k8D0U0wsy23w407W7UUTUXkw0wC7y6SDU7nlzsU" + if (ok:=FindText(&X, &Y, 1429-150000, 906-150000, 1429+150000, 906+150000, 0, 0, Text)){ + FindText().Click(X, Y, "L") Sleep sleepTime } if A_Index > waitTolerance * 50 { MsgBox "登录失败!" - ExitApp + Pause -1 } } } @@ -159,23 +154,20 @@ Login() { BackToHall() { stdTargetX := 333 stdTargetY := 2041 - UserClick(stdTargetX, stdTargetY, scrRatio) + Click(333, 2041, scrRatio) Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + Text:="|<大厅>*161$39.znzzzzzwTzU00zXzw007wTzXzzzXzwTzs007WDz000w000007W00z0zwTXzs7zXwTz0zwTXzkXzbwTyADwzXzVlzbwTsS7szXy7sD7wT1zUty3sTy6DUTU" ;大厅底部的文本 + while !(ok:=FindText(&X, &Y, 1294-150000, 1334-150000, 1294+150000, 1334+150000, 0.3, 0.3, Text)) { UserClick(stdTargetX, stdTargetY, scrRatio) Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - ExitApp + Pause -1 } } } ;1: 防御前哨基地奖励 OutpostDefence() { - ; --- 函数开始 --- (移除了 Start: 标签) stdTargetX := 1092 stdTargetY := 1795 UserClick(stdTargetX, stdTargetY, scrRatio) ; 点击进入前哨基地 @@ -191,12 +183,12 @@ OutpostDefence() { loopCounter += 1 if loopCounter > waitTolerance { ; 使用独立的计数器判断超时 MsgBox "进入防御前哨失败! (超时)" - ExitApp + Pause -1 } if loopCounter > 10 { ; 尝试次数过多,可能卡住 MsgBox "进入防御前哨尝试次数过多,退出。" ; 可以选择是否在退出前尝试返回大厅 - ExitApp + Pause -1 } } ; 点击 "一举歼灭" 按钮 @@ -215,11 +207,11 @@ OutpostDefence() { loopCounter += 1 if loopCounter > waitTolerance { MsgBox "进入一举歼灭失败! (超时)" - ExitApp + Pause -1 } if loopCounter > 10 { MsgBox "进入一举歼灭尝试次数过多,退出。" - ExitApp + Pause -1 } } ; 检查是否有免费扫荡次数 (按钮非灰色) @@ -247,7 +239,7 @@ OutpostDefence() { loopCounter += 1 if loopCounter > 10 { ; 设置扫荡确认的超时次数 MsgBox "扫荡确认超时,退出。" - ExitApp + Pause -1 } } } @@ -268,7 +260,7 @@ OutpostDefence() { popupLoopCounter += 1 if popupLoopCounter > 10 { ; 设置一个合理的超时次数 MsgBox("处理弹窗超时,退出。") - ExitApp + Pause -1 } } ; 点击 "获得奖励" 按钮 @@ -292,7 +284,7 @@ OutpostDefence() { loopCounter += 1 if loopCounter > waitTolerance { ; 使用全局超时容忍度 MsgBox("前哨基地防御奖励领取后返回大厅异常! (超时)") - ExitApp + Pause -1 } } } @@ -328,7 +320,7 @@ CashShop() { } if A_Index > waitTolerance { MsgBox "进入付费商店失败!" - ExitApp + Pause -1 } } Sleep sleepTime @@ -368,7 +360,7 @@ CashShop() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入礼包页面失败!" - ExitApp + Pause -1 } } stdCkptX := [514] @@ -404,7 +396,7 @@ CashShop() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入每日礼包页面失败!" - ExitApp + Pause -1 } } stdTargetX := 212 @@ -428,7 +420,7 @@ CashShop() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入每周礼包页面失败!" - ExitApp + Pause -1 } } stdTargetX := 212 @@ -452,7 +444,7 @@ CashShop() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入每月礼包页面失败!" - ExitApp + Pause -1 } } stdTargetX := 212 @@ -476,7 +468,7 @@ CashShop() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "退出付费商店失败!" - ExitApp + Pause -1 } } } @@ -530,7 +522,7 @@ ShopFreeClaim() { loopCounter += 1 if loopCounter > waitTolerance { MsgBox "普通商店免费领取:等待确认弹窗超时!" - ExitApp + Pause -1 } } ; --- 点击确认按钮 --- @@ -549,7 +541,7 @@ ShopFreeClaim() { loopCounter += 1 if loopCounter > waitTolerance { MsgBox "普通商店免费领取:等待返回商店界面超时!" - ExitApp + Pause -1 } } ; --- 单次免费领取完成 --- @@ -571,7 +563,7 @@ FreeShop(numOfBook) { loopCounter += 1 if loopCounter > waitTolerance { MsgBox "进入普通商店失败!" - ExitApp + Pause -1 } } ; 检查第一次免费领取是否可用 (按钮非蓝色) @@ -601,7 +593,7 @@ FreeShop(numOfBook) { loopCounter += 1 if loopCounter > waitTolerance { MsgBox "普通商店刷新:等待确认弹窗超时!" - ExitApp + Pause -1 } } ; 点击刷新确认按钮 @@ -620,7 +612,7 @@ FreeShop(numOfBook) { loopCounter += 1 if loopCounter > waitTolerance { MsgBox "普通商店刷新:确认后返回商店超时!" - ExitApp + Pause -1 } } Sleep 1000 ; 刷新后额外等待一下界面加载 @@ -640,7 +632,7 @@ FreeShop(numOfBook) { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "废铁商店进入异常!" - ExitApp + Pause -1 } } if sleepTime < 1500 @@ -669,7 +661,7 @@ FreeShop(numOfBook) { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "竞技场商店进入异常!" - ExitApp + Pause -1 } } if sleepTime < 1500 @@ -695,7 +687,7 @@ FreeShop(numOfBook) { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "第一本书购买异常!" - ExitApp + Pause -1 } } stdTargetX := 2067 @@ -714,7 +706,7 @@ FreeShop(numOfBook) { } if A_Index > waitTolerance { MsgBox "第一本书购买异常!" - ExitApp + Pause -1 } } } @@ -738,7 +730,7 @@ FreeShop(numOfBook) { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "第二本书购买异常!" - ExitApp + Pause -1 } } stdTargetX := 2067 @@ -757,7 +749,7 @@ FreeShop(numOfBook) { } if A_Index > waitTolerance { MsgBox "第二本书购买异常!" - ExitApp + Pause -1 } } } @@ -781,7 +773,7 @@ FreeShop(numOfBook) { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "第三本书购买异常!" - ExitApp + Pause -1 } } stdTargetX := 2067 @@ -800,7 +792,7 @@ FreeShop(numOfBook) { } if A_Index > waitTolerance { MsgBox "第三本书购买异常!" - ExitApp + Pause -1 } } } @@ -822,7 +814,7 @@ FreeShop(numOfBook) { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "公司武器熔炉购买异常!" - ExitApp + Pause -1 } } stdTargetX := 2067 @@ -841,7 +833,7 @@ FreeShop(numOfBook) { } if A_Index > waitTolerance { MsgBox "公司武器熔炉购买异常!" - ExitApp + Pause -1 } } } @@ -858,7 +850,7 @@ FreeShop(numOfBook) { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "退出免费商店失败!" - ExitApp + Pause -1 } } } @@ -877,7 +869,7 @@ Expedition() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入前哨基地失败!" - ExitApp + Pause -1 } } stdCkptX := [1907, 1963, 1838, 2034] @@ -887,7 +879,7 @@ Expedition() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入前哨基地失败!" - ExitApp + Pause -1 } } ;派遣公告栏 @@ -904,7 +896,7 @@ Expedition() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入派遣失败!" - ExitApp + Pause -1 } } stdTargetX := 2268 @@ -936,7 +928,7 @@ Expedition() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "全部派遣失败!" - ExitApp + Pause -1 } if UserCheckColor([1779], [1778], ["0xCFCFCF"], scrRatio) break @@ -953,7 +945,7 @@ Expedition() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "全部派遣失败!" - ExitApp + Pause -1 } } } @@ -970,7 +962,7 @@ Expedition() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出前哨基地失败!" - ExitApp + Pause -1 } } } @@ -988,7 +980,7 @@ FriendPoint() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入好友界面失败!" - ExitApp + Pause -1 } } stdCkptX := [2104, 2197] @@ -1001,7 +993,7 @@ FriendPoint() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入好友界面失败!" - ExitApp + Pause -1 } } while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { @@ -1009,7 +1001,7 @@ FriendPoint() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "赠送好友点数失败" - ExitApp + Pause -1 } } stdTargetX := 333 @@ -1024,7 +1016,7 @@ FriendPoint() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出好友界面失败!" - ExitApp + Pause -1 } } } @@ -1042,7 +1034,7 @@ SimulationRoom() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入方舟失败!" - ExitApp + Pause -1 } } stdCkptX := [1641] @@ -1052,7 +1044,7 @@ SimulationRoom() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入方舟失败!" - ExitApp + Pause -1 } } ;进入模拟室 @@ -1068,7 +1060,7 @@ SimulationRoom() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入模拟室失败!" - ExitApp + Pause -1 } } ;开始模拟 @@ -1084,7 +1076,7 @@ SimulationRoom() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入选关失败!" - ExitApp + Pause -1 } } ;选择5C @@ -1114,7 +1106,7 @@ SimulationRoom() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "开始模拟失败!" - ExitApp + Pause -1 } } stdTargetX := 1903 @@ -1127,7 +1119,7 @@ SimulationRoom() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入buff选择页面失败!" - ExitApp + Pause -1 } } stdCkptX := [1760] @@ -1151,7 +1143,7 @@ SimulationRoom() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入战斗准备页面失败!" - ExitApp + Pause -1 } } ;点击进入战斗 @@ -1190,7 +1182,7 @@ SimulationRoom() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "模拟室结束异常!" - ExitApp + Pause -1 } } if colorTolerance != 15 { @@ -1222,7 +1214,7 @@ SimulationRoom() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - ExitApp + Pause -1 } } } @@ -1242,7 +1234,7 @@ Arena() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入方舟失败!" - ExitApp + Pause -1 } } stdCkptX := [1641] @@ -1252,7 +1244,7 @@ Arena() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入方舟失败!" - ExitApp + Pause -1 } } ;收pjjc菜 @@ -1288,7 +1280,7 @@ RookieArena(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入竞技场失败!" - ExitApp + Pause -1 } } stdCkptX := [1683] @@ -1298,7 +1290,7 @@ RookieArena(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入竞技场失败!" - ExitApp + Pause -1 } } ;进入新人竞技场 @@ -1326,14 +1318,14 @@ RookieArena(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - ExitApp + Pause -1 } } return } if A_Index > waitTolerance { MsgBox "进入新人竞技场失败!" - ExitApp + Pause -1 } } loop times { @@ -1350,7 +1342,7 @@ RookieArena(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "选择对手失败!" - ExitApp + Pause -1 } } ;点击进入战斗 @@ -1366,7 +1358,7 @@ RookieArena(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "新人竞技场作战失败!" - ExitApp + Pause -1 } } } @@ -1383,13 +1375,123 @@ RookieArena(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - ExitApp + Pause -1 } } } ;特殊竞技场 SpecialArena(times) { - + ;进入竞技场 + stdTargetX := 2208 + stdTargetY := 1359 + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + stdCkptX := [1641] + stdCkptY := [324] + desiredColor := ["0x01D4F6"] + while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + if A_Index > waitTolerance { + MsgBox "进入竞技场失败!" + Pause -1 + } + } + stdCkptX := [1683] + stdCkptY := [606] + desiredColor := ["0xF7FCFE"] + while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + Sleep sleepTime + if A_Index > waitTolerance { + MsgBox "进入竞技场失败!" + Pause -1 + } + } + ;进入特殊竞技场 + stdTargetX := 1647 + stdTargetY := 1164 + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + stdCkptX := [784] + stdCkptY := [1201] + desiredColor := ["0xF8FCFE"] + while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + if A_Index > 5 { + ;退回大厅 + stdTargetX := 333 + stdTargetY := 2041 + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + stdCkptX := [64] + stdCkptY := [470] + desiredColor := ["0xFAA72C"] + while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + if A_Index > waitTolerance { + MsgBox "退回大厅失败!" + Pause -1 + } + } + return + } + if A_Index > waitTolerance { + MsgBox "进入新人竞技场失败!" + Pause -1 + } + } + loop times { + ;点击进入战斗 + stdTargetX := 2371 + stdTargetY := 1847 + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + stdCkptX := [2700] + stdCkptY := [1691] + desiredColor := ["0xF7FCFE"] + while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + if A_Index > waitTolerance { + MsgBox "选择对手失败!" + Pause -1 + } + } + ;点击进入战斗 + stdTargetX := 2123 + stdTargetY := 1784 + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + stdCkptX := [2784] + stdCkptY := [1471] + desiredColor := ["0xF8FCFD"] + while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + if A_Index > waitTolerance { + MsgBox "新人竞技场作战失败!" + Pause -1 + } + } + } + ;退回大厅 + stdTargetX := 333 + stdTargetY := 2041 + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + stdCkptX := [64] + stdCkptY := [470] + desiredColor := ["0xFAA72C"] + while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + if A_Index > waitTolerance { + MsgBox "退回大厅失败!" + Pause -1 + } + } } ;8: 对前n位nikke进行好感度咨询(可以通过收藏把想要咨询的nikke排到前面) NotAllCollection() { @@ -1412,7 +1514,7 @@ LoveTalking(times) { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入妮姬列表失败!" - ExitApp + Pause -1 } } stdCkptX := [1466, 1814] @@ -1422,7 +1524,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入妮姬列表失败!" - ExitApp + Pause -1 } } ;进入咨询页面 @@ -1448,7 +1550,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - ExitApp + Pause -1 } } return @@ -1457,7 +1559,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入咨询页面失败!" - ExitApp + Pause -1 } } ;点进第一个妮姬 @@ -1473,7 +1575,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入妮姬咨询页面失败!" - ExitApp + Pause -1 } } loop times { @@ -1495,7 +1597,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入妮姬咨询页面失败!" - ExitApp + Pause -1 } } ;点击确定 @@ -1511,7 +1613,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "快速咨询失败!" - ExitApp + Pause -1 } } } @@ -1533,7 +1635,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "咨询失败!" - ExitApp + Pause -1 } } ;点击确认 @@ -1549,7 +1651,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "咨询失败!" - ExitApp + Pause -1 } } stdCkptX := [1504] @@ -1565,7 +1667,7 @@ LoveTalking(times) { Sleep sleepTime // 2 if A_Index > waitTolerance * 2 { MsgBox "咨询失败!" - ExitApp + Pause -1 } } } @@ -1588,7 +1690,7 @@ LoveTalking(times) { break 2 if A_Index > waitTolerance { MsgBox "咨询失败!" - ExitApp + Pause -1 } } } @@ -1605,7 +1707,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - ExitApp + Pause -1 } } } @@ -1623,7 +1725,7 @@ FailTower() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入方舟失败!" - ExitApp + Pause -1 } } stdCkptX := [1641] @@ -1633,7 +1735,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入方舟失败!" - ExitApp + Pause -1 } } ;进入无限之塔 @@ -1649,7 +1751,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入无限之塔失败!" - ExitApp + Pause -1 } } stdTargetX := 1953 @@ -1664,7 +1766,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "选择作战失败!" - ExitApp + Pause -1 } } stdTargetX := 2242 @@ -1679,7 +1781,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入作战失败!" - ExitApp + Pause -1 } } ;按esc @@ -1693,7 +1795,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "按esc失败!" - ExitApp + Pause -1 } } ;按放弃战斗 @@ -1707,7 +1809,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "放弃战斗失败!" - ExitApp + Pause -1 } } ;退回大厅 @@ -1723,7 +1825,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - ExitApp + Pause -1 } } } @@ -1782,7 +1884,7 @@ CompanyTower() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入方舟失败!" - ExitApp + Pause -1 } } stdCkptX := [1641] @@ -1792,7 +1894,7 @@ CompanyTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入方舟失败!" - ExitApp + Pause -1 } } ;进入无限之塔 @@ -1808,7 +1910,7 @@ CompanyTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入无限之塔失败!" - ExitApp + Pause -1 } } Sleep 1500 @@ -1833,7 +1935,7 @@ CompanyTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入企业塔失败!" - ExitApp + Pause -1 } } ;直到成功进入企业塔 @@ -1844,7 +1946,7 @@ CompanyTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入企业塔失败!" - ExitApp + Pause -1 } } ;进入关卡页面 @@ -1858,7 +1960,7 @@ CompanyTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入企业塔关卡页面失败!" - ExitApp + Pause -1 } } ;如果战斗次数已经用完 @@ -1898,7 +2000,7 @@ WaitForBattleEnd: Sleep sleepTime if A_Index > waitTolerance * 20 { MsgBox "企业塔自动战斗失败!" - ExitApp + Pause -1 } } ;如果战斗失败或次数用完 @@ -1978,7 +2080,7 @@ WaitForBattleEnd: Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - ExitApp + Pause -1 } } } @@ -1997,7 +2099,7 @@ Interception() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入方舟失败!" - ExitApp + Pause -1 } } stdCkptX := [1641] @@ -2007,7 +2109,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入方舟失败!" - ExitApp + Pause -1 } } ;进入拦截战 @@ -2023,7 +2125,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入拦截战失败!" - ExitApp + Pause -1 } } stdTargetX := 559 @@ -2066,7 +2168,7 @@ Interception() { desiredColor := ["0xFD000F"] default: MsgBox "BOSS选择错误!" - ExitApp + Pause -1 } stdTargetX := 1556 stdTargetY := 886 @@ -2075,7 +2177,7 @@ Interception() { Sleep 2000 if A_Index > waitTolerance { MsgBox "选择BOSS失败!" - ExitApp + Pause -1 } } ;点击挑战按钮 @@ -2092,7 +2194,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - ExitApp + Pause -1 } } return @@ -2107,7 +2209,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "点击挑战失败!" - ExitApp + Pause -1 } } ;选择编队 @@ -2139,7 +2241,7 @@ Interception() { stdCkptY := [1428] default: MsgBox "BOSS选择错误!" - ExitApp + Pause -1 } desiredColor := ["0x02ADF5"] while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { @@ -2147,7 +2249,7 @@ Interception() { Sleep 1500 if A_Index > waitTolerance { MsgBox "选择编队失败!" - ExitApp + Pause -1 } } ;如果不能快速战斗,就进入战斗 @@ -2165,7 +2267,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入战斗失败!" - ExitApp + Pause -1 } } ;退出结算页面 @@ -2179,7 +2281,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance * 20 { MsgBox "自动战斗失败!" - ExitApp + Pause -1 } } while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { @@ -2187,7 +2289,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出结算页面失败!" - ExitApp + Pause -1 } } } @@ -2199,7 +2301,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出结算页面失败!" - ExitApp + Pause -1 } } ;快速战斗 @@ -2216,7 +2318,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "快速战斗失败!" - ExitApp + Pause -1 } } ;退出结算页面 @@ -2229,7 +2331,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "快速战斗结算失败!" - ExitApp + Pause -1 } } while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { @@ -2237,7 +2339,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出结算页面失败!" - ExitApp + Pause -1 } } ;检查是否退出 @@ -2248,7 +2350,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出结算页面失败!" - ExitApp + Pause -1 } } Sleep 1000 @@ -2271,7 +2373,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - ExitApp + Pause -1 } } } @@ -2289,7 +2391,7 @@ Mail() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入邮箱失败!" - ExitApp + Pause -1 } } stdCkptX := [2085] @@ -2312,7 +2414,7 @@ Mail() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出邮箱失败!" - ExitApp + Pause -1 } } } @@ -2330,7 +2432,7 @@ Mission() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入任务失败!" - ExitApp + Pause -1 } } stdTargetX := 2286 @@ -2416,7 +2518,7 @@ OnePass() { ;执行一次通行证 Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入通行证失败!" - ExitApp + Pause -1 } } stdCkptX := [1733] @@ -2465,7 +2567,7 @@ OnePass() { ;执行一次通行证 Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出通行证失败!" - ExitApp + Pause -1 } } stdCkptX := [3395] @@ -2556,10 +2658,10 @@ ClickOnDoro(*) { } catch as err { title := "ahk_exe nikke.exe" } - numNikke := WinGetCount(title) + numNikke := WinGetCount(title) ;多开检测 if numNikke = 0 { MsgBox "未检测到NIKKE主程序" - ExitApp + Pause -1 } loop numNikke { nikkeID := WinGetIDLast(title) @@ -2722,7 +2824,7 @@ global isBoughtTrash := 1 ; 检测废铁商店 ;检测管理员身份 if !A_IsAdmin { MsgBox "请以管理员身份运行Doro" - ExitApp + Pause -1 } ;读取设置 SetWorkingDir A_ScriptDir @@ -2839,3 +2941,14 @@ doroGui.Show() ^2:: { Pause -1 } +;调试指定函数 +^0:: { + ;添加基本的依赖 + title := "ahk_exe nikke.exe" + nikkeID := WinGetIDLast(title) + WinGetClientPos , , &userScreenW, &userScreenH, nikkeID + global scrRatio + scrRatio := userScreenW / stdScreenW + ;下面写要调试的函数 + BackToHall() +} \ No newline at end of file From bba690680979f41f8262c95dc385e4ae1cc2591d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E4=B8=80=E4=B8=80?= <1204244136@qq.com> Date: Tue, 6 May 2025 16:09:44 +0800 Subject: [PATCH 03/40] =?UTF-8?q?docs:=20=E5=8A=A0=E5=85=A5=E5=8F=8B?= =?UTF-8?q?=E9=93=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index b22a4a5..4b2adf6 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,12 @@ PC 端日常任务清理助手。一键清理多项日常事务。支持国际 +## 我们联合! + +- [功能类似的手机脚本](https://github.com/Zebartin/autoxjs-scripts) + +- [功能类似的模拟器脚本](https://github.com/takagisanmie/NIKKEAutoScript) + ## 免责声明 本项目仅供个人学习研究使用,严禁用于商业用途。除 Github 以外其他任何网站、社交平台中有关本项目的内容**均非本人发布**,若造成侵犯著作权、版权或违反网络安全法规等任何后果,均与本人无关。 From 8c442bd83213e710089d9f22ff1d7fa80c75dfe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E4=B8=80=E4=B8=80?= <1204244136@qq.com> Date: Wed, 7 May 2025 00:38:15 +0800 Subject: [PATCH 04/40] =?UTF-8?q?build:=20=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=87=BD=E6=95=B0=E5=BA=93=E4=BE=9D=E8=B5=96=EF=BC=8C?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E8=BE=85=E5=8A=A9=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- lib/DoroDebugger.ahk | 325 +++++++++++++++++++++++++++++++++++++++++++ lib/FindText.ahk | 8 +- 3 files changed, 331 insertions(+), 5 deletions(-) create mode 100644 lib/DoroDebugger.ahk diff --git a/.gitignore b/.gitignore index 33e6d21..2ef2303 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.exe -*.ini \ No newline at end of file +*.ini +.vscode \ No newline at end of file diff --git a/lib/DoroDebugger.ahk b/lib/DoroDebugger.ahk new file mode 100644 index 0000000..0a15587 --- /dev/null +++ b/lib/DoroDebugger.ahk @@ -0,0 +1,325 @@ +#Requires AutoHotkey v2.0 +#SingleInstance Force + +; --- 全局变量定义 --- +Global MyGui := "" ; GUI 对象 +Global gFocusedProgramEdit := "" ; 聚焦窗口编辑框 +Global gCalculatedCoordsEdit := "" ; 换算坐标编辑框 (可编辑) +Global gStatusText := "" ; 状态信息文本 +Global gMouseCoordsEdit := "" ; 鼠标屏幕坐标显示框 +Global gRelativeMouseCoordsEdit := "" ; 鼠标窗口相对坐标显示框 +Global gClientAreaEdit := "" ; 客户区矩形显示框 +Global gPixelColorEdit := "" ; 位置颜色显示框 (十六进制) +Global gPixelCharacterBlock := "" ; 显示颜色字符的 Text 控件 +Global gSelectedRefWidth := 3840 ; 默认目标宽度 (4K) +Global gSelectedRefHeight := 2160 ; 默认目标高度 (4K) +Global gTargethWnd := "" ; 存储上次记录的目标窗口句柄 + +; --- 目标分辨率映射表 --- +resolutions := Map( + "4K", [3840, 2160], + "2K", [2560, 1440], + "1080p", [1920, 1080] +) +defaultRefKey := "4K" + +; --- 获取当前屏幕分辨率 --- +currentW := A_ScreenWidth +currentH := A_ScreenHeight +currentResText := "当前屏幕分辨率: " . currentW . "x" . currentH + +; --- 创建图形用户界面 (GUI) --- +MyGui := Gui("+AlwaysOnTop") +MyGui.Title := "DDB v1.0" + +; 提示信息 +MyGui.Add("Text", "xm y+10", "注意:标题栏和边框均不属于客户区") + +; --- 行 1: 当前分辨率 --- +MyGui.Add("Text", "xm y+10", currentResText) + +; --- 行 2: 目标分辨率 --- +MyGui.Add("Text", "xm y+15", "目标分辨率:") +radio4k := MyGui.Add("Radio", "x+m yp vSelectedResName Checked Group", "4K") +radio2k := MyGui.Add("Radio", "x+m yp", "2K") +radio1080p := MyGui.Add("Radio", "x+m yp", "1080p") + +; --- 行 3: 聚焦窗口 --- +MyGui.Add("Text", "xm y+15", "聚焦窗口:") +gFocusedProgramEdit := MyGui.Add("Edit", "x+m yp w150 ReadOnly Left") + +; --- 行 4: 屏幕位置 --- +MyGui.Add("Text", "xm y+10", "屏幕位置:") +gMouseCoordsEdit := MyGui.Add("Edit", "x+m yp w150 ReadOnly Left") + +; --- 行 5: 窗口位置 --- +MyGui.Add("Text", "xm y+10", "窗口位置:") +gRelativeMouseCoordsEdit := MyGui.Add("Edit", "x+m yp w150 ReadOnly Left") + +; --- 行 6: 客户区矩形 --- +MyGui.Add("Text", "xm y+10", "客户区: ") ; 注意标签后的空格是用户特意加的 +gClientAreaEdit := MyGui.Add("Edit", "x+m yp w150 ReadOnly Left") + +; --- 行 7: 位置颜色 & 复制按钮 & 颜色字符 --- +MyGui.Add("Text", "xm y+10", "位置颜色:") ; 标签 +gPixelColorEdit := MyGui.Add("Edit", "x+m yp w100 ReadOnly Left") ; 显示框 +copyColorButton := MyGui.Add("Button", "x+m yp", "复制") ; 复制按钮 +copyColorButton.OnEvent("Click", CopyPixelColor) +; 使用带颜色的文本字符 '■' 显示颜色,初始为灰色 +myGui.SetFont("s12") +gPixelCharacterBlock := MyGui.Add("Text", "x+m yp c808080", "■") +myGui.SetFont("") + + +; --- 行 8: 换算坐标 & 复制按钮 & 跳转按钮 --- +MyGui.Add("Text", "xm y+10", "换算坐标:") +gCalculatedCoordsEdit := MyGui.Add("Edit", "x+m yp w100 Left", "") ; 允许输入 +copyCoordsButton := MyGui.Add("Button", "x+m yp", "复制") +copyCoordsButton.OnEvent("Click", CopyCalculatedCoords) +jumpButton := MyGui.Add("Button", "y+10", "跳转") ; 跳转按钮另起一行 +jumpButton.OnEvent("Click", JumpToCoords) + +; --- 行 9: 状态信息 --- +gStatusText := MyGui.Add("Text", "xm y+10 w300 vStatusMessage", "按 Ctrl+Alt+Q 获取鼠标信息") ; 初始提示 + +; --- 绑定其他 GUI 事件 --- +radio4k.OnEvent("Click", ResolutionChange) +radio2k.OnEvent("Click", ResolutionChange) +radio1080p.OnEvent("Click", ResolutionChange) +MyGui.OnEvent("Close", GuiClose) + +; --- 显示 GUI --- +MyGui.Show() + +; ============================================================================== +; --- 函数定义 --- +; ============================================================================== + +; --- GUI 事件处理: 分辨率选择变化 --- +ResolutionChange(GuiCtrlObj, Info) { + global gSelectedRefWidth, gSelectedRefHeight, gStatusText, resolutions + selectedName := MyGui["SelectedResName"].Value + logMsg := "" + if RegExMatch(selectedName, "^\w+", &match) { + selectedKey := match[0] + if resolutions.Has(selectedKey) { + gSelectedRefWidth := resolutions[selectedKey][1] + gSelectedRefHeight := resolutions[selectedKey][2] + logMsg := "目标分辨率已更改为 " . selectedKey . " (" . gSelectedRefWidth . "x" . gSelectedRefHeight . ")" + gStatusText.Value := logMsg + } + } +} + +; --- 热键定义: Ctrl+Alt+Q --- +; --- 热键定义: Ctrl+Alt+Q --- +^!Q:: { + ; 引用全局变量 + global MyGui, gFocusedProgramEdit, gCalculatedCoordsEdit, gStatusText, gSelectedRefWidth, gSelectedRefHeight, gMouseCoordsEdit, gRelativeMouseCoordsEdit, gClientAreaEdit, gTargethWnd, gPixelColorEdit, gPixelCharacterBlock + ; 定义局部变量 + local hWnd, progName, winTitle, displayProgInfo, mX, mY, winX, winY, winW, relX, relY, propX, propY, finalX, finalY, isInside := False + local pixelColorRGB, strColor, sixDigitColor + + ; 检查 gPixelCharacterBlock 是否有效 (保留) + if !IsObject(gPixelCharacterBlock) { + MsgBox("脚本错误: 颜色字符控件 'gPixelCharacterBlock' 未初始化。" . "请检查 GUI 创建部分代码是否正确执行。", "初始化错误", "IconError") + Return + } + + ; 强制坐标模式 + CoordMode "Mouse", "Screen" + CoordMode "Pixel", "Screen" + + ; 清空或重置显示字段 + gCalculatedCoordsEdit.Value := "" + gRelativeMouseCoordsEdit.Value := "" + gStatusText.Value := "正在处理..." + gMouseCoordsEdit.Value := "" + gClientAreaEdit.Value := "" + gPixelColorEdit.Value := "" + ; --- ↓↓↓ 直接重置颜色,不再使用 try-catch ↓↓↓ --- + gPixelCharacterBlock.Opt("c808080") ; 重置字符颜色为灰色 (依赖上面的 IsObject 检查) + + ; 获取当前活动窗口 + hWnd := WinActive("A") + if (!hWnd) { + gStatusText.Value := "错误: 未找到活动窗口。" + gFocusedProgramEdit.Value := "N/A" + gTargethWnd := "" + gPixelCharacterBlock.Opt("c808080") ; ★★★ 直接重置 ★★★ + Return + } + gTargethWnd := hWnd + + ; 获取并显示窗口信息 + progName := WinGetProcessName("A") + winTitle := WinGetTitle("A") + displayProgInfo := progName ? progName : (winTitle ? winTitle : "N/A") + gFocusedProgramEdit.Value := displayProgInfo + + ; 获取并显示鼠标屏幕坐标 + MouseGetPos(&mX, &mY) + gMouseCoordsEdit.Value := mX . ", " . mY + + ; 获取并显示像素颜色 及 更新颜色字符 (保留此处的 try-catch) + try { + pixelColorRGB := PixelGetColor(mX, mY, "RGB") + sixDigitColor := Format("{:06X}", pixelColorRGB) + strColor := "0x" . sixDigitColor + gPixelCharacterBlock.Opt("c" . sixDigitColor) ; 设置字符颜色 + gPixelColorEdit.Value := strColor + } catch Error as e { + gPixelColorEdit.Value := "获取失败: " e.Message + gPixelCharacterBlock.Opt("c808080") ; ★★★ 直接重置 ★★★ + } + + ; 获取并显示窗口客户区信息 (保留此处的 try-catch) + try { + WinGetClientPos(&winX, &winY, &winW, &winH, hWnd) + gClientAreaEdit.Value := Format("{},{} {}x{}", winX, winY, winW, winH) + } catch Error as e { + gStatusText.Value := "错误: 获取客户区失败 - " . e.Message + gClientAreaEdit.Value := "Error" + gPixelCharacterBlock.Opt("c808080") ; ★★★ 直接重置 ★★★ + Return + } + + ; 检查窗口尺寸是否有效 + if (winW <= 0 or winH <= 0) { + gStatusText.Value := "错误: 无效窗口尺寸 W:" . winW . ", H:" . winH + gClientAreaEdit.Value := Format("{},{} {}x{}", winX, winY, winW, winH) + gPixelCharacterBlock.Opt("c808080") ; ★★★ 直接重置 ★★★ + Return + } + + ; 进行边界检查 + isInside := (mX >= winX and mX < (winX + winW) and mY >= winY and mY < (winY + winH)) + + ; 根据边界检查结果进行计算和显示 + if (isInside) { + relX := mX - winX + relY := mY - winY + gRelativeMouseCoordsEdit.Value := relX . ", " . relY + + propX := relX / winW + propY := relY / winH + finalX := Round(propX * gSelectedRefWidth) + finalY := Round(propY * gSelectedRefHeight) + gCalculatedCoordsEdit.Value := finalX . ", " . finalY + + gStatusText.Value := "边界检查: 内部" + } else { + gRelativeMouseCoordsEdit.Value := "N/A" + gCalculatedCoordsEdit.Value := "" + gStatusText.Value := "边界检查: 外部(请重新聚焦鼠标)" + } +} ; 热键函数结束 ; 热键函数结束 + +; --- 跳转按钮点击处理函数 --- +JumpToCoords(GuiCtrlObj, Info) { + ; 引用全局变量 + global MyGui, gCalculatedCoordsEdit, gStatusText, gSelectedRefWidth, gSelectedRefHeight, gTargethWnd + + ; 定义局部变量 + local targetX, targetY, propX, propY, desiredRelX, desiredRelY, finalScreenX, finalScreenY + local hWnd, winX, winY, winW, winH + local inputText, match + + gStatusText.Value := "正在处理跳转..." + + ; 检查并使用存储的目标窗口句柄 + if (!gTargethWnd or !WinExist("ahk_id " . gTargethWnd)) { + gStatusText.Value := "错误: 请先用 Ctrl+Alt+Q 记录一个有效的目标窗口。" + gTargethWnd := "" + Return + } + hWnd := gTargethWnd + + ; 获取并验证用户输入的坐标 + inputText := gCalculatedCoordsEdit.Value + if (!RegExMatch(inputText, "^\s*(-?\d+)\s*[,; ]\s*(-?\d+)\s*$", &match)) { + gStatusText.Value := "错误: 无效坐标格式 (请输入 X, Y)" + Return + } + targetX := Integer(match[1]) + targetY := Integer(match[2]) + + ; 可选: 检查输入坐标范围 + if (targetX < 0 or targetX >= gSelectedRefWidth or targetY < 0 or targetY >= gSelectedRefHeight) { + gStatusText.Value := "提示: 输入坐标可能超出目标分辨率范围。" + } + + ; 获取目标窗口的客户区信息 + try { + WinGetClientPos(&winX, &winY, &winW, &winH, hWnd) + if (winW <= 0 or winH <= 0) { + throw Error("无效窗口尺寸 W:" . winW . ", H:" . winH) + } + } catch Error as e { + gStatusText.Value := "错误: 获取目标窗口客户区失败 - " . e.Message + Return + } + + ; 执行反向换算 + if (gSelectedRefWidth <= 0 or gSelectedRefHeight <= 0) { + gStatusText.Value := "错误: 无效的目标分辨率尺寸用于计算。" + Return + } + propX := targetX / gSelectedRefWidth + propY := targetY / gSelectedRefHeight + desiredRelX := propX * winW + desiredRelY := propY * winH + finalScreenX := Round(winX + desiredRelX) + finalScreenY := Round(winY + desiredRelY) + + ; 尝试重新激活目标窗口 + try { + WinActivate("ahk_id " . hWnd) + Sleep 100 + } catch Error as e { + gStatusText.Value := "警告: 激活目标窗口失败 - " e.Message ",仍尝试跳转。" + } + + ; 移动鼠标 + CoordMode "Mouse", "Screen" + MouseMove finalScreenX, finalScreenY, 0 + + ; 更新状态 + gStatusText.Value := "鼠标已跳转至目标窗口对应坐标: " . finalScreenX . ", " . finalScreenY +} + +; --- GUI 关闭处理函数 --- +GuiClose(GuiObj) { + ExitApp() +} + +; --- 复制按钮事件处理函数 --- +CopyPixelColor(GuiCtrlObj, Info) { + global gPixelColorEdit, gStatusText + local colorValue + + colorValue := gPixelColorEdit.Value + if (colorValue != "" && colorValue != "获取失败") { ; 检查是否有有效内容 + A_Clipboard := colorValue + gStatusText.Value := "颜色值 '" colorValue "' 已复制!" + SetTimer(() => (gStatusText.Value == "颜色值 '" colorValue "' 已复制!" ? gStatusText.Value := "" : ""), -2000) + } else { + gStatusText.Value := "没有有效颜色值可复制。" + SetTimer(() => (gStatusText.Value == "没有有效颜色值可复制。" ? gStatusText.Value := "" : ""), -2000) + } +} + +CopyCalculatedCoords(GuiCtrlObj, Info) { + global gCalculatedCoordsEdit, gStatusText + local coordsValue + + coordsValue := gCalculatedCoordsEdit.Value + if (coordsValue != "") { + A_Clipboard := coordsValue + gStatusText.Value := "换算坐标 '" coordsValue "' 已复制!" + SetTimer(() => (gStatusText.Value == "换算坐标 '" coordsValue "' 已复制!" ? (gStatusText.Value := "") : ""), -2000) + } else { + gStatusText.Value := "没有换算坐标可复制。" + SetTimer(() => (gStatusText.Value == "没有换算坐标可复制。" ? (gStatusText.Value := "") : ""), -2000) + } +} \ No newline at end of file diff --git a/lib/FindText.ahk b/lib/FindText.ahk index 99ad688..c62df06 100644 --- a/lib/FindText.ahk +++ b/lib/FindText.ahk @@ -3344,11 +3344,11 @@ Gui(cmd, arg1:="", args*) y:=nY+CutUp+(nH-CutUp-CutDown)//2 s:=StrReplace(s, "Text.=", "Text:="), r:=StrSplit(Lang["s8"] "|||||||", "|") s:="`; #Include `n" - . "`nt1:=A_TickCount, Text:=X:=Y:=`"`"`n" s + . "currentScale := A_ScreenDPI / 96" + . "`nt1:=A_TickCount, Text:=X:=Y:=`"`"" s . "`nif (ok:=FindText(&X, &Y, " x "-150000, " - . y "-150000, " x "+150000, " y "+150000, 0, 0, Text))" - . "`n{" - . "`n `; FindText()." . "Click(" . "X, Y, `"L`")" + . y "-150000, " x "+150000, " y "+150000, 0.1, 0.1, Text,,,,,,, currentScale, currentScale)){" + . "`n `; FindText()." . "Click(" . "X, Y, `"L`")" . "`n}`n" . "`n`; ok:=FindText(&X:=`"wait`", &Y:=3, 0,0,0,0,0,0,Text) `; " r[7] . "`n`; ok:=FindText(&X:=`"wait0`", &Y:=-1, 0,0,0,0,0,0,Text) `; " r[8] From f92478a67b6a61ad8ac319720e125d5e384e016b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E4=B8=80=E4=B8=80?= <1204244136@qq.com> Date: Wed, 7 May 2025 00:44:14 +0800 Subject: [PATCH 05/40] =?UTF-8?q?perf:=20=E9=87=8D=E5=86=99=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E3=80=81=E5=B7=A8=E9=87=8F=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DoroHelper.ahk | 2985 +++++++++++++++++++++--------------------------- 1 file changed, 1330 insertions(+), 1655 deletions(-) diff --git a/DoroHelper.ahk b/DoroHelper.ahk index e18cd61..ca191d2 100644 --- a/DoroHelper.ahk +++ b/DoroHelper.ahk @@ -7,11 +7,12 @@ CoordMode "Mouse", "Client" sleepTime := 1500 scrRatio := 1.0 ;consts +currentScale := A_ScreenDPI / 96 ;确定缩放比例 stdScreenW := 3840 stdScreenH := 2160 waitTolerance := 50 colorTolerance := 15 -currentVersion := "v0.1.23" +currentVersion := "v1.0.0-beta.1" usr := "kyokakawaii" repo := "DoroHelper" ;颜色判断 @@ -34,6 +35,12 @@ UserClick(sX, sY, k) { uY := Round(sY * k) Send "{Click " uX " " uY "}" ; 点击转换后的坐标 } +;坐标转换-移动 +UserMove(sX, sY, k) { + uX := Round(sX * k) ; 计算转换后的坐标 + uY := Round(sY * k) + Send "{Click " uX " " uY " " 0 "}" ; 点击转换后的坐标 +} ;坐标转换-颜色 UserCheckColor(sX, sY, sC, k) { loop sX.Length { @@ -107,7 +114,7 @@ isAutoOff(sX, sY, k) { CheckAutoBattle() { static autoBurstOn := false static autoAimOn := false - ; 检查并开启自动瞄准 (Auto Aim) + ; 检查并开启自动瞄准 if !autoAimOn && UserCheckColor([216], [160], ["0xFFFFFF"], scrRatio) { ; 如果自动瞄准按钮是灰色/关闭状态 if isAutoOff(60, 57, scrRatio) { @@ -116,7 +123,7 @@ CheckAutoBattle() { } autoAimOn := true ; 设置标志位,表示已尝试开启或已开启 } - ; 检查并开启自动爆裂 (Auto Burst) + ; 检查并开启自动爆裂 if !autoBurstOn && UserCheckColor([216], [160], ["0xFFFFFF"], scrRatio) { ; 假设检查点与 Auto Aim 相同 ; 如果自动爆裂按钮是灰色/关闭状态 if isAutoOff(202, 66, scrRatio) { @@ -126,847 +133,608 @@ CheckAutoBattle() { autoBurstOn := true ; 设置标志位,表示已尝试开启或已开启 } } -;登录 -Login() { +;点左下角的小房子的对应位置 +Confirm() { + AddLog("点击默认位置") stdTargetX := 333 stdTargetY := 2041 UserClick(stdTargetX, stdTargetY, scrRatio) Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) +} +GoBack() { + AddLog("返回上级页面") + Send "{Esc}" + Sleep sleepTime +} +;结算招募 +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就一直点左下角(加速动画) + 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)) { + FindText().Click(X, Y, "L") Sleep sleepTime - ;点击蓝色的确认按钮(如果出现更新提示等消息) - Text:="|<确认>*192$51.zz1zyDy7s0s0TUzkz0601y3y7s0U0TkTkzksT3z3y7yC3kTwzkzlk00zzy7wC0073zkzU800kDy7s1X761zkz0AMMsDw7s1U07lzUT2A00yDw3sFU07lzUT2AMMyDs1sFX77kb2DWAEEy0kkwF007k663W800y0VsA1737k8D0U0wsy23w407W7UUTUXkw0wC7y6SDU7nlzsU" - if (ok:=FindText(&X, &Y, 1429-150000, 906-150000, 1429+150000, 906+150000, 0, 0, Text)){ - FindText().Click(X, Y, "L") - Sleep sleepTime - } - if A_Index > waitTolerance * 50 { - MsgBox "登录失败!" - Pause -1 + } +} +; 点掉推销 +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)) { + 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)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Sleep sleepTime +} +; 进入战斗 +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)) { + FindText().Click(X, Y, "L") + AddLog("已点击进入战斗") + Sleep sleepTime + return True + } + else return False +} +;战斗结算 +BattleSettlement() { + Victory := 0 + 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)) { + ;看到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)) { + 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)) { + AddLog("战斗成功!尝试进入下一关") + FindText().Click(X, Y, "L") + Victory := Victory + 1 + if Victory > 1 { + AddLog("共胜利" Victory "次") + } + } + ; 没有编队也没有下一关就点Esc(普通情况或者爬塔次数用完了) + else { + AddLog("战斗结束!") + GoBack + Sleep sleepTime + return True + } } } } ;返回大厅 BackToHall() { - stdTargetX := 333 - stdTargetY := 2041 - Click(333, 2041, scrRatio) - Sleep sleepTime - Text:="|<大厅>*161$39.znzzzzzwTzU00zXzw007wTzXzzzXzwTzs007WDz000w000007W00z0zwTXzs7zXwTz0zwTXzkXzbwTyADwzXzVlzbwTsS7szXy7sD7wT1zUty3sTy6DUTU" ;大厅底部的文本 - while !(ok:=FindText(&X, &Y, 1294-150000, 1334-150000, 1294+150000, 1334+150000, 0.3, 0.3, Text)) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - Pause -1 - } + 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)) { ;如果没有找到大厅的文本 + 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 } -;1: 防御前哨基地奖励 -OutpostDefence() { - stdTargetX := 1092 - stdTargetY := 1795 - UserClick(stdTargetX, stdTargetY, scrRatio) ; 点击进入前哨基地 - Sleep sleepTime - ; 等待进入前哨基地的标准检查点 - stdCkptX := [1500, 1847] - stdCkptY := [1816, 1858] - desiredColor := ["0xF8FCFD", "0xF7FCFD"] - loopCounter := 0 ; 独立的循环计数器 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) +;进入方舟 +EnterToArk() { + AddLog("尝试进入方舟") + Text方舟 := "|<方舟内部左上角的文本>*111$36.zXzzVzzXzzVzz1zs03001s03001s33sDzsVXwTzslXw07st3w07U00w07U00sT7kX3sz7sXXkz7kVXkz7llXVy7VzX3UDXy37kDXy7zszzzDU" ;判断方舟内部左上角的文本是否存在 + Text大厅 := "|<大厅方舟的图标>*161$56.000zzk000001zzzs00001zzzzU0001zzzzy0001zzzzzs000zzzzzz000TzyDzzw00Dzy3VzzU07zy0s7zw03zz0C0zzU1zzU3U7zw0zzs3w0zzUDzw3zkDzw7zz1zy1zz1zzUTzkDzszzsDzy3zzDzzzzzUzznzzzzzzzzyTzzzzzzzzrzy7zzzzzxzzUzzzzzzDzw7zy3zzlzz0zz0zzsTzsDzkTzw3zy0zs7zz0Tzk7k3zzU3zy0s0zzk0TzkC0Tzw03zy3UDzw00TzssDzz003zzzzzz000DzzzzzU001zzzzzk0007zzzzk0000Dzzzk00000zzzU000000zy0008" + while True { Sleep sleepTime - loopCounter += 1 - if loopCounter > waitTolerance { ; 使用独立的计数器判断超时 - MsgBox "进入防御前哨失败! (超时)" - Pause -1 - } - if loopCounter > 10 { ; 尝试次数过多,可能卡住 - MsgBox "进入防御前哨尝试次数过多,退出。" - ; 可以选择是否在退出前尝试返回大厅 - Pause -1 - } - } - ; 点击 "一举歼灭" 按钮 - stdTargetX := 1686 - stdTargetY := 1846 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - ; 等待 "一举歼灭" 界面加载完成(通过检查点消失判断) - stdCkptX := [1500, 1847] ; 使用与进入时相同的检查点 - stdCkptY := [1816, 1858] - desiredColor := ["0xF8FCFD", "0xF7FCFD"] - loopCounter := 0 ; 重置计数器 - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) ; 持续点击直到界面变化 - Sleep sleepTime - loopCounter += 1 - if loopCounter > waitTolerance { - MsgBox "进入一举歼灭失败! (超时)" - Pause -1 - } - if loopCounter > 10 { - MsgBox "进入一举歼灭尝试次数过多,退出。" - Pause -1 - } - } - ; 检查是否有免费扫荡次数 (按钮非灰色) - sweepCkptX := [1933] - sweepCkptY := [1648] - sweepGrayColor := ["0xE9ECF0"] ; 灰色按钮颜色 - if !UserCheckColor(sweepCkptX, sweepCkptY, sweepGrayColor, scrRatio) { - ; --- 如果有免费次数,执行扫荡 --- - sweepTargetX := 2093 ; 扫荡按钮 X - sweepTargetY := 1651 ; 扫荡按钮 Y - UserClick(sweepTargetX, sweepTargetY, scrRatio) - Sleep sleepTime - sweepConfirmCkptX := [1933] ; 扫荡确认界面检查点 X - sweepConfirmCkptY := [1648] ; 扫荡确认界面检查点 Y - sweepConfirmColor := ["0x11ADF5"] ; 扫荡确认界面特征颜色 - loopCounter := 0 ; 重置计数器 - while UserCheckColor(sweepConfirmCkptX, sweepConfirmCkptY, sweepConfirmColor, scrRatio) { - UserClick(sweepTargetX, sweepTargetY, scrRatio) ; 持续点击扫荡按钮直到确认界面消失 + if (ok := FindText(&X := "wait", &Y := 3, 1809 - 150000, 962 - 150000, 1809 + 150000, 962 + 150000, 0.3, 0.3, Text大厅, , , , , , , currentScale, currentScale)) { ;查找并点击大厅的方舟按钮 + FindText().Click(X, Y, "L") ;找得到就尝试进入 Sleep sleepTime - ; 检查并处理可能的次级弹窗 (例如资源不足提示) - if UserCheckColor([2088], [1327], ["0x00A0EB"], scrRatio) { - UserClick(2202, 1342, scrRatio) ; 点击次级弹窗确认 - Sleep sleepTime ; 等待次级弹窗消失 - } - loopCounter += 1 - if loopCounter > 10 { ; 设置扫荡确认的超时次数 - MsgBox "扫荡确认超时,退出。" - Pause -1 + if (ok := FindText(&X := "wait", &Y := 3, 1294 - 150000, 1334 - 150000, 1294 + 150000, 1334 + 150000, 0.3, 0.3, Text方舟, , , , , , , currentScale, currentScale)) { + AddLog("已进入方舟") + break } } + else BackToHall() ; 找不到就先返回大厅 } - popupCkptX := [2356] - popupCkptY := [1870] - popupDesiredColor := ["0x0EAFF4"] - popupTargetX := 2156 - popupTargetY := 1846 - popupLoopCounter := 0 ; 为此弹窗处理循环设置独立计数器 - while !UserCheckColor(popupCkptX, popupCkptY, popupDesiredColor, scrRatio) { - UserClick(popupTargetX, popupTargetY, scrRatio) ; 点击确认按钮区域 - Sleep sleepTime - ; 检查并处理另一个可能的次级弹窗 - if UserCheckColor([2088], [1327], ["0x00A0EB"], scrRatio) { - UserClick(2202, 1342, scrRatio) ; 点击次级弹窗的确认 - Sleep sleepTime ; 等待次级弹窗消失 - } - popupLoopCounter += 1 - if popupLoopCounter > 10 { ; 设置一个合理的超时次数 - MsgBox("处理弹窗超时,退出。") - Pause -1 - } - } - ; 点击 "获得奖励" 按钮 - rewardTargetX := 2156 - rewardTargetY := 1846 - UserClick(rewardTargetX, rewardTargetY, scrRatio) Sleep sleepTime - ; 等待返回大厅 - hallCkptX := [64] - hallCkptY := [470] - hallDesiredColor := ["0xFAA72C"] - loopCounter := 0 ; 重置计数器 - while !UserCheckColor(hallCkptX, hallCkptY, hallDesiredColor, scrRatio) { - UserClick(rewardTargetX, rewardTargetY, scrRatio) ; 持续点击直到返回大厅 - Sleep sleepTime - ; 再次检查并处理可能的次级弹窗 - if UserCheckColor([2088], [1327], ["0x00A0EB"], scrRatio) { - UserClick(2202, 1342, scrRatio) - Sleep sleepTime - } - loopCounter += 1 - if loopCounter > waitTolerance { ; 使用全局超时容忍度 - MsgBox("前哨基地防御奖励领取后返回大厅异常! (超时)") - Pause -1 - } - } } -;2: 付费商店每日每周免费钻 -CashShop() { - ;进入商店 - stdTargetX := 1163 - stdTargetY := 1354 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [158, 199] - stdCkptY := [525, 439] - desiredColor := ["0x0DC2F4", "0x3B3E41"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - if UserCheckColor([2047], [1677], ["0x00A0EB"], scrRatio) or UserCheckColor([2047], [1677], ["0x9A9B9A"], - scrRatio) { - UserClick(1789, 1387, scrRatio) +;登录 +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)) { ;如果没有找到大厅的文本 + 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)) { + AddLog("发现更新,尝试点击") + FindText().Click(X, Y, "L") Sleep sleepTime - UserClick(1789, 1387, scrRatio) + } + Text := "|<一周内不再提示的空框>*200$28.7zzzVzzzz7zzzyzzzzzk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000DzzzzxzzzzXzzzwU" + if (ok := FindText(&X, &Y, 1076 - 150000, 1030 - 150000, 1076 + 150000, 1030 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + AddLog("发现公告,尝试勾选一周内不再提示后关闭") + FindText().Click(X, Y, "L") Sleep sleepTime - UserClick(2144, 1656, scrRatio) - Sleep sleepTime - while UserCheckColor([2047], [1677], ["0x00A0EB"], scrRatio) { - UserClick(2144, 1656, scrRatio) + Text := "|<叉叉>*174$29.bzzzxDzzzmDzzz6DzzwSDzzlyDzz7yDzwTyDzlzyDz7zyDwTzyDlzzy77zzy8Tzzy1zzzy7zzzs7zzzU7zzy67zzsS7zzVy7zy7y7zsTy7zVzy7y7zy7sTzy7Vzzy67zzy0Tzzy1zzzyE" + if (ok := FindText(&X, &Y, 1640 - 150000, 337 - 150000, 1640 + 150000, 337 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + FindText().Click(X, Y, "L") Sleep sleepTime } - break - } - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if UserCheckColor([2088], [1327], ["0x00A0EB"], scrRatio) { - UserClick(2202, 1342, scrRatio) - } - if A_Index > waitTolerance { - MsgBox "进入付费商店失败!" - Pause -1 - } - } - Sleep sleepTime - if UserCheckColor([2047], [1677], ["0x00A0EB"], scrRatio) or UserCheckColor([2047], [1677], ["0x9A9B9A"], scrRatio) { - UserClick(1789, 1387, scrRatio) - Sleep sleepTime - UserClick(1789, 1387, scrRatio) - Sleep sleepTime - UserClick(2144, 1656, scrRatio) - Sleep sleepTime - while UserCheckColor([2047], [1677], ["0x00A0EB"], scrRatio) { - UserClick(2144, 1656, scrRatio) - Sleep sleepTime - } - } - delta := false - stdCkptX := [52] - stdCkptY := [464] - desiredColor := ["0xF7FCFD"] - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) - delta := true - stdTargetX := 256 - if delta - stdTargetX := 432 - stdTargetY := 486 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [194] - if delta - stdCkptX := [373] - stdCkptY := [436] - desiredColor := ["0x0FC7F5"] - if delta - desiredColor := ["0x0BC7F4"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "进入礼包页面失败!" - Pause -1 - } - } - stdCkptX := [514] - stdCkptY := [1018] - desiredColor := ["0xF2F8FC"] - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - stdTargetX := stdTargetX - 172 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - } - del := 336 - stdCkptX := [1311] - stdCkptY := [612] - desiredColor := ["0xA0A0AC"] - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) - del := 0 - ;每日 - stdTargetX := 545 - del - stdTargetY := 610 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [431 - del] - stdCkptY := [594] - desiredColor := ["0x0EC7F5"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "进入每日礼包页面失败!" - Pause -1 - } - } - stdTargetX := 212 - stdTargetY := 1095 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - ;每周 - stdTargetX := 878 - del - stdTargetY := 612 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [769 - del] - stdCkptY := [600] - desiredColor := ["0x0CC8F4"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "进入每周礼包页面失败!" - Pause -1 - } - } - stdTargetX := 212 - stdTargetY := 1095 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - ;每月 - stdTargetX := 1211 - del - stdTargetY := 612 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1114 - del] - stdCkptY := [600] - desiredColor := ["0x0CC8F4"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "进入每月礼包页面失败!" - Pause -1 - } - } - stdTargetX := 212 - stdTargetY := 1095 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - ;回到大厅 - stdTargetX := 333 - stdTargetY := 2041 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "退出付费商店失败!" - Pause -1 } } + AddLog("已处于大厅页面,登录成功") } -;3: 免费商店 - 判断指定坐标的颜色对应哪种手册,并返回用户是否勾选了购买该手册 -BuyThisBook(coor, k) { - global g_settings ; <--- 添加对全局 g_settings 的访问 - uX := Round(coor[1] * k) - uY := Round(coor[2] * k) - uC := PixelGetColor(uX, uY) - ; 将十六进制颜色代码转换为 RGB 十进制值 - R := Format("{:d}", "0x" . SubStr(uC, 3, 2)) - G := Format("{:d}", "0x" . SubStr(uC, 5, 2)) - B := Format("{:d}", "0x" . SubStr(uC, 7, 2)) - ; 判断颜色并返回对应的 g_settings 值 (用户是否勾选了购买) - if (B > G and B > R) { - ; 蓝色为主 -> 水冷手册 ("BookWater") - return g_settings["BookWater"] ; - } - if (G > R and G > B) { - ; 绿色为主 -> 风压手册 ("BookWind") - return g_settings["BookWind"] ; - } - if (R > G and G > B and G > 80) { - ; 铁甲手册 ("BookIron") - return g_settings["BookIron"] ; - } - if (R > B and B > G and B > 80) { - ; 电击手册 ("BookElec") - return g_settings["BookElec"] - } - ; 默认情况或主要是纯红色 -> 燃烧手册 ("BookFire") - return g_settings["BookFire"] ; (作为默认或纯红色的情况) -} -; 白嫖一次普通商店 -ShopFreeClaim() { - local claimTargetX, claimTargetY, confirmCkptX, confirmCkptY, confirmColor, confirmTargetX, confirmTargetY, - shopCkptX, shopCkptY, shopColor, loopCounter ; 使用 local 避免污染全局 - ; --- 点击领取按钮 --- - claimTargetX := 383 - claimTargetY := 1480 - UserClick(claimTargetX, claimTargetY, scrRatio) - Sleep sleepTime - ; --- 等待确认弹窗 --- - confirmCkptX := [2063] - confirmCkptY := [1821] - confirmColor := ["0x079FE4"] - loopCounter := 0 - while !UserCheckColor(confirmCkptX, confirmCkptY, confirmColor, scrRatio) { - UserClick(claimTargetX, claimTargetY, scrRatio) ; 如果没等到,再点一下领取按钮 - Sleep sleepTime // 2 - loopCounter += 1 - if loopCounter > waitTolerance { - MsgBox "普通商店免费领取:等待确认弹窗超时!" - Pause -1 - } - } - ; --- 点击确认按钮 --- - confirmTargetX := 2100 - confirmTargetY := 1821 - UserClick(confirmTargetX, confirmTargetY, scrRatio) - Sleep sleepTime - ; --- 等待返回商店主界面 --- - shopCkptX := [118] - shopCkptY := [908] - shopColor := ["0xF99217"] - loopCounter := 0 - while !UserCheckColor(shopCkptX, shopCkptY, shopColor, scrRatio) { - UserClick(confirmTargetX, confirmTargetY, scrRatio) ; 如果没等到,再点一下确认按钮 - Sleep sleepTime // 2 - loopCounter += 1 - if loopCounter > waitTolerance { - MsgBox "普通商店免费领取:等待返回商店界面超时!" - Pause -1 - } - } - ; --- 单次免费领取完成 --- -} -FreeShop(numOfBook) { - global g_settings, isBoughtTrash, scrRatio, sleepTime, waitTolerance ; 确保访问全局变量 - ;进入商店 - stdTargetX := 1193 - stdTargetY := 1487 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - shopCkptX := [118] - shopCkptY := [908] - shopDesiredColor := ["0xF99217"] ; 商店主界面特征颜色 - loopCounter := 0 - while !UserCheckColor(shopCkptX, shopCkptY, shopDesiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) ; 点击进入商店 +; 前哨基地收菜 +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)) { + AddLog("点击进入前哨基地") + FindText().Click(X, Y, "L") Sleep sleepTime - loopCounter += 1 - if loopCounter > waitTolerance { - MsgBox "进入普通商店失败!" - Pause -1 - } - } - ; 检查第一次免费领取是否可用 (按钮非蓝色) - firstClaimCkptX := [349] - firstClaimCkptY := [1305] - firstClaimUsedColor := ["0x127CD7"] ; 领取过的按钮颜色 - if !UserCheckColor(firstClaimCkptX, firstClaimCkptY, firstClaimUsedColor, scrRatio) { - ShopFreeClaim() ; 执行第一次免费领取 - ; 检查是否还有第二次免费次数 (刷新按钮是否有红点) - refreshCkptX := [697] - refreshCkptY := [949] - refreshAvailableColor := ["0xFB5C24"] ; 有免费刷新次数的红点颜色 - if UserCheckColor(refreshCkptX, refreshCkptY, refreshAvailableColor, scrRatio) { - ; --- 执行刷新操作 --- - refreshTargetX := 476 - refreshTargetY := 981 - UserClick(refreshTargetX, refreshTargetY, scrRatio) ; 点击刷新按钮 - Sleep sleepTime - ; 等待刷新确认弹窗 - refreshPopupCkptX := [2133] - refreshPopupCkptY := [1345] - refreshPopupColor := ["0x00A0EB"] - loopCounter := 0 ; 重置计数器 - while !UserCheckColor(refreshPopupCkptX, refreshPopupCkptY, refreshPopupColor, scrRatio) { - UserClick(refreshTargetX, refreshTargetY, scrRatio) ; 继续点刷新 - Sleep sleepTime // 2 - loopCounter += 1 - if loopCounter > waitTolerance { - MsgBox "普通商店刷新:等待确认弹窗超时!" - Pause -1 - } - } - ; 点击刷新确认按钮 - refreshConfirmX := 2221 - refreshConfirmY := 1351 - UserClick(refreshConfirmX, refreshConfirmY, scrRatio) - Sleep sleepTime - ; 等待刷新完成,返回商店主界面 - loopCounter := 0 ; 重置计数器 - ; 点击一个空白区域确保焦点不在按钮上,防止意外点击 - fallbackClickX := 588 - fallbackClickY := 1803 - while !UserCheckColor(shopCkptX, shopCkptY, shopDesiredColor, scrRatio) { - UserClick(fallbackClickX, fallbackClickY, scrRatio) ; 点击空白区域 - Sleep sleepTime // 2 - loopCounter += 1 - if loopCounter > waitTolerance { - MsgBox "普通商店刷新:确认后返回商店超时!" - Pause -1 - } - } - Sleep 1000 ; 刷新后额外等待一下界面加载 - ShopFreeClaim() ; 执行第二次免费领取 - } - } - ;废铁商店检查是否已经购买 - stdTargetX := 137 - stdTargetY := 1737 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [137] - stdCkptY := [1650] - desiredColor := ["0xFB931A"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "废铁商店进入异常!" - Pause -1 - } - } - if sleepTime < 1500 - Sleep 500 - global isBoughtTrash - stdCkptX := [349] - stdCkptY := [1305] - desiredColor := ["0x137CD5"] - if !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - isBoughtTrash := 0 } else { - isBoughtTrash := 1 + AddLog("未找到前哨基地!返回") + return } - ;如果需要,则购买竞技场商店前三本书 - if (numOfBook >= 1 or g_settings["CompanyWeapon"]) { - stdTargetX := 134 - stdTargetY := 1403 - UserClick(stdTargetX, stdTargetY, scrRatio) + 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)) { + AddLog("点击左下角资源") + FindText().Click(X, Y, "L") Sleep sleepTime - stdCkptX := [134] - stdCkptY := [1316] - desiredColor := ["0xFA9318"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "竞技场商店进入异常!" - Pause -1 - } - } - if sleepTime < 1500 - Sleep 500 } - if numOfBook >= 1 { - ;购买第一本书 - ;如果今天没买过 - stdCkptX := [349] - stdCkptY := [1305] - desiredColor := ["0x127CD7"] - ;如果今天没买过 - if !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) and BuyThisBook([378, 1210], scrRatio) { - stdTargetX := 384 - stdTargetY := 1486 - UserClick(stdTargetX, stdTargetY, scrRatio) + Text := "|<免费一举歼灭的红点>*194$67.000000000C0000000000zs000000000sD000000001k1k00000001kwQ00000000lz600000000lzlU0000000tzwk0000000Rzy80000000QzzbzzzzzzzyTzm00000003Dzt00000000nztU0000000Nzwk00000004TwM000000017wM00000000k0M00000000A0M000000001zs0000000007s0000000003k0000000001U0000000000k0000000000M0000000000A0E" + if (ok := FindText(&X, &Y, 1251 - 150000, 1136 - 150000, 1251 + 150000, 1136 + 150000, 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)) { + AddLog("点击进行歼灭") + FindText().Click(X, Y, "L") Sleep sleepTime - stdCkptX := [2067] - stdCkptY := [1770] - desiredColor := ["0x07A0E4"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "第一本书购买异常!" - Pause -1 - } - } - stdTargetX := 2067 - stdTargetY := 1770 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [134] - stdCkptY := [1316] - desiredColor := ["0xFA9318"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index >= 2 { - stdTargetX := 2067 - stdTargetY := 1970 - } - if A_Index > waitTolerance { - MsgBox "第一本书购买异常!" - Pause -1 - } + Text := "|<获得奖励的图标>*191$34.zzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzk00TzzU01zzz00Dzzw01zzzs07zzzk0zzzz07zwTy0Tw1zw3zk7zkTz0TzVzw1zzDzk7zxzz0Tzzzw1zzzzk7zzzz0Tzzzw1zzzzk3zzzz000000000001U00007U0001s" + while !(ok := FindText(&X, &Y, 1375 - 150000, 1168 - 150000, 1375 + 150000, 1168 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + Confirm + Sleep sleepTime } } } - if numOfBook >= 2 { - ;购买第二本书 - ;如果今天没买过 - stdCkptX := [673] - stdCkptY := [1305] - desiredColor := ["0x137CD5"] - if !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) and BuyThisBook([702, 1210], scrRatio) { - stdTargetX := 702 - stdTargetY := 1484 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2067] - stdCkptY := [1770] - desiredColor := ["0x07A0E4"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "第二本书购买异常!" - Pause -1 - } - } - stdTargetX := 2067 - stdTargetY := 1770 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [134] - stdCkptY := [1316] - desiredColor := ["0xFA9318"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index >= 2 { - stdTargetX := 2067 - stdTargetY := 1970 - } - if A_Index > waitTolerance { - MsgBox "第二本书购买异常!" - Pause -1 - } - } - } + 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)) { + AddLog("点击收菜") + FindText().Click(X, Y, "L") + Sleep sleepTime } - if numOfBook >= 3 { - ;购买第三本书 - ;如果今天没买过 - stdCkptX := [997] - stdCkptY := [1304] - desiredColor := ["0x147BD4"] - if !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) and BuyThisBook([1025, 1210], scrRatio) { - stdTargetX := 1030 - stdTargetY := 1485 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2067] - stdCkptY := [1770] - desiredColor := ["0x07A0E4"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "第三本书购买异常!" - Pause -1 - } - } - stdTargetX := 2067 - stdTargetY := 1770 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [134] - stdCkptY := [1316] - desiredColor := ["0xFA9318"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index >= 2 { - stdTargetX := 2067 - stdTargetY := 1970 - } - if A_Index > waitTolerance { - MsgBox "第三本书购买异常!" - Pause -1 - } - } - } - } - if g_settings["CompanyWeapon"] { - stdCkptX := [2011] - stdCkptY := [1213] - desiredColor := ["0xD65E46"] - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - stdTargetX := 2017 - stdTargetY := 1485 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2067] - stdCkptY := [1770] - desiredColor := ["0x07A0E4"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "公司武器熔炉购买异常!" - Pause -1 - } - } - stdTargetX := 2067 - stdTargetY := 1770 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [134] - stdCkptY := [1316] - desiredColor := ["0xFA9318"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index >= 2 { - stdTargetX := 2067 - stdTargetY := 1970 - } - if A_Index > waitTolerance { - MsgBox "公司武器熔炉购买异常!" - Pause -1 - } - } - } - } - stdTargetX := 333 - stdTargetY := 2041 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "退出免费商店失败!" - Pause -1 - } + 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)) { + Confirm + Sleep sleepTime } + AddLog("已返回前哨基地主页面") + AddLog("==========前哨基地收菜任务结束==========") + if g_settings["Expedition"] ;派遣 + Expedition() + BackToHall() } -;4: 派遣 +; 派遣 Expedition() { - ;进入前哨基地 - stdTargetX := 1169 - stdTargetY := 1663 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入前哨基地失败!" - Pause -1 - } - } - stdCkptX := [1907, 1963, 1838, 2034] - stdCkptY := [1817, 1852, 1763, 1877] - desiredColor := ["0xFFFFFF", "0xFFFFFF", "0x0B1219", "0x0B1219"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入前哨基地失败!" - Pause -1 - } - } - ;派遣公告栏 - ;收菜 - stdTargetX := 2002 - stdTargetY := 2046 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2113, 2119, 2387] - stdCkptY := [372, 399, 384] - desiredColor := ["0x404240", "0x404240", "0x404240"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入派遣失败!" - Pause -1 - } - } - stdTargetX := 2268 - stdTargetY := 1814 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - Sleep 3000 - ;全部派遣 - stdCkptX := [1869, 1977] - stdCkptY := [1777, 1847] - desiredColor := ["0xCFCFCF", "0xCFCFCF"] - ;如果今天没派遣过 - if !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - stdTargetX := 1930 - stdTargetY := 1813 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2199, 2055] - stdCkptY := [1796, 1853] - desiredColor := ["0x00ADFF", "0x00ADFF"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + 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)) { + Text := "|<带红点的派遣公告栏>*134$89.zzzzzzzzzzzzzUDzzzzzzzzzzzzw07zzzzzzzzzzzzkQ7zzzzzzzzzzzz3yDzzzzzzzzzzzyDyTzzzzzzzzzzzszwzzzzzzzzzzzzlzxzzzzzzzzzzzzXzvzzzzzzzzzzzz1zrzzzzzzzzzzzy0TDzzzzzzzzzzzw0STzzzzzzzzzzzw00zzzzzzkzzzzzs01zzzzzy0zzzzzs07zzzzzk0Tzzzzs0Tzzzzz00Dzzzzw3zzzzzs007zzzzzzzzzzz0707zzzzzzzzzzs0TU3zzzzzzzzzz03zU1zzzzzzzzzw0T7k0zzzzzzzzzU3s3s0zzzzzzzzw0DXVw0Tzzzzzzzk1wDlw0Dzzzzzzy0DVzky07zzzzzzk1wDzsT07zzzzzy07kzzwDU3zzzzzk0y7zzyDU1zzzzzU7kzzzy7k1zzzzz0z7zzzz3s3zzzzw3szzvzzVw7zzzzsD3zzXzzlsDzzzzkQTzy3zzkkTzzzzktzzs3zztUzzzzz1nzzU3zzn1zzzzy3bzzU7zza3zzzzw7DzzUTzzA7zzzzwCTzzVzzyMDzzzzkQzTzbzrwkTzzzzUtyTzzzjtUzzzzz1nwzzzyTn1zzzzy3bszzzwza3zzzzw7DlzzzlzA7zzzzsCTVzzzXyMDzzzzkQz3z7y7wkTzzzzUty3w7wDtUzzzzz1nw7k7kTn1zzzzy3bs7030za3zzzzw7Dk4021zA7zzzzsCTU0003yMDzzzzkQz00007wkTzzzzkty0000DtUzzzzz1nw0000Tn1zzzzy3bs0000za3zzzzw7Dw0003zA7zzzzsCTw000TyMDzzzzkQzy003zwkTzzzzUsTz00DzVUzzzzz1wTzU1zwD1zzzzy1wDzUDzVw3zzzzw0y7zlzyDU7zzzzw0T7zzzky0Dzzzzw0DXzzy7k1zzzzzy0DVzzky07zzzzzz07kzz7k0zzzzzzz03sTsT07zzzzzzzU3wT3s0zzzzzzzzk1w8T03zzzzzzzzs0y3s0Tzzzzzzzzs0TDU3zzzzzzzzzw0Tw0Tzzzzzzzzzy0DU1zzzzzzzzzzz060Dzzzzzzzzzzz001zzzzzzzzzzzzU0Dzzzzzzzzzzzzk0zzzzzzzzzzzzzs7zzzzzzzzzzzzzszzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzTzzzzzzzzzzTUtk3wtzaTwtnzw81l07lly03tl7zwUzW0DXlw03VmDzz47s0CDlk0C00Dzi0Ds0sTVbXy00Ty40wM1lXX00CDzzy81kk3qDi00QTzzzk0lU7wTzzzkE7zzYVn0Dlny07UUDzs9ba0T7bs063zzzmHDA0wD7lyADzzz4UA01k07XwSTzzyF0E01U0D00wk1zwaQr03XyS01tU3zs" + if (ok := FindText(&X := "wait", &Y := 5, 1341 - 150000, 1290 - 150000, 1341 + 150000, 1290 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + AddLog("点击派遣公告栏") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "全部派遣失败!" - Pause -1 + Text := "|<全部领取的符号>*190$28.zz3zzzwDzzzkzzzz3zzzwDzzzkzzzz3zzzwDzzzkzzzU07zy00zzw03zzs0TzzU3zzz0Dz7y1zUTs7y1zkzs7zbzUTyzy1zzzs7zzzUTzzy1zzzs7zzzU000000000U0006" + if (ok := FindText(&X := "wait", &Y := 3, 1431 - 150000, 1150 - 150000, 1431 + 150000, 1150 + 150000, 0, 0, Text, , , , , , , currentScale, currentScale)) { + AddLog("点击全部领取") + FindText().Click(X, Y, "L") + Sleep sleepTime + Confirm + Sleep sleepTime } - if UserCheckColor([1779], [1778], ["0xCFCFCF"], scrRatio) - break - } - stdTargetX := 2073 - stdTargetY := 1818 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2199, 2055] - stdCkptY := [1796, 1853] - desiredColor := ["0x00ADFF", "0x00ADFF"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "全部派遣失败!" - Pause -1 + 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)) { + 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)) { + AddLog("点击全部派遣") + FindText().Click(X, Y, "L") + Sleep sleepTime } } + else AddLog("奖励已领取!返回") } - ;回到大厅 - stdTargetX := 333 - stdTargetY := 2041 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退出前哨基地失败!" - Pause -1 - } - } + else AddLog("派遣公告栏未找到!") + AddLog("==========派遣委托任务结束==========") } -;5: 好友点数收取 +; 付费商店每日每周免费钻 +CashShop() { + BackToHall + 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)) { + Text := "|<带点的商店>*197$82.000000000008zs00000000000lz000000000003Vk00000000000304000000000007Xk00000000000Dw000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000s000000001k007U00000000D00Tzz0000000zzz7zzw000000DzzwTzzk000000zzz1zC00000000DXk7Uw00000000STMS3zk000000TzzVsDz0000001zzy7Uzw0000007zysS3k0000000TxzVsTy0000001zXy7zzs0000007zzsTzzU000000TzvVrkS0000001rbiDS1s0000007TysxzzU000000RzvXrzy0000001rzyCTzs000000787sNs00000000Q0C00000000001U0000000000008" + if (ok := FindText(&X, &Y, 934 - 150000, 854 - 150000, 934 + 150000, 854 + 150000, 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)) { + 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)) { + 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)) { + 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)) { + Confirm + } + } + } + } + else AddLog("付费商店已领取!") + } + else AddLog("付费商店未找到!") + AddLog("==========付费商店任务结束==========") + BackToHall +} +;普通商店 +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)) { + AddLog("点击商店图标") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + else { + AddLog("未找到商店图标") + BackToHall + 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)) { + 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)) { + 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)) { + 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)) { + Confirm + } + } + else { + 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)) { + 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)) { + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, 236 - 150000, 100 - 150000, 236 + 150000, 100 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + AddLog("点击购买") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + else { + AddLog("只使用信用点购买,跳过") + GoBack + } + } + ;确认至百货商店页面 + Text := "|<百货>**50$39.0000tk3zzyDzyzzzrbTy007tt3k00wC0zzDz00zTtzxCD9U0Rts3A01XDUtbyAzzzAzta00lbyAk06A01aTslU0AnbaAztaQxlbzAnbyA01jlXtU0RUS3AzngDyNzzxzlzDkT7k3o" + while !(ok := FindText(&X, &Y, 226 - 150000, 99 - 150000, 226 + 150000, 99 + 150000, 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)) { + Text := "|<刷新的图标>*154$19.zlzz07y00C7w77z37z1bzs3zzVzz8zzUTzlzzs7zwUDwMDwA7wC0sD80Dz0Tk" + while (ok := FindText(&X, &Y, 612 - 150000, 646 - 150000, 612 + 150000, 646 + 150000, 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)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + else break + } + AddLog("==========普通商店任务结束==========") +} +; 竞技场商店 +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)) { + 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"] { + 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)) { + 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)) { + 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"] { + 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)) { + 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)) { + 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"] { + 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)) { + 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)) { + 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"] { + 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)) { + 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)) { + 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"] { + 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)) { + 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)) { + 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"] { + 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)) { + 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)) { + 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"] { + 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)) { + 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)) { + 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"] { + 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)) { + 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)) { + Confirm + } + } + } + AddLog("==========竞技场商店任务结束==========") +} +; 废铁商店 +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)) { + 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)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + ; 珠宝领了就默认整个任务做完了 + else { + AddLog("已执行,跳过") + AddLog("==========废铁商店任务结束==========") + BackToHall + 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)) { + 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)) { + 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)) { + Confirm + } + } + } + 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)) { + 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)) { + 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)) { + 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)) { + Confirm + } + } + } + } + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + Confirm + } + } + } + AddLog("==========废铁商店任务结束==========") +} +; 好友点数收取 FriendPoint() { stdTargetX := 3729 stdTargetY := 553 @@ -980,7 +748,7 @@ FriendPoint() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入好友界面失败!" - Pause -1 + Pause } } stdCkptX := [2104, 2197] @@ -993,7 +761,7 @@ FriendPoint() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入好友界面失败!" - Pause -1 + Pause } } while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { @@ -1001,7 +769,7 @@ FriendPoint() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "赠送好友点数失败" - Pause -1 + Pause } } stdTargetX := 333 @@ -1016,484 +784,290 @@ FriendPoint() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出好友界面失败!" - Pause -1 + Pause } } } -;6: 模拟室5C +; 模拟室 SimulationRoom() { - stdTargetX := 2689 - stdTargetY := 1463 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + EnterToArk + 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)) { + AddLog("进入模拟室") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + else { + AddLog("进入模拟室失败!") + BackToHall + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + AddLog("今日模拟室已通关") + GoBack + AddLog("==========模拟室任务结束==========") + return + } + 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)) { + FindText().Click(X, Y, "L") Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - Pause -1 - } } - stdCkptX := [1641] - stdCkptY := [324] - desiredColor := ["0x01D4F6"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + Text := "|*164$26.01zU03zz03zzw1zzzUzzzwTzzy7zUz3z03lzU08Tk007s003y000z000Dk003w000z000Dk003w000z000Dk001y000Tk007w000zk0MDy0T1zzzsDzzz1zzzUDzzk1zzs07zs007U2" + if (ok := FindText(&X, &Y, 1431 - 150000, 843 - 150000, 1431 + 150000, 843 + 150000, 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)) { + AddLog("点击快速模拟") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - Pause -1 - } } - ;进入模拟室 - stdTargetX := 1547 - stdTargetY := 1138 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1829, 2024] - stdCkptY := [1122, 1094] - desiredColor := ["0xF8FCFD", "0xF8FCFD"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + 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)) { + AddLog("跳过增益选择") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入模拟室失败!" - Pause -1 - } } - ;开始模拟 - stdTargetX := 1917 - stdTargetY := 1274 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2054, 2331] - stdCkptY := [719, 746] - desiredColor := ["0xF8FBFD", "0xF8FBFD"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + 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)) { + AddLog("点击模拟结束") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入选关失败!" - Pause -1 - } } - ;选择5C - stdTargetX := 2127 - stdTargetY := 1074 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - stdTargetX := 2263 - stdTargetY := 1307 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - ;点击开始模拟 - ;开始模拟 - stdTargetX := 2216 - stdTargetY := 1818 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1991] - stdCkptY := [1814] - desiredColor := ["0xFA801A"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + 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)) { + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "开始模拟失败!" - Pause -1 - } - } - stdTargetX := 1903 - stdTargetY := 1369 - stdCkptX := [304] - stdCkptY := [179] - desiredColor := ["0x858289"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入buff选择页面失败!" - Pause -1 - } - } - stdCkptX := [1760] - yy := 2160 - stdCkptY := [yy] - desiredColor := ["0xDFE1E1"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - yy := yy - 30 - stdCkptY := [yy] - if A_Index > waitTolerance { - ExitApp - } - } - stdTargetX := 1760 - stdTargetY := yy - stdCkptX := [2053] - stdCkptY := [1933] - desiredColor := ["0x2E77C1"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入战斗准备页面失败!" - Pause -1 - } - } - ;点击进入战斗 - stdTargetX := 2225 - stdTargetY := 2004 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - stdCkptX := [1420, 2335] - stdCkptY := [1243, 1440] - desiredColor := ["0xFFFFFF", "0xFE0203"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - ;UserClick(stdTargetX, stdTargetY - 300, scrRatio) - CheckAutoBattle() - Sleep sleepTime - if A_Index > waitTolerance * 2 { - ;MsgBox "模拟室boss战异常!" - break - } - } - stdTargetX := 1898 - stdTargetY := 1996 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2115] - stdCkptY := [1305] - stdCkptX2 := [2115] - stdCkptY2 := [1556] - desiredColor := ["0xEFF3F5"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) && !UserCheckColor(stdCkptX2, stdCkptY2, - desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "模拟室结束异常!" - Pause -1 - } - } - if colorTolerance != 15 { - Sleep 5000 - } - ;点击模拟结束 - stdTargetX := 1923 - stdTargetY := 1276 - if UserCheckColor(stdCkptX2, stdCkptY2, desiredColor, scrRatio) { - stdTargetX := 1923 - stdTargetY := 1552 - } - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - ;退回大厅 - stdTargetX := 333 - stdTargetY := 2041 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - Pause -1 - } } + AddLog("==========模拟室任务结束==========") } - -;7: 新人竞技场收菜 +; 模拟室超频 +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)) { + 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)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + else { + AddLog("本次模拟室超频已完成!") + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + AddLog("==========模拟室超频任务结束==========") +} +; 新人竞技场收菜 Arena() { - ;进入方舟 - stdTargetX := 2689 - stdTargetY := 1463 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - Pause -1 + EnterToArk() ;进入方舟 + 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)) { + 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)) { + AddLog("点击领取") + FindText().Click(X, Y, "L") + Sleep sleepTime + Confirm() } } - stdCkptX := [1641] - stdCkptY := [324] - desiredColor := ["0x01D4F6"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + 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)) { + 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)) { + AddLog("点击竞技场") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - Pause -1 - } } - ;收pjjc菜 - if sleepTime < 1500 - Sleep 1000 - stdTargetX := 2278 - stdTargetY := 1092 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - stdTargetX := 2129 - stdTargetY := 1920 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 } -;新人竞技场 -RookieArena(times) { - ;进入竞技场 - stdTargetX := 2208 - stdTargetY := 1359 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1641] - stdCkptY := [324] - desiredColor := ["0x01D4F6"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) +; 新人竞技场 +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)) { + AddLog("点击新人竞技场") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入竞技场失败!" - Pause -1 - } } - stdCkptX := [1683] - stdCkptY := [606] - desiredColor := ["0xF7FCFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + 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代表从下往上找 + AddLog("有免费次数,尝试进入战斗") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入竞技场失败!" - Pause -1 - } - } - ;进入新人竞技场 - stdTargetX := 1647 - stdTargetY := 1164 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [784] - stdCkptY := [1201] - desiredColor := ["0xF8FCFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > 5 { - ;退回大厅 - stdTargetX := 333 - stdTargetY := 2041 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + ;检测是否开启快速战斗 + 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)) { + 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)) { + AddLog("有笨比没开自动战斗,帮忙开了!") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - Pause -1 - } - } - return - } - if A_Index > waitTolerance { - MsgBox "进入新人竞技场失败!" - Pause -1 - } - } - loop times { - ;点击进入战斗 - stdTargetX := 2371 - stdTargetY := 1847 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2700] - stdCkptY := [1691] - desiredColor := ["0xF7FCFE"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "选择对手失败!" - Pause -1 } } ;点击进入战斗 - stdTargetX := 2123 - stdTargetY := 1784 - UserClick(stdTargetX, stdTargetY, scrRatio) + EnterToBattle + ; 确认结算 + BattleSettlement Sleep sleepTime - stdCkptX := [2784] - stdCkptY := [1471] - desiredColor := ["0xF8FCFD"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "新人竞技场作战失败!" - Pause -1 - } - } } - ;退回大厅 - stdTargetX := 333 - stdTargetY := 2041 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - Pause -1 - } + 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)) { + GoBack } + AddLog("已返回竞技场页面") + AddLog("==========新人竞技场任务结束==========") } ;特殊竞技场 -SpecialArena(times) { - ;进入竞技场 - stdTargetX := 2208 - stdTargetY := 1359 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1641] - stdCkptY := [324] - desiredColor := ["0x01D4F6"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) +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)) { + AddLog("点击特殊竞技场") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入竞技场失败!" - Pause -1 - } } - stdCkptX := [1683] - stdCkptY := [606] - desiredColor := ["0xF7FCFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + 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代表从下往上找 + AddLog("有免费次数,尝试进入战斗") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入竞技场失败!" - Pause -1 - } - } - ;进入特殊竞技场 - stdTargetX := 1647 - stdTargetY := 1164 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [784] - stdCkptY := [1201] - desiredColor := ["0xF8FCFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > 5 { - ;退回大厅 - stdTargetX := 333 - stdTargetY := 2041 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + ;检测是否开启快速战斗 + 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)) { + 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)) { + AddLog("有笨比没开自动战斗,帮忙开了!") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - Pause -1 - } - } - return - } - if A_Index > waitTolerance { - MsgBox "进入新人竞技场失败!" - Pause -1 - } - } - loop times { - ;点击进入战斗 - stdTargetX := 2371 - stdTargetY := 1847 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2700] - stdCkptY := [1691] - desiredColor := ["0xF7FCFE"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "选择对手失败!" - Pause -1 } } ;点击进入战斗 - stdTargetX := 2123 - stdTargetY := 1784 - UserClick(stdTargetX, stdTargetY, scrRatio) + EnterToBattle + ; 确认结算 + BattleSettlement Sleep sleepTime - stdCkptX := [2784] - stdCkptY := [1471] - desiredColor := ["0xF8FCFD"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "新人竞技场作战失败!" - Pause -1 - } - } } - ;退回大厅 - stdTargetX := 333 - stdTargetY := 2041 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - Pause -1 - } + ;如果左上角有特殊竞技场就点返回 + 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)) { + GoBack } + AddLog("已返回竞技场页面") + AddLog("==========特殊竞技场任务结束==========") } -;8: 对前n位nikke进行好感度咨询(可以通过收藏把想要咨询的nikke排到前面) +ChampionArena() { + ;进入冠军竞技场(点竞技场里的特殊竞技场) +} +; 对前n位nikke进行好感度咨询(可以通过收藏把想要咨询的nikke排到前面) NotAllCollection() { stdCkptX := [2447] stdCkptY := [1464] @@ -1514,7 +1088,7 @@ LoveTalking(times) { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入妮姬列表失败!" - Pause -1 + Pause } } stdCkptX := [1466, 1814] @@ -1524,7 +1098,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入妮姬列表失败!" - Pause -1 + Pause } } ;进入咨询页面 @@ -1550,7 +1124,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - Pause -1 + Pause } } return @@ -1559,7 +1133,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入咨询页面失败!" - Pause -1 + Pause } } ;点进第一个妮姬 @@ -1575,7 +1149,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入妮姬咨询页面失败!" - Pause -1 + Pause } } loop times { @@ -1597,7 +1171,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入妮姬咨询页面失败!" - Pause -1 + Pause } } ;点击确定 @@ -1613,7 +1187,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "快速咨询失败!" - Pause -1 + Pause } } } @@ -1635,7 +1209,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "咨询失败!" - Pause -1 + Pause } } ;点击确认 @@ -1651,7 +1225,7 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "咨询失败!" - Pause -1 + Pause } } stdCkptX := [1504] @@ -1667,7 +1241,7 @@ LoveTalking(times) { Sleep sleepTime // 2 if A_Index > waitTolerance * 2 { MsgBox "咨询失败!" - Pause -1 + Pause } } } @@ -1690,7 +1264,7 @@ LoveTalking(times) { break 2 if A_Index > waitTolerance { MsgBox "咨询失败!" - Pause -1 + Pause } } } @@ -1707,11 +1281,11 @@ LoveTalking(times) { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - Pause -1 + Pause } } } -;9: 爬塔一次(做每日任务) +; 爬塔一次(做每日任务) FailTower() { stdTargetX := 2689 stdTargetY := 1463 @@ -1725,7 +1299,7 @@ FailTower() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入方舟失败!" - Pause -1 + Pause } } stdCkptX := [1641] @@ -1735,7 +1309,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入方舟失败!" - Pause -1 + Pause } } ;进入无限之塔 @@ -1751,7 +1325,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入无限之塔失败!" - Pause -1 + Pause } } stdTargetX := 1953 @@ -1766,7 +1340,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "选择作战失败!" - Pause -1 + Pause } } stdTargetX := 2242 @@ -1781,7 +1355,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入作战失败!" - Pause -1 + Pause } } ;按esc @@ -1795,7 +1369,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "按esc失败!" - Pause -1 + Pause } } ;按放弃战斗 @@ -1809,7 +1383,7 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "放弃战斗失败!" - Pause -1 + Pause } } ;退回大厅 @@ -1825,264 +1399,108 @@ FailTower() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - Pause -1 + Pause } } } -MissionCompleted() { - stdCkptX := [3451, 3756] - stdCkptY := [2077, 2075] - desiredColor := ["0x00A1FF", "0x00A1FF"] - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) - return true - else - return false -} -MissionFailed() { - stdCkptX := [2306, 1920, 1590, 1560] - stdCkptY := [702, 1485, 1489, 1473] - desiredColor1 := ["0xB71013", "0xE9E9E7", "0x161515", "0xE9E9E7"] - desiredColor2 := ["0xAD080B", "0xE9E9E7", "0x161515", "0xE9E9E7"] - if UserCheckColor(stdCkptX, stdCkptY, desiredColor1, scrRatio) or UserCheckColor(stdCkptX, stdCkptY, desiredColor2, - scrRatio) - return true - else - return false -} -MissionEnded() { - stdCkptX := [3494, 3721, 3526, 3457, 3339, 3407] - stdCkptY := [2086, 2093, 2033, 2043, 2040, 2043] - desiredColor := ["0x6F6F6F", "0x6F6F6F", "0x030303", "0x434343", "0xE6E6E6", "0x000000"] - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) - return true - else - return false -} -;输出失败的企业塔 -failedTower := Array() -CompanyTowerInfo() { - info := "" - loop failedTower.Length { - info := info failedTower[A_Index] " " +; 通用塔 +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)) { + AddLog("点击无限之塔") + FindText().Click(X, Y, "L") + Sleep sleepTime } - if info != "" { - info := "`n" info "已经爬不动惹dororo..." + 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)) { + AddLog("点击塔内的无限之塔") + FindText().Click(X, Y, "L") + Sleep sleepTime } - return info + 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)) { + AddLog("已进入塔的内部") + stdTargetX := 1926 + stdTargetY := 908 + Sleep sleepTime + AddLog("点击最新关卡") + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + EnterToBattle + BattleSettlement + sleep 3000 + RefuseSale + } + AddLog("==========通用塔任务结束==========") + BackToHall } -;10: 企业塔 +; 企业塔 CompanyTower() { - stdTargetX := 2689 - stdTargetY := 1463 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - Pause -1 - } + 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)) { + AddLog("点击无限之塔") + FindText().Click(X, Y, "L") + Sleep sleepTime } - stdCkptX := [1641] - stdCkptY := [324] - desiredColor := ["0x01D4F6"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - Pause -1 - } + ; 只要有一座塔是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)) { + AddLog("今日企业塔已打过,返回") + AddLog("==========企业塔任务结束==========") + BackToHall + return } - ;进入无限之塔 - stdTargetX := 2278 - stdTargetY := 776 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2405] - stdCkptY := [1014] - desiredColor := ["0xF8FBFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + 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代表从左往右 + count := ok.Length + AddLog("今天有" count "座塔要打") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入无限之塔失败!" - Pause -1 - } - } - Sleep 1500 - ;尝试进入每座企业塔 - targX := [1501, 1779, 2061, 2332] - targY := [1497, 1497, 1497, 1497] - ckptX := [1383, 1665, 1935, 2222] - ckptY := [1925, 1925, 1925, 1925] - loop targX.Length { - i := A_Index - stdTargetX := targX[i] - stdTargetY := targY[i] - stdCkptX := [ckptX[i]] - stdCkptY := [ckptY[i]] - desiredColor := ["0x00AAF4"] - ;如果未开放,则检查下一个企业 - if !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) - continue - ;点击进入企业塔 - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入企业塔失败!" - Pause -1 - } - } - ;直到成功进入企业塔 - stdCkptX := [3738] - stdCkptY := [447] - desiredColor := ["0xF8FCFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入企业塔失败!" - Pause -1 - } - } - ;进入关卡页面 - stdTargetX := 1918 - stdTargetY := 919 - stdCkptX := [992] - stdCkptY := [2011] - desiredColor := ["0x000000"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入企业塔关卡页面失败!" - Pause -1 - } - } - ;如果战斗次数已经用完 - Sleep 1000 - stdCkptX := [2038] - stdCkptY := [2057] - desiredColor := ["0x4D4E50"] - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - stdCkptX := [3738] - stdCkptY := [447] - desiredColor := ["0xF8FCFE"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Send "{Escape}" - Sleep sleepTime - } - stdCkptX := [2405] - stdCkptY := [1014] - desiredColor := ["0xF8FBFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) - Sleep sleepTime - Sleep 1500 - continue - } - ;点击进入战斗 - stdTargetX := 2249 - stdTargetY := 1997 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - ;等待战斗结束 -WaitForBattleEnd: - while !(MissionCompleted() || MissionFailed() || MissionEnded()) { - CheckAutoBattle() - Sleep sleepTime - if A_Index > waitTolerance * 20 { - MsgBox "企业塔自动战斗失败!" - Pause -1 - } - } - ;如果战斗失败或次数用完 - if MissionFailed() || MissionEnded() { - if MissionFailed() { - towerName := "" - global failedTower - switch i { - case 1: - towerName := "极乐净土塔" - case 2: - towerName := "米西利斯塔" - case 3: - towerName := "泰特拉塔" - case 4: - towerName := "朝圣者塔" - default: - towerName := "" + 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)) { + 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)) { + AddLog("这座塔是泰特拉之塔") } - failedTower.Push towerName - } - Send "{Escape}" - Sleep sleepTime - while MissionFailed() || MissionEnded() { - Send "{Escape}" + Text := "|<极乐>**50$38.DU001zXTzlzzMr0AM02xk360DiDRljzn1rMPP0sxrgqk7DMDDjxXq3k03MNxg00S6DPz7z7VaTvzVvPaStdQknbjTrSRnPnxb3tyyH9WCwBokvnz3DDzzkzk1s007k2" + if (ok := FindText(&X, &Y, 1316 - 150000, 1206 - 150000, 1316 + 150000, 1206 + 150000, 0.1, 0.1, Text, , , , , , , currentScale, currentScale)) { + AddLog("这座塔是极乐净土之塔") + } + stdTargetX := 1926 + stdTargetY := 908 Sleep sleepTime - } - stdCkptX := [3738] - stdCkptY := [447] - desiredColor := ["0xF8FCFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(3666, 1390, scrRatio) + AddLog("点击最新关卡") + UserClick(stdTargetX, stdTargetY, scrRatio) Sleep sleepTime - if UserCheckColor([2088], [1327], ["0x00A0EB"], scrRatio) { - UserClick(2202, 1342, scrRatio) + if !(EnterToBattle()) { + GoBack Sleep sleepTime - } - } - Sleep 5000 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(3666, 1390, scrRatio) - Sleep sleepTime - if UserCheckColor([2088], [1327], ["0x00A0EB"], scrRatio) { - UserClick(2202, 1342, scrRatio) + stdTargetX := 2239 + stdTargetY := 1868 + AddLog("点击下一个塔") + UserClick(stdTargetX, stdTargetY, scrRatio) Sleep sleepTime + continue } + BattleSettlement + sleep 3000 + RefuseSale } - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Send "{Escape}" - Sleep sleepTime - } - stdCkptX := [2405] - stdCkptY := [1014] - desiredColor := ["0xF8FBFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) - Sleep sleepTime - Sleep 1500 - continue - } - ;如果战斗胜利 - while MissionCompleted() { - Send "t" - Sleep sleepTime - } - goto WaitForBattleEnd - } - ;退回大厅 - stdTargetX := 301 - stdTargetY := 2030 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - Pause -1 + stdTargetX := 2239 + stdTargetY := 1868 + AddLog("点击下一个塔") + UserClick(stdTargetX, stdTargetY, scrRatio) } + AddLog("所有塔都打过了") } + AddLog("==========企业塔任务结束==========") + BackToHall } ;11: 进入异拦 Interception() { @@ -2099,7 +1517,7 @@ Interception() { Sleep sleepTime // 2 if A_Index > waitTolerance { MsgBox "进入方舟失败!" - Pause -1 + Pause } } stdCkptX := [1641] @@ -2109,7 +1527,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入方舟失败!" - Pause -1 + Pause } } ;进入拦截战 @@ -2125,7 +1543,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入拦截战失败!" - Pause -1 + Pause } } stdTargetX := 559 @@ -2168,7 +1586,7 @@ Interception() { desiredColor := ["0xFD000F"] default: MsgBox "BOSS选择错误!" - Pause -1 + Pause } stdTargetX := 1556 stdTargetY := 886 @@ -2177,7 +1595,7 @@ Interception() { Sleep 2000 if A_Index > waitTolerance { MsgBox "选择BOSS失败!" - Pause -1 + Pause } } ;点击挑战按钮 @@ -2194,7 +1612,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退回大厅失败!" - Pause -1 + Pause } } return @@ -2209,7 +1627,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "点击挑战失败!" - Pause -1 + Pause } } ;选择编队 @@ -2241,7 +1659,7 @@ Interception() { stdCkptY := [1428] default: MsgBox "BOSS选择错误!" - Pause -1 + Pause } desiredColor := ["0x02ADF5"] while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { @@ -2249,7 +1667,7 @@ Interception() { Sleep 1500 if A_Index > waitTolerance { MsgBox "选择编队失败!" - Pause -1 + Pause } } ;如果不能快速战斗,就进入战斗 @@ -2267,7 +1685,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入战斗失败!" - Pause -1 + Pause } } ;退出结算页面 @@ -2281,7 +1699,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance * 20 { MsgBox "自动战斗失败!" - Pause -1 + Pause } } while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { @@ -2289,7 +1707,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出结算页面失败!" - Pause -1 + Pause } } } @@ -2301,7 +1719,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出结算页面失败!" - Pause -1 + Pause } } ;快速战斗 @@ -2318,7 +1736,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "快速战斗失败!" - Pause -1 + Pause } } ;退出结算页面 @@ -2331,7 +1749,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "快速战斗结算失败!" - Pause -1 + Pause } } while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { @@ -2339,7 +1757,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出结算页面失败!" - Pause -1 + Pause } } ;检查是否退出 @@ -2350,7 +1768,7 @@ Interception() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出结算页面失败!" - Pause -1 + Pause } } Sleep 1000 @@ -2361,24 +1779,38 @@ Interception() { desiredColor := ["0xF96B2F"] } ;退回大厅 - stdTargetX := 301 - stdTargetY := 2030 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + BackToHall +} +;排名奖励 +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)) { + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - Pause -1 + 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)) { + 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)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + Confirm + GoBack + } + } + stdTargetX := 1858 + stdTargetY := 615 + UserMove(stdTargetX, stdTargetY, scrRatio) + Send "{WheelDown 30}" } } + BackToHall } -;11: 邮箱收取 +; 邮箱收取 Mail() { + Sleep sleepTime stdTargetX := 3667 stdTargetY := 81 UserClick(stdTargetX, stdTargetY, scrRatio) @@ -2391,7 +1823,7 @@ Mail() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入邮箱失败!" - Pause -1 + Pause } } stdCkptX := [2085] @@ -2414,11 +1846,11 @@ Mail() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出邮箱失败!" - Pause -1 + Pause } } } -;12: 任务收取 +; 任务收取 Mission() { stdTargetX := 3341 stdTargetY := 206 @@ -2432,7 +1864,7 @@ Mission() { Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入任务失败!" - Pause -1 + Pause } } stdTargetX := 2286 @@ -2456,7 +1888,7 @@ Mission() { x0 := x0 + 280 ;向右切换标题 } } -;13: 通行证收取 兼容双通行证 兼容特殊活动 +; 通行证收取 兼容双通行证 兼容特殊活动 Pass() { OnePass() stdCkptX := [3395] @@ -2518,7 +1950,7 @@ OnePass() { ;执行一次通行证 Sleep sleepTime if A_Index > waitTolerance { MsgBox "进入通行证失败!" - Pause -1 + Pause } } stdCkptX := [1733] @@ -2567,7 +1999,7 @@ OnePass() { ;执行一次通行证 Sleep sleepTime if A_Index > waitTolerance { MsgBox "退出通行证失败!" - Pause -1 + Pause } } stdCkptX := [3395] @@ -2578,9 +2010,132 @@ OnePass() { ;执行一次通行证 if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { } } -;通用塔 -UniversalTower() { - +; 免费招募 +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)) { + 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)) { + 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)) { + FindText().Click(X, Y, "L") + Recruit() + } + else { + ; 点击翻页 + Sleep sleepTime + stdTargetX := 3774 + stdTargetY := 1147 + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + } + } + } + BackToHall() +} +; 德雷克·反派之路 +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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + Confirm + } + } + } + BackToHall() +} +Cooperate() { + ; 把鼠标移动到活动栏 + stdTargetX := 150 + stdTargetY := 257 + 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)) { + Sleep sleepTime + FindText().Click(X, Y, "L") + break + } + ;没找到就滚轮滚 + else { + Send "{WheelDown 5}" + Sleep sleepTime + } + ;找不到就退出 + if (A_Index > 20) { + return + } + } + 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)) { + 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)) { + BackToHall + return + } + } + else { + BackToHall + return + } + 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)) { + 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)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + break + } + if A_Index > waitTolerance { + MsgBox "进入作战失败!" + Pause + } + } + BattleSettlement + Sleep 5000 + } } ; 通用函数,用于切换 g_settings Map 中的设置值 ToggleSetting(settingKey, guiCtrl, *) { @@ -2590,10 +2145,6 @@ ToggleSetting(settingKey, guiCtrl, *) { ; 可选: 如果需要,可以在这里添加日志记录 ; ToolTip("切换 " settingKey " 为 " g_settings[settingKey]) } -ChangeOnNumOfBook(GUICtrl, *) { - global g_numeric_settings - g_numeric_settings["NumOfBook"] := GUICtrl.Value - 1 -} ChangeOnInterceptionBoss(GUICtrl, *) { global g_numeric_settings g_numeric_settings["InterceptionBoss"] := GUICtrl.Value @@ -2651,7 +2202,6 @@ ClickOnHelp(*) { } ClickOnDoro(*) { WriteSettings() - global g_settings, g_numeric_settings ; title := "勝利女神:妮姬" try { WinGetClientPos , , &userScreenW, &userScreenH, "勝利女神:妮姬" @@ -2661,7 +2211,7 @@ ClickOnDoro(*) { numNikke := WinGetCount(title) ;多开检测 if numNikke = 0 { MsgBox "未检测到NIKKE主程序" - Pause -1 + Pause } loop numNikke { nikkeID := WinGetIDLast(title) @@ -2671,49 +2221,68 @@ ClickOnDoro(*) { ;nikkeID := WinWait(title) WinActivate nikkeID Login() ;登陆到主界面 - if g_settings["OutpostDefence"] ; 使用键名检查 Map - OutpostDefence() - if g_settings["CashShop"] - CashShop() - if g_settings["FreeShop"] - FreeShop(g_numeric_settings["NumOfBook"]) - if g_settings["OutpostDefence"] ; 任务需要执行两次 - OutpostDefence() - if g_settings["Expedition"] - Expedition() - if g_settings["FriendPoint"] - FriendPoint() - if g_settings["SimulationRoom"] + if g_settings["Shop"] { + if g_settings["CashShop"] + CashShop() + if g_settings["NormalShop"] + NormalShop() + if g_settings["ArenaShop"] + ArenaShop() + if g_settings["ScrapShop"] + ScrapShop() + BackToHall + } + if g_settings["SimulationRoom"] { SimulationRoom() + if g_settings["SimulationOverClock"] ;模拟室超频 + SimulationOverClock() + BackToHall + } if g_settings["Arena"] { - Arena() ;收菜 + Arena() if g_settings["RookieArena"] ;新人竞技场 - RookieArena(g_numeric_settings["NumOfRookieBattle"]) - if g_settings["SpecialArena"] ;新人竞技场 - SpecialArena(g_numeric_settings["NumOfSpecialBattle"]) - else - BackToHall() + RookieArena() + if g_settings["SpecialArena"] ;特殊竞技场 + SpecialArena() + if g_settings["ChampionArena"] ;冠军竞技场 + ChampionArena() + BackToHall } if g_settings["LoveTalking"] LoveTalking(g_numeric_settings["NumOfLoveTalking"]) - if g_settings["FailTower"] - FailTower() - if g_settings["CompanyTower"] - CompanyTower() + if g_settings["Tower"] { + if g_settings["CompanyTower"] + CompanyTower() + if g_settings["UniversalTower"] + UniversalTower() + BackToHall + } if g_settings["Interception"] Interception() - if g_settings["Mail"] - Mail() - if g_settings["Mission"] - Mission() - if g_settings["Pass"] - Pass() - if g_settings["UniversalTower"] - UniversalTower() + if g_settings["Award"] { + if g_settings["OutpostDefence"] ; 使用键名检查 Map + OutpostDefence() + if g_settings["RankingReward"] ;方舟排名奖励 + RankingReward() + if g_settings["FriendPoint"] + FriendPoint() + if g_settings["Mail"] + Mail() + if g_settings["Mission"] + Mission() + if g_settings["Pass"] + Pass() + if g_settings["FreeRecruit"] + FreeRecruit() + if g_settings["RoadToVillain"] + RoadToVillain() + if g_settings["Cooperate"] + Cooperate() + BackToHall + } } - if isBoughtTrash == 0 - MsgBox "协同作战商店似乎已经刷新了,快去看看吧" - MsgBox "Doro完成任务!" CompanyTowerInfo() + MsgBox "Doro完成任务!" + CalculateAndShowSpan() if g_settings["SelfClosing"] ExitApp Pause @@ -2735,10 +2304,6 @@ IsCheckedToString(foo) { else return "" } -NumOfBookToLabel() { - global g_numeric_settings - return String(g_numeric_settings["NumOfBook"] + 1) -} InterceptionBossToLabel() { global g_numeric_settings return String(g_numeric_settings["InterceptionBoss"]) @@ -2781,50 +2346,65 @@ LoadSettings() { SaveSettings(*) { WriteSettings() MsgBox "设置已保存!" + AddLog("设置已保存!") } ; 全局设置 Map 对象 global g_settings := Map( - "OutpostDefence", 1, ; 前哨基地防御 + "Debug", 1, ; Debug模式开关 + "Award", 1, ; 奖励领取总开关 + "OutpostDefence", 1, ; 前哨基地收菜 "CashShop", 1, ; 付费商店 - "FreeShop", 1, ; 免费商店 + "Shop", 1, ; 商店总开关 + "NormalShop", 1, ; 普通商店 + "NormalShopDust", 1, ; 普通商店:芯尘盒 + "ArenaShop", 1, ; 竞技场商店 + "BookFire", 1, ; 竞技场商店:燃烧手册 + "BookWater", 1, ; 竞技场商店:水冷手册 + "BookWind", 1, ; 竞技场商店:风压手册 + "BookElec", 1, ; 竞技场商店:电击手册 + "BookIron", 1, ; 竞技场商店:铁甲手册 + "BookBox", 1, ; 竞技场商店:手册宝箱 + "ArenaShopPackage", 1, ; 竞技场商店:简介个性化礼包 + "ArenaShopFurnace", 1, ; 竞技场商店:公司武器熔炉 + "ScrapShop", 1, ; 废铁商店 + "ScrapShopGem", 1, ; 废铁商店:珠宝 + "ScrapShopVoucher", 1, ; 废铁商店:好感券 + "ScrapShopResources", 1, ; 废铁商店:养成资源 "Expedition", 1, ; 派遣 (之前是 isCheckedExpedtion) "FriendPoint", 1, ; 好友点数 "Mail", 1, ; 邮箱 "Mission", 1, ; 任务 "Pass", 1, ; 通行证 "SimulationRoom", 1, ; 模拟室 + "SimulationOverClock", 1, ; 模拟室超频 "Arena", 1, ; 竞技场收菜 + "RankingReward", 1, ; 排名奖励 "RookieArena", 1, ; 新人竞技场 "SpecialArena", 1, ; 特殊竞技场 + "ChampionArena", 0, ; 冠军竞技场 "LoveTalking", 1, ; 咨询 - "CompanyWeapon", 0, ; 企业武器熔炉 (商店) - "Interception", 0, ; 拦截战 + "CompanyWeapon", 1, ; 企业武器熔炉 (商店) + "Interception", 1, ; 拦截战 + "Tower", 1, ; 无限之塔总开关 "CompanyTower", 1, ; 企业塔 - "UniversalTower", 1, ; 通用塔 - "FailTower", 0, ; 每日爬塔任务 + "UniversalTower", 0, ; 通用塔 "LongTalk", 1, ; 详细咨询 (若图鉴未满) "AutoCheckUpdate", 0, ; 自动检查更新 - "SelfClosing", 0, ; 完成后自动关闭程序 - "BookFire", 0, ; 手册:燃烧 - "BookWater", 0, ; 手册:水冷 - "BookWind", 0, ; 手册:风压 - "BookElec", 0, ; 手册:电击 - "BookIron", 0, ; 手册:铁甲 + "SelfClosing", 1, ; 完成后自动关闭程序 + "FreeRecruit", 1, ; 活动期间每日免费招募 + "RoadToVillain", 1, ; 德雷克·反派之路 + "Cooperate", 1, ; 协同作战 ;"CheckBox",0 ; 简介个性化礼包 ) ; 其他非简单开关的设置 Map 对象 global g_numeric_settings := Map( - "NumOfBook", 3, ; 购买手册数量 - "NumOfRookieBattle", 5, ; 新人竞技场次数 - "NumOfSpecialBattle", 5, ; 新人竞技场次数 "NumOfLoveTalking", 10, ; 咨询次数 "InterceptionBoss", 1 ; 拦截战BOSS选择 ) -global isBoughtTrash := 1 ; 检测废铁商店 ;检测管理员身份 if !A_IsAdmin { MsgBox "请以管理员身份运行Doro" - Pause -1 + ExitApp } ;读取设置 SetWorkingDir A_ScriptDir @@ -2865,81 +2445,175 @@ AddCheckboxSetting(guiObj, settingKey, displayText, options := "") { doroGui := Gui(, "Doro小帮手" currentVersion) doroGui.Opt("+Resize") doroGui.MarginY := Round(doroGui.MarginY * 0.9) -doroGui.SetFont("cred s12") +doroGui.SetFont("cred s12 ") doroGui.Add("Text", "R1", "紧急停止按ctrl + 1 暂停按ctrl + 2") doroGui.Add("Link", " R1", '项目地址') doroGui.SetFont() -doroGui.Add("Button", "R1 x+10", "帮助").OnEvent("Click", ClickOnHelp) -doroGui.Add("Button", "R1 x+10", "检查更新").OnEvent("Click", ClickOnCheckForUpdate) +doroGui.Add("Button", "R1 x+10", "帮助") +.OnEvent("Click", ClickOnHelp) +doroGui.Add("Button", "R1 x+10", "检查更新") +.OnEvent("Click", ClickOnCheckForUpdate) Tab := doroGui.Add("Tab3", "xm") ;由于autohotkey有bug只能这样写 -Tab.Add(["设置", "收获", "商店", "日常", "默认"]) +Tab.Add(["设置", "任务", "商店", "战斗", "奖励"]) Tab.UseTab("设置") +doroGui.SetFont("cred s10 Bold") +doroGui.Add("Text", , "除非你知道自己在做什么,否则不要修改") +doroGui.SetFont() AddCheckboxSetting(doroGui, "AutoCheckUpdate", "自动检查更新(确保能连上github)", "R1.2") AddCheckboxSetting(doroGui, "SelfClosing", "任务完成后自动关闭程序", "R1.2") -doroGui.Add("Text", , "点击间隔(单位毫秒),谨慎更改") -doroGui.Add("DropDownList", "Choose" SleepTimeToLabel(sleepTime), [750, 1000, 1250, 1500, 1750, 2000]).OnEvent("Change", - ChangeOnSleepTime) -doroGui.Add("Text", , "色差容忍度,能跑就别改") -doroGui.Add("DropDownList", "Choose" ColorToleranceToLabel(colorTolerance), ["严格", "宽松"]).OnEvent("Change", - ChangeOnColorTolerance) +AddCheckboxSetting(doroGui, "Debug", "是否显示程序日志", "R1.2") +doroGui.Add("Text", , "点击间隔(毫秒)") +doroGui.Add("DropDownList", "Choose" SleepTimeToLabel(sleepTime), [750, 1000, 1250, 1500, 1750, 2000]).OnEvent("Change", ChangeOnSleepTime) +doroGui.Add("Text", , "色差容忍度") +doroGui.Add("DropDownList", "Choose" ColorToleranceToLabel(colorTolerance), ["严格", "宽松"]).OnEvent("Change", ChangeOnColorTolerance) doroGui.Add("Button", "R1", "保存当前设置").OnEvent("Click", SaveSettings) -Tab.UseTab("收获") -AddCheckboxSetting(doroGui, "OutpostDefence", "领取前哨基地防御奖励+1次免费歼灭", "R1.2") -AddCheckboxSetting(doroGui, "CashShop", "领取付费商店免费钻(进不了商店的别选)", "R1.2") -AddCheckboxSetting(doroGui, "Expedition", "派遣委托", "R1.2") -AddCheckboxSetting(doroGui, "FriendPoint", "好友点数收取", "R1.2") +Tab.UseTab("任务") +AddCheckboxSetting(doroGui, "Shop", "商店购买", "R1.2") +AddCheckboxSetting(doroGui, "SimulationRoom", "模拟室", "R1.2") +AddCheckboxSetting(doroGui, "Arena", "竞技场收菜", "R1.2 Section") +AddCheckboxSetting(doroGui, "LoveTalking", "咨询妮姬", "R1.2 xs Section") ; 注意 Section 选项用法(保存此控件位置并定义一个新控件段) +AddCheckboxSetting(doroGui, "Tower", "无限之塔", "R1.2 xs") +AddCheckboxSetting(doroGui, "Interception", "异常拦截", "R1.2 xs") +AddCheckboxSetting(doroGui, "Award", "奖励收取", "R1.2 xs") +Tab.UseTab("商店") +doroGui.Add("Text", "R1.2 Section", "付费商店") +AddCheckboxSetting(doroGui, "CashShop", "领取付费商店免费钻(进不了商店的别选)", "R1.2 xs+15") +doroGui.Add("Text", "R1.2 xs Section", "普通商店") +AddCheckboxSetting(doroGui, "NormalShop", "每日白嫖2次", "R1.2 xs+15") +AddCheckboxSetting(doroGui, "NormalShopDust", "用信用点买芯尘盒", "R1.2 xs+15") +doroGui.Add("Text", " R1 xs", "竞技场商店") +doroGui.Add("Text", " R1 xs+15", "购买代码手册数量") +AddCheckboxSetting(doroGui, "BookFire", "燃烧", "R1.2 xs+15") +AddCheckboxSetting(doroGui, "BookWater", "水冷", "R1.2 X+0.5") +AddCheckboxSetting(doroGui, "BookWind", "风压", "R1.2 X+0.5") +AddCheckboxSetting(doroGui, "BookElec", "电击", "R1.2 X+0.5") +AddCheckboxSetting(doroGui, "BookIron", "铁甲", "R1.2 X+0.5") +AddCheckboxSetting(doroGui, "ArenaShopPackage", "购买简介个性化礼包", "R1.2 xs+15") +AddCheckboxSetting(doroGui, "ArenaShopFurnace", "购买公司武器熔炉", "R1.2 xs+15") +doroGui.Add("Text", "R1.2 xs Section", "废铁商店") +AddCheckboxSetting(doroGui, "ScrapShopGem", "购买珠宝", "R1.2 xs+15") +AddCheckboxSetting(doroGui, "ScrapShopVoucher", "购买全部好感券", "R1.2 xs+15") +AddCheckboxSetting(doroGui, "ScrapShopResources", "购买全部资源", "R1.2 xs+15") +Tab.UseTab("战斗") +doroGui.Add("Text", "R1.2 Section", "竞技场") +AddCheckboxSetting(doroGui, "RookieArena", "新人竞技场", "R1.2 XP+15 Y+M") +AddCheckboxSetting(doroGui, "SpecialArena", "特殊竞技场", "R1.2 Y+M") +AddCheckboxSetting(doroGui, "ChampionArena", "冠军竞技场(跟风竞猜)", "R1.2 Y+M") +doroGui.Add("Text", "R1.2 xs Section", "异常拦截编队") +doroGui.Add("DropDownList", "XP+15 Y+M Choose" InterceptionBossToLabel(), ["克拉肯(石),编队1", "过激派(头),编队2", "镜像容器(手),编队3", "茵迪维利亚(衣),编队4", "死神(脚),编队5"]).OnEvent("Change", ChangeOnInterceptionBoss) +doroGui.Add("Text", "R1.2 xs Section", "模拟室(打5C,普通关卡需要快速战斗)") +AddCheckboxSetting(doroGui, "SimulationOverClock", "模拟室超频(默认使用上次的tag)", "R1.2 XP+15 Y+M") +doroGui.Add("Text", "R1.2 xs Section", "无限之塔") +AddCheckboxSetting(doroGui, "CompanyTower", "尽可能地爬企业塔", "R1.2 xs+15") +AddCheckboxSetting(doroGui, "UniversalTower", "尽可能地爬通用塔", "R1.2 xs+15") +Tab.UseTab("奖励") +AddCheckboxSetting(doroGui, "OutpostDefence", "领取前哨基地防御奖励+1次免费歼灭", "R1.2 Section") +AddCheckboxSetting(doroGui, "Expedition", "领取并重新派遣委托", "R1.2 xs+15") +AddCheckboxSetting(doroGui, "RankingReward", "方舟排名奖励", "R1.2 xs") +AddCheckboxSetting(doroGui, "FriendPoint", "好友点数收取", "R1.2 xs") AddCheckboxSetting(doroGui, "Mail", "邮箱收取", "R1.2") AddCheckboxSetting(doroGui, "Mission", "任务收取", "R1.2") AddCheckboxSetting(doroGui, "Pass", "通行证收取", "R1.2") -Tab.UseTab("商店") -doroGui.Add("Text", "R1.2 Section", "普通商店") -AddCheckboxSetting(doroGui, "FreeShop", "每日白嫖2次", "R1.2 xs+15") -doroGui.Add("Text", " R1.2 xs+15", "❌购买简介个性化礼包") -doroGui.Add("Text", "R1.2 xs", "竞技场商店") -doroGui.Add("Text", "R1.2 xs+15", "购买手册:") -AddCheckboxSetting(doroGui, "BookFire", "燃烧", "R1.2 xs+15") -AddCheckboxSetting(doroGui, "BookWater", "水冷", "R1.2 X+1") -AddCheckboxSetting(doroGui, "BookWind", "风压", "R1.2 X+1") -AddCheckboxSetting(doroGui, "BookElec", "电击", "R1.2 X+1") -AddCheckboxSetting(doroGui, "BookIron", "铁甲", "R1.2 X+1") -AddCheckboxSetting(doroGui, "CompanyWeapon", "购买公司武器熔炉", "R1.2 xs+15") -doroGui.Add("Text", " R1.2 xs+15", "❌购买简介个性化礼包") -doroGui.Add("Text", "R1.2 xs Section", "废铁商店") -doroGui.Add("Text", " R1.2 xs+15", "❌购买珠宝") -doroGui.Add("Text", " R1.2 xs+15", "购买好感券:") -doroGui.Add("Text", " R1.2 xs+15", "❌通用") -doroGui.Add("Text", " R1.2 x+1", "❌朝圣者") -doroGui.Add("Text", " R1.2 x+1", "❌反常") -doroGui.Add("Text", " R1.2 xs+15", "❌极乐净土") -doroGui.Add("Text", " R1.2 x+1", "❌米西利斯") -doroGui.Add("Text", " R1.2 x+1", "❌泰特拉") -doroGui.Add("Text", " R1.2 xs+15", "购买资源") -doroGui.Add("Text", " R1.2 xs+15", "❌信用点+盒") -doroGui.Add("Text", " R1.2 x+1", "❌战斗数据辑盒") -doroGui.Add("Text", " R1.2 x+1", "❌芯尘盒") -Tab.UseTab("日常") -AddCheckboxSetting(doroGui, "SimulationRoom", "模拟室5C(普通关卡需要快速战斗)", "R1.2") -AddCheckboxSetting(doroGui, "Arena", "竞技场收菜", "R1.2 Section") -AddCheckboxSetting(doroGui, "RookieArena", "新人竞技场(请点开快速战斗)", "R1.2 XP+15 Y+M") -AddCheckboxSetting(doroGui, "SpecialArena", "特殊竞技场(请点开快速战斗)", "R1.2 Y+M") -AddCheckboxSetting(doroGui, "LoveTalking", "咨询妮姬(可以通过收藏改变妮姬排序)", "R1.2 xs Section") ; 注意 Section 选项用法(保存此控件位置并定义一个新控件段) -AddCheckboxSetting(doroGui, "FailTower", "爬塔摆烂一次(用于完成每日任务)", "R1.2") -AddCheckboxSetting(doroGui, "CompanyTower", "尽可能地爬企业塔", "R1.2 xs Section") -AddCheckboxSetting(doroGui, "Interception", "使用对应编队进行异常拦截自动战斗", "R1.2 xs") -doroGui.Add("DropDownList", "Choose" InterceptionBossToLabel(), ["克拉肯(石),编队1", "过激派(头),编队2", "镜像容器(手),编队3", - "茵迪维利亚(衣),编队4", "死神(脚),编队5"]).OnEvent("Change", ChangeOnInterceptionBoss) -AddCheckboxSetting(doroGui, "UniversalTower", "尽可能地爬通用塔", "R1.2") -Tab.UseTab("默认") -doroGui.Add("Text", , "购买代码手册数量") -doroGui.Add("DropDownList", "Choose" NumOfBookToLabel(), [0, 1, 2, 3]).OnEvent("Change", ChangeOnNumOfBook) +AddCheckboxSetting(doroGui, "FreeRecruit", "活动期间每日免费招募", "R1.2") +AddCheckboxSetting(doroGui, "RoadToVillain", "德雷克·反派之路", "R1.2") +AddCheckboxSetting(doroGui, "Cooperate", "协同作战摆烂", "R1.2") Tab.UseTab() -doroGui.Add("Button", "Default w80 xm+100", "DORO!").OnEvent("Click", ClickOnDoro) +doroGui.Add("Button", "Default w80 xm+100", "DORO!") +.OnEvent("Click", ClickOnDoro) doroGui.Show() +; 添加日志 +DebugGui := Gui() +DebugGui.Title := "程序日志" +DebugGui.Opt("+Resize") ; 允许窗口调整大小 +; 添加多行文本框(带垂直滚动条) +LogBox := DebugGui.Add("Edit", "r20 w400 ReadOnly -Wrap +HScroll +VScroll") +LogBox.Value := "日志开始...`r`n" ; 初始内容 +; 添加清空按钮 +BtnClear := DebugGui.Add("Button", "x+10", "清空日志") +BtnClear.OnEvent("Click", (*) => LogBox.Value := "") +if g_settings["Debug"] { + DebugGui.Show() +} +AddLog(text) { + ; global LogBox + if (!IsObject(LogBox) || !LogBox.Hwnd) { + return + } + static lastText := "" ; 静态变量保存上一条内容 + global LogBox + ; 如果内容与上一条相同则跳过 + if (text = lastText) + return + lastText := text ; 保存当前内容供下次比较 + timestamp := FormatTime(, "HH:mm:ss") + LogBox.Value .= timestamp " - " text "`r`n" + SendMessage(0x0115, 7, 0, LogBox) ; 自动滚动到底部 +} +TimeToSeconds(timeStr) { + ; 期望 "HH:mm:ss" 格式 + parts := StrSplit(timeStr, ":") + if (parts.Length != 3) { + return -1 ; 格式错误 + } + ; 确保部分是数字 + if (!IsInteger(parts[1]) || !IsInteger(parts[2]) || !IsInteger(parts[3])) { + return -1 ; 格式错误 + } + hours := parts[1] + 0 ; 强制转换为数字 + minutes := parts[2] + 0 + seconds := parts[3] + 0 + ; 简单的验证范围(不严格) + if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59 || seconds < 0 || seconds > 59) { + return -1 ; 无效时间 + } + return hours * 3600 + minutes * 60 + seconds +} +; 读取日志框内容,根据 HH:mm:ss 时间戳推算跨度,输出到日志框 +CalculateAndShowSpan(ExitReason := "", ExitCode := "") { + local logContent := LogBox.Value + local lines := StrSplit(logContent, "`n") ; 按换行符分割 + local timestamps := [] + local match := "" + ; 提取所有时间戳(格式 HH:mm:ss) + for line in lines { + if (RegExMatch(line, "^\d{2}:\d{2}:\d{2}(?=\s*-\s*)", &match)) { + timestamps.Push(match[]) + } + } + ; 直接取最早(第1个)和最晚(最后1个)时间戳(日志已按时间顺序追加) + earliestTimeStr := timestamps[1] + latestTimeStr := timestamps[timestamps.Length] + ; 转换为秒数 + earliestSeconds := TimeToSeconds(earliestTimeStr) + latestSeconds := TimeToSeconds(latestTimeStr) + ; 检查转换是否有效 + if (earliestSeconds = -1 || latestSeconds = -1) { + AddLog("推算跨度失败:日志时间格式错误。") + return + } + ; 处理跨午夜情况(如 23:59:59 → 00:00:01) + if (latestSeconds < earliestSeconds) { + latestSeconds += 24 * 3600 ; 加上一天的秒数(86400) + } + ; 计算总时间差(秒) + spanSeconds := latestSeconds - earliestSeconds + spanMinutes := Floor(spanSeconds / 60) + remainingSeconds := Mod(spanSeconds, 60) + ; 格式化输出 + outputText := "Doro已帮你节省时间: " + if (spanMinutes > 0) { + outputText .= spanMinutes " 分 " + } + outputText .= remainingSeconds " 秒" + ; 添加到日志 + AddLog(outputText) + MsgBox outputText +} ^1:: { ExitApp } ^2:: { - Pause -1 + Pause } ;调试指定函数 ^0:: { @@ -2949,6 +2623,7 @@ doroGui.Show() WinGetClientPos , , &userScreenW, &userScreenH, nikkeID global scrRatio scrRatio := userScreenW / stdScreenW + ;模拟室、企业塔待测试 ;下面写要调试的函数 - BackToHall() -} \ No newline at end of file + ScrapShop() +} From e24fc7dfa3d1806fa22ecde2671d94d977f69621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E4=B8=80=E4=B8=80?= <1204244136@qq.com> Date: Wed, 7 May 2025 17:55:57 +0800 Subject: [PATCH 06/40] =?UTF-8?q?perf:=20=E6=96=B0=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E8=BE=93=E5=87=BA=E6=97=A5=E5=BF=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DoroHelper.ahk | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/DoroHelper.ahk b/DoroHelper.ahk index ca191d2..fcfd513 100644 --- a/DoroHelper.ahk +++ b/DoroHelper.ahk @@ -2346,7 +2346,7 @@ LoadSettings() { SaveSettings(*) { WriteSettings() MsgBox "设置已保存!" - AddLog("设置已保存!") + AddLog("设置已保存!", true) } ; 全局设置 Map 对象 global g_settings := Map( @@ -2534,15 +2534,14 @@ BtnClear.OnEvent("Click", (*) => LogBox.Value := "") if g_settings["Debug"] { DebugGui.Show() } -AddLog(text) { - ; global LogBox +AddLog(text, forceOutput := false) { ; 默认参数设为false if (!IsObject(LogBox) || !LogBox.Hwnd) { return } static lastText := "" ; 静态变量保存上一条内容 global LogBox - ; 如果内容与上一条相同则跳过 - if (text = lastText) + ; 如果内容与上一条相同且不强制输出,则跳过 + if (text = lastText && !forceOutput) return lastText := text ; 保存当前内容供下次比较 timestamp := FormatTime(, "HH:mm:ss") From e6a68e47bfc817a7bf1208679650775d56b82bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E4=B8=80=E4=B8=80?= <1204244136@qq.com> Date: Thu, 8 May 2025 00:10:10 +0800 Subject: [PATCH 07/40] =?UTF-8?q?perf:=20=E4=B8=BB=E8=A6=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BA=86=E9=80=89=E5=8F=96=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DoroHelper.ahk | 341 +-- lib/FindText.ahk | 5922 ++++++++++++++++++++++------------------------ 2 files changed, 2966 insertions(+), 3297 deletions(-) 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)