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/DoroHelper.ahk b/DoroHelper.ahk index 0fbf437..02658d2 100644 --- a/DoroHelper.ahk +++ b/DoroHelper.ahk @@ -1,18 +1,454 @@ #Requires AutoHotkey >=v2.0 -#Include %A_ScriptDir%\lib\github.ahk +#Include +#Include CoordMode "Pixel", "Client" CoordMode "Mouse", "Client" -;操作间隔(单位:毫秒) -sleepTime := 1500 -scrRatio := 1.0 ;consts -stdScreenW := 3840 -stdScreenH := 2160 -waitTolerance := 50 -colorTolerance := 15 -currentVersion := "v0.1.23" +currentVersion := "v1.0.0-beta" usr := "kyokakawaii" repo := "DoroHelper" +global waitTolerance := 50 +; MsgBox "请在运行前调整游戏窗口到合适尺寸" +; MsgBox "以任何方式暂停后,请右下角Reload Script重启程序后再次运行" +if A_Username != 12042 { + msgbox " +( +暂不支持以下分辨率的适配和反馈: +1、任何1080p分辨率 +2、非100%缩放的2K分辨率 +3、非100%缩放的4K分辨率 +4、多显示器、异形屏 +不支持国服、港澳台服、多开 +模拟室需要能快速战斗、拦截战需要能打异常拦截 +运行前将游戏尺寸比例设置成16:9,确认关闭HDR,使用单显示器。 +然后ctrl+3按到画面不动为止,此时nikke应该是居中的 +)" +} +if A_Username != 12042 { + msgbox " +( +反馈任何问题前,请先尝试复现,如能复现再进行反馈,反馈时必须有录屏。 +除录屏外需尽可能附带以下信息,信息越多,修复的可能性越高 +1、电脑的配置(包括显示器分辨率、缩放比例等) +2、软件中对应操作的日志 +如果什么资料都没有就唐突反馈的话将会被斩首示众,使用本软件视为你已阅读并同意此条目。 +)" +} +global sleepTime := 1000 ; 声明并初始化全局变量 +; 全局设置 Map 对象 +global g_settings := Map( + ;商店 + "Shop", 1, ; 商店总开关 + "CashShop", 1, ; 付费商店 + "NormalShop", 1, ; 普通商店 + "NormalShopDust", 1, ; 普通商店:芯尘盒 + "NormalShopPackage", 0, ; 普通商店:简介个性化礼包 + "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, ; 废铁商店:养成资源 + ; 模拟室 + "SimulationRoom", 1, ; 模拟室 + "SimulationOverClock", 1, ; 模拟室超频 + ; 竞技场 + "Arena", 1, ; 竞技场收菜 + "RookieArena", 1, ; 新人竞技场 + "SpecialArena", 1, ; 特殊竞技场 + "ChampionArena", 0, ; 冠军竞技场 + ; 无限之塔 + "Tower", 1, ; 无限之塔总开关 + "CompanyTower", 1, ; 企业塔 + "UniversalTower", 0, ; 通用塔 + ; 异常拦截 + "Interception", 1, ; 拦截战 + ; 奖励 + "Award", 1, ; 奖励领取总开关 + "OutpostDefence", 1, ; 前哨基地收菜 + "Expedition", 1, ; 派遣 + "LoveTalking", 1, ; 咨询 + "Appreciation", 1, ; 花絮鉴赏 + "FriendPoint", 1, ; 好友点数 + "Mail", 1, ; 邮箱 + "RankingReward", 1, ; 排名奖励 + "Mission", 1, ; 任务 + "Pass", 1, ; 通行证 + "FreeRecruit", 1, ; 活动期间每日免费招募 + "RoadToVillain", 1, ; 德雷克·反派之路 + "Cooperate", 1, ; 协同作战 + "SoloRaid", 1, ; 个人突击 + "Activity", 0, ; 小活动 + ; 其他 + "AutoCheckUpdate", 0, ; 自动检查更新 + "SelfClosing", 1, ; 完成后自动关闭程序 + "OpenBlablalink", 0, ; 完成后打开Blablalink +) +; 其他非简单开关的设置 Map 对象 +global g_numeric_settings := Map( + "sleepTime", 1000, ; 默认等待时间 + "InterceptionBoss", 1, ; 拦截战BOSS选择 + "Tolerance", 1 ; 宽容度 +) +;检测管理员身份 +if !A_IsAdmin { + MsgBox "请以管理员身份运行Doro" + ExitApp +} +;读取设置 +SetWorkingDir A_ScriptDir +try { + LoadSettings() +} +catch { + WriteSettings() +} +if g_settings["AutoCheckUpdate"] { + CheckForUpdateHandler(false) ; 调用核心函数,标记为非手动检查 +} +;创建gui +doroGui := Gui(, "Doro小帮手" currentVersion) +doroGui.Opt("+Resize") +doroGui.MarginY := Round(doroGui.MarginY * 0.9) +doroGui.SetFont("cred s11 Bold") +doroGui.Add("Text", "R1", "关闭:ctrl + 1 终止:+ 2 调整窗口:+ 3") +doroGui.Add("Link", " R1 xs", '项目地址') +doroGui.SetFont() +doroGui.Add("Button", "R1 x+8", "赞助").OnEvent("Click", MsgSponsor) +doroGui.Add("Button", "R1 x+8", "帮助").OnEvent("Click", ClickOnHelp) +doroGui.Add("Button", "R1 x+8", "检查更新").OnEvent("Click", ClickOnCheckForUpdate) +BtnClear := doroGui.Add("Button", "R1 x+8", "清空日志").OnEvent("Click", (*) => LogBox.Value := "") +Tab := doroGui.Add("Tab3", "xm") ;由于autohotkey有bug只能这样写 +Tab.Add(["设置", "任务", "商店", "战斗", "奖励", "日志"]) +Tab.UseTab("设置") +AddCheckboxSetting(doroGui, "AutoCheckUpdate", "自动检查更新(确保能连上github)", "R1.2") +AddCheckboxSetting(doroGui, "OpenBlablalink", "任务完成后自动打开Blablalink", "R1.2") +AddCheckboxSetting(doroGui, "SelfClosing", "任务完成后自动关闭程序", "R1.2") +doroGui.Add("Text", , "识图宽容度(越大越容易识到图、识错图)") +doroGui.Add("DropDownList", "Choose" g_numeric_settings["Tolerance"], [1, 2, 3]).OnEvent("Change", (CtrlObj, Info) => ChangeNum("Tolerance", CtrlObj)) +doroGui.Add("Button", "R1", "保存当前设置").OnEvent("Click", SaveSettings) +doroGui.Add("Text", " R1 ", "===妙妙工具===") +doroGui.Add("Text", "R1.2 Section", "剧情模式") +doroGui.Add("Button", " xp+50 yp-5", "←启动").OnEvent("Click", StoryMode) +Tab.UseTab("任务") +AddCheckboxSetting(doroGui, "Shop", "商店购买", "R1.2") +AddCheckboxSetting(doroGui, "SimulationRoom", "模拟室", "R1.2") +AddCheckboxSetting(doroGui, "Arena", "竞技场", "R1.2 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") +doroGui.Add("Text", "R1.2 xs Section", "===普通商店===") +AddCheckboxSetting(doroGui, "NormalShop", "每日白嫖2次", "R1.2 ") +AddCheckboxSetting(doroGui, "NormalShopDust", "用信用点买芯尘盒", "R1.2 ") +AddCheckboxSetting(doroGui, "NormalShopPackage", "购买简介个性化礼包", "R1.2 ") +doroGui.Add("Text", " R1 xs", "===竞技场商店===") +AddCheckboxSetting(doroGui, "BookFire", "燃烧", "R1.2") +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, "BookBox", "购买代码手册宝箱", "xs R1.2") +AddCheckboxSetting(doroGui, "ArenaShopPackage", "购买简介个性化礼包", "R1.2") +AddCheckboxSetting(doroGui, "ArenaShopFurnace", "购买公司武器熔炉", "R1.2") +doroGui.Add("Text", "R1.2 xs Section", "===废铁商店===") +AddCheckboxSetting(doroGui, "ScrapShopGem", "购买珠宝", "R1.2") +AddCheckboxSetting(doroGui, "ScrapShopVoucher", "购买全部好感券", "R1.2") +AddCheckboxSetting(doroGui, "ScrapShopResources", "购买全部养成资源", "R1.2") +Tab.UseTab("战斗") +doroGui.Add("Text", "R1.2 Section", "===竞技场===") +AddCheckboxSetting(doroGui, "RookieArena", "新人竞技场", "R1.2") +AddCheckboxSetting(doroGui, "SpecialArena", "特殊竞技场", "R1.2") +AddCheckboxSetting(doroGui, "ChampionArena", "冠军竞技场(跟风竞猜)", "R1.2") +doroGui.Add("Text", "R1.2 xs Section", "===异常拦截编队===") +doroGui.Add("DropDownList", "Choose" InterceptionBossToLabel(), ["克拉肯(石),编队1", "镜像容器(手),编队2", "茵迪维利亚(衣),编队3", "过激派(头),编队4", "死神(脚),编队5"]).OnEvent("Change", (CtrlObj, Info) => ChangeNum("InterceptionBoss", CtrlObj)) +doroGui.Add("Text", "R1.2 xs Section", "===模拟室===") +AddCheckboxSetting(doroGui, "SimulationOverClock", "模拟室超频(默认使用上次的tag)", "R1.2") +doroGui.Add("Text", "R1.2 xs Section", "===无限之塔===") +AddCheckboxSetting(doroGui, "CompanyTower", "尽可能地爬企业塔", "R1.2") +AddCheckboxSetting(doroGui, "UniversalTower", "尽可能地爬通用塔", "R1.2") +Tab.UseTab("奖励") +doroGui.Add("Text", "R1.2 Section", "===常规奖励===") +AddCheckboxSetting(doroGui, "OutpostDefence", "领取前哨基地防御奖励+1次免费歼灭", "R1.2 Y+M Section") +AddCheckboxSetting(doroGui, "Expedition", "领取并重新派遣委托", "R1.2 xs+15") +AddCheckboxSetting(doroGui, "LoveTalking", "咨询妮姬", "R1.2 xs Section") +AddCheckboxSetting(doroGui, "Appreciation", "花絮鉴赏", "R1.2 xs+15") +AddCheckboxSetting(doroGui, "FriendPoint", "好友点数收取", "R1.2 xs") +AddCheckboxSetting(doroGui, "Mail", "邮箱收取", "R1.2") +; AddCheckboxSetting(doroGui, "RankingReward", "方舟排名奖励", "R1.2") +AddCheckboxSetting(doroGui, "Mission", "任务收取", "R1.2") +AddCheckboxSetting(doroGui, "Pass", "通行证收取", "R1.2") +AddCheckboxSetting(doroGui, "Activity", "小活动(需刷到11关)", "R1.2") +doroGui.Add("Text", "R1.2 Section", "===限时奖励===") +AddCheckboxSetting(doroGui, "FreeRecruit", "活动期间每日免费招募", "R1.2") +AddCheckboxSetting(doroGui, "Cooperate", "协同作战摆烂", "R1.2") +AddCheckboxSetting(doroGui, "SoloRaid", "单人突击日常", "R1.2") +AddCheckboxSetting(doroGui, "RoadToVillain", "德雷克·反派之路", "R1.2") +Tab.UseTab("日志") +LogBox := doroGui.Add("Edit", "r20 w270 ReadOnly") +LogBox.Value := "日志开始...`r`n" ; 初始内容 +Tab.UseTab() +doroGui.Add("Button", "Default w80 xm+100", "DORO!").OnEvent("Click", ClickOnDoro) +doroGui.Show() +; 点击运行 +ClickOnDoro(*) { + Initialization + WriteSettings() + Login() ;登陆到主界面 + 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() + if g_settings["RookieArena"] ;新人竞技场 + RookieArena() + if g_settings["SpecialArena"] ;特殊竞技场 + SpecialArena() + if g_settings["ChampionArena"] ;冠军竞技场 + ChampionArena() + BackToHall + } + if g_settings["Tower"] { + if g_settings["CompanyTower"] + CompanyTower() + if g_settings["UniversalTower"] + UniversalTower() + BackToHall + } + if g_settings["Interception"] + Interception() + if g_settings["Award"] { + if g_settings["OutpostDefence"] ; 使用键名检查 Map + OutpostDefence() + if g_settings["LoveTalking"] + LoveTalking() + if g_settings["FriendPoint"] + FriendPoint() + if g_settings["Mail"] + Mail() + ; if g_settings["RankingReward"] ;方舟排名奖励 + ; RankingReward() + if g_settings["Mission"] + Mission() + if g_settings["Pass"] + Pass() + if g_settings["Activity"] + Activity() + if g_settings["FreeRecruit"] + FreeRecruit() + if g_settings["Cooperate"] + Cooperate() + if g_settings["SoloRaid"] + SoloRaid() + if g_settings["RoadToVillain"] + RoadToVillain() + BackToHall + } + CalculateAndShowSpan() + Result := MsgBox("Doro完成任务!" outputText "`n可以支持一下Doro吗", , "YesNo") + if Result = "Yes" + MsgSponsor + if g_settings["OpenBlablalink"] + Run("https://www.blablalink.com/") + if g_settings["SelfClosing"] + if InStr(currentVersion, "beta") { + MsgBox ("测试版本禁用自动关闭!") + Pause + } + ExitApp + Pause +} +;初始化 +Initialization() { + global BattleActive := 1 + global stdScreenW := 3840 + global stdScreenH := 2160 + global nikkeID := "" + global NikkeX := 0 + global NikkeY := 0 + global NikkeW := 0 + global NikkeH := 0 + global NikkeWP := 0 + global NikkeHP := 0 + global scrRatio := 1 + global currentScale := 1 + global WinRatio := 1 + global TrueRatio := 1 + global PicTolerance := g_numeric_settings["Tolerance"] + ; 设置窗口标题匹配模式为完全匹配 + SetTitleMatchMode 3 + targetExe := "nikke.exe" + if WinExist("ahk_exe " . targetExe) { + winID := WinExist("ahk_exe " . targetExe) ; 获取窗口ID + actualWinTitle := WinGetTitle(winID) ; 获取实际窗口标题 + AddLog("找到了进程为 '" . targetExe . "' 的窗口!`n实际窗口标题是: " . actualWinTitle) + if actualWinTitle = "胜利女神:新的希望" { + MsgBox ("不支持国服,自动关闭!") + ExitApp + } + ; 激活该窗口 + WinActivate(winID) + } + else { + ; 没有找到该进程的窗口 + MsgBox("没有找到进程为 '" . targetExe . "' 的窗口,初始化失败!") + Pause + } + nikkeID := winID + WinGetClientPos &NikkeX, &NikkeY, &NikkeW, &NikkeH, nikkeID + WinGetPos &NikkeXP, &NikkeYP, &NikkeWP, &NikkeHP, nikkeID + currentScale := A_ScreenDPI / 96 ;确定dpi缩放比例,主要影响识图 + scrRatio := NikkeH / stdScreenH ;确定nikke尺寸之于额定尺寸的比例(4K),主要影响点击 + WinRatio := NikkeW / 2347 ;确定nikke尺寸之于额定nikke尺寸的比例(我是在nikke宽度2347像素的情况下截图的),主要影响识图 + TrueRatio := currentScale * WinRatio + AddLog("`nnikke坐标是:" NikkeX "," NikkeY "`n屏幕宽度是" A_ScreenWidth "`n屏幕高度是" A_ScreenHeight "`nnikke宽度是" NikkeW "`nnikke高度是" NikkeH "`ndpi缩放比例是" currentScale "`n窗口缩放比例是" WinRatio "`n图片缩放系数是" TrueRatio "`n缩放容忍度是" PicTolerance) + AddLog("如有问题请加入反馈qq群584275905,反馈请附带日志或录屏") +} +/** + * 添加一个与 g_settings Map 关联的复选框到指定的 GUI 对象. + * @param guiObj Gui - 要添加控件的 GUI 对象. + * @param settingKey String - 在 g_settings Map 中对应的键名. + * @param displayText String - 复选框旁边显示的文本标签. + * @param options String - (可选) AutoHotkey GUI 布局选项字符串 (例如 "R1.2 xs+15"). + */ +AddCheckboxSetting(guiObj, settingKey, displayText, options := "") { + global g_settings ; 确保能访问全局 Map 和处理函数 + ; 检查 settingKey 是否存在于 g_settings 中 + if !g_settings.Has(settingKey) { + MsgBox("错误: Setting key '" settingKey "' 在 g_settings 中未定义!", "添加控件错误", "IconX") + return ; 或者抛出错误 + } + ; 构建选项字符串,确保 Checked/空字符串 在选项之后,文本之前 + initialState := IsCheckedToString(g_settings[settingKey]) + fullOptions := options (options ? " " : "") initialState ; 如果有 options,加空格分隔 + ; 添加复选框控件,并将 displayText 作为第三个参数 + cbCtrl := guiObj.Add("Checkbox", fullOptions, displayText) + ; 绑定 Click 事件,使用胖箭头函数捕获当前的 settingKey + cbCtrl.OnEvent("Click", (guiCtrl, eventInfo) => ToggleSetting(settingKey, guiCtrl, eventInfo)) + ; 返回创建的控件对象 (可选,如果需要进一步操作) + return cbCtrl +} +; 通用函数,用于切换 g_settings Map 中的设置值 +ToggleSetting(settingKey, guiCtrl, *) { + global g_settings + ; 切换值 (0 变 1, 1 变 0) + g_settings[settingKey] := 1 - g_settings[settingKey] + ; 可选: 如果需要,可以在这里添加日志记录 + ; ToolTip("切换 " settingKey " 为 " g_settings[settingKey]) +} +; 切换数字 +ChangeNum(settingKey, GUICtrl, *) { + global g_numeric_settings + g_numeric_settings[settingKey] := GUICtrl.Value +} +MsgSponsor(*) { + myGui := Gui() + myGui.Title := "Make Doro Great Again" + myGui.Add("Picture", "w200 h200", "./img/alipay.png") + myGui.Add("Picture", "x+15 w200 h200", "./img/weixin.png") + MyGui.Add("Text", "xs Section w400 h50 Center Wrap", "知一一:前任作者牢 H 停更后,DoroHelper 的绝大部分维护和新功能的添加都是我在做,这耗费了我大量时间和精力,希望有条件的小伙伴们能支持一下") + myGui.Add("Button", "xs+180 y+m w50 h20 ", "确定").OnEvent("Click", (*) => myGui.Destroy()) + myGui.Show() +} +ClickOnHelp(*) { + msgbox " + ( + ############################################# + 使用说明 + 对大多数老玩家来说Doro设置保持默认就好。 + 万一Doro失控,请按Ctrl + 1组合键结束进程。 + 万一Doro失控,请按Ctrl + 1组合键结束进程。 + 万一Doro失控,请按Ctrl + 1组合键结束进程。 + ############################################# + 要求: + - 16:9的显示器比例 + - 设定-画质-开启光晕效果 + - 设定-画质-开启颜色分级 + - 游戏语言设置为简体中文 + - 以**管理员身份**运行DoroHelper + - 不要开启windows HDR显示 + ############################################# + 步骤: + -打开NIKKE启动器。点击启动。等右下角腾讯ACE反作弊系统扫完,NIKKE主程序中央SHIFT UP logo出现之后,再切出来点击“DORO!”按钮。如果你看到鼠标开始在左下角连点,那就代表启动成功了。然后就可以悠闲地去泡一杯咖啡,或者刷一会儿手机,等待Doro完成工作了。 + -也可以在游戏处在大厅界面时(有看板娘的页面)切出来点击“DORO!”按钮启动程序。 + -游戏需要更新的时候请更新完再使用Doro。 + ############################################# + 其他: + -检查是否发布了新版本。 + -如果你的电脑配置较好的话,或许可以尝试降低点击间隔。 + + )" +} +SleepTimeToLabel(sleepTime) { + return String(sleepTime / 250 - 2) +} +IsCheckedToString(foo) { + if foo + return "Checked" + else + return "" +} +InterceptionBossToLabel() { + global g_numeric_settings + return String(g_numeric_settings["InterceptionBoss"]) +} +WriteSettings(*) { + global g_settings, g_numeric_settings + ; 从 g_settings Map 写入开关设置 + for key, value in g_settings { + IniWrite(value, "settings.ini", "Toggles", key) + } + for key, value in g_numeric_settings { + IniWrite(value, "settings.ini", "NumericSettings", key) + } +} +LoadSettings() { + global g_settings, g_numeric_settings + default_settings := g_settings.Clone() + ; 从 Map 加载开关设置 + for key, defaultValue in default_settings { + readValue := IniRead("settings.ini", "Toggles", key, defaultValue) + g_settings[key] := readValue + } + default_numeric_settings := g_numeric_settings.Clone() ; 保留一份默认数值设置 + for key, defaultValue in default_numeric_settings { + readValue := IniRead("settings.ini", "NumericSettings", key, defaultValue) + ; 确保读取的值是数字,如果不是则使用默认值 + if IsNumber(readValue) { + g_numeric_settings[key] := Integer(readValue) ; 转换为整数 + } else { + g_numeric_settings[key] := defaultValue + } + } +} +SaveSettings(*) { + WriteSettings() + MsgBox "设置已保存!" + AddLog("设置已保存!", true) +} ;颜色判断 IsSimilarColor(targetColor, color) { tr := Format("{:d}", "0x" . substr(targetColor, 3, 2)) @@ -21,12 +457,35 @@ IsSimilarColor(targetColor, color) { pr := Format("{:d}", "0x" . substr(color, 3, 2)) pg := Format("{:d}", "0x" . substr(color, 5, 2)) pb := Format("{:d}", "0x" . substr(color, 7, 2)) - ;MsgBox tr tg tb pr pg pb distance := sqrt((tr - pr) ** 2 + (tg - pg) ** 2 + (tb - pb) ** 2) - if (distance < colorTolerance) + if (distance < 15) return true return false } +;坐标转换-点击 +UserClick(sX, sY, k) { + uX := Round(sX * k) ; 计算转换后的坐标 + uY := Round(sY * k) + CoordMode "Mouse", "Client" + 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 { + 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 ; 确保能访问全局变量 @@ -71,24 +530,11 @@ 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 + if InStr(currentVersion, "beta") { + MsgBox ("测试版本禁用更新!") + Pause } - return 1 + CheckForUpdateHandler(true) ; 调用核心函数,标记为手动检查 } ;判断自动按钮颜色 isAutoOff(sX, sY, k) { @@ -106,7 +552,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) { @@ -115,7 +561,7 @@ CheckAutoBattle() { } autoAimOn := true ; 设置标志位,表示已尝试开启或已开启 } - ; 检查并开启自动爆裂 (Auto Burst) + ; 检查并开启自动爆裂 if !autoBurstOn && UserCheckColor([216], [160], ["0xFFFFFF"], scrRatio) { ; 假设检查点与 Auto Aim 相同 ; 如果自动爆裂按钮是灰色/关闭状态 if isAutoOff(202, 66, scrRatio) { @@ -125,2714 +571,1992 @@ CheckAutoBattle() { autoBurstOn := true ; 设置标志位,表示已尝试开启或已开启 } } -;登录 -Login() { - stdTargetX := 333 - stdTargetY := 2041 - UserClick(stdTargetX, stdTargetY, scrRatio) +;添加日志 +AddLog(text, forceOutput := false) { ; 默认参数设为false + if (!IsObject(LogBox) || !LogBox.Hwnd) { + return + } + static lastText := "" ; 静态变量保存上一条内容 + global LogBox + ; 如果内容与上一条相同且不强制输出,则跳过 + if (text = lastText && !forceOutput) + 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 := "") { + global outputText + 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 := "已帮你节省时间: " + if (spanMinutes > 0) { + outputText .= spanMinutes " 分 " + } + outputText .= remainingSeconds " 秒" + ; 添加到日志 + AddLog(outputText) +} +; 剧情模式 +StoryMode(*) { + Initialization + while True { + Text := "|*10$39.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzztzDzzzz7szzzzsD1zzzz0s7zzzs30Tzzz000zzzs003zzz000Dzzs001zzz000zzzs10Dzzz0s7zzzsD1zzzz3szzzztzDzzzzzzzzzzzzzzzw" + while (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + Text1 := "|<1的图标>*99$31.y000Ty0003y7zzkyDzzyCDzzzWDzzzt7zzzw7zzzz3zzzzVzzDzkzy3zsTy1zwDz0zy7zUTz3zwDzVzy7zkzz3zsTzVzwDzkzy7zsTz3zwDzVzy7zkzz3zsTzVzw7zzzwHzzzyMzzzyCDzzyDVzzwDs000Dy000zk" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text1, , , , , , , TrueRatio, TrueRatio)) { + Sleep 800 + Send "{1}" + } + } + Text := "|<灰色的星星>*51$28.zzbzzzwDzzzkzzzy1zzzs7zzz0Dzzw0zzzU1zy000700002000080001k000DU001z000Dz001zw00Dzk00zz003zw00Dzk00zz001zs1U7zUTUTy7zVztzzbs" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , 8, TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<播放>*192$53.sTzlzlz3zks01zVy7zVk03z3wDz3U0Dy7sTy7W4D00Uzk308y0100U400w02010000s0Q031000wDkMD3U03sTUky7k0Tk01VwC00TU037s08ED000D00kky400Q0001w8O0s3U07sEw3s700DkVs7wC4ATX3sDsQ00y67UTks01wAC0TVk03sMM0T3V37VkU08700C001UES00SA47VUw00ysATXjzzzzzzzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep 3000 + Send "{LShift Down}" + Sleep 500 + Send "{LShift Up}" + Click 0, 0, 0 + } + if !WinActive(nikkeID) { + MsgBox "窗口未聚焦,程序已终止" + Pause + } + } +} +;点左下角的小房子的对应位置的右边(不返回) +Confirm() { + UserClick(474, 2028, scrRatio) + ; AddLog("点击默认位置(" Round(stdTargetX * scrRatio) "," Round(stdTargetY * scrRatio) ")") + Sleep 500 +} +;按Esc +GoBack() { + AddLog("返回") + Send "{Esc}" Sleep sleepTime - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) +} +;结算招募 +Recruit() { + AddLog("结算招募") + Text := "|*119$57.k1z7wT7k0w07kz1kw0100S7kS7U0003ky7kw003sS7Vy7Vy0T3ksTkwDk3zy63y7Vy0TzkkzkwDk07y47y7Vy00Dk0zkw00k0S03y7U07U3k0Tkw01zsS11y7U0Tz3kQDkwDz3sS7Uy7VzsT3ky7kwDz00S7kS7Vzs03kz3kwDz00S7wC7Vzy07kzVkwDzU" + while !(ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { ;如果没找到SKIP就一直点左下角(加速动画) + Confirm + } + FindText().Click(X, Y, "L") ;找到了就点 + Sleep sleepTime + Text := "|<确认>*143$52.zzXzzzzby0C7zwTwDk0E1zkzkz0303z1z7z0M0Dy3wTyDVVzwDlzsw01zzz7zXU01zzwTwA0060zlzk000M1z3y00llU7wDs0U07kTkz0200Tlz3w6801z7s7kMU27wTUT1WAMTly1y6801z7s3wM007wL0DlU00TkA8T00UVy01Vw0777s073k0QQTUUw723k1w47sAQD07tkzkzly0zz7zW" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") Sleep sleepTime - if UserCheckColor([1973, 1969], [1368, 1432], ["0x00ADFB", "0x00ADFB"], scrRatio) { - UserClick(2127, 1400, scrRatio) - Sleep sleepTime + } +} +; 点掉推销 +RefuseSale() { + AddLog("尝试关闭可能的推销页面") + loop 5 { + Confirm + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + break } - if UserCheckColor([1965, 1871], [1321, 1317], ["0x00A0EB", "0xF7F7F7"], scrRatio) { - UserClick(2191, 1350, scrRatio) - Sleep sleepTime + } + Sleep sleepTime +} +; 进入战斗 +EnterToBattle() { + global BattleActive := 1 + AddLog("尝试进入战斗") + Text := "|<进入战斗的进>*175$32.tzsS7wDy7Vz1zVsTkDsQ7y1w71zkE003yQ000zz000Dzs003zzsQ7zzy7Vy0zVsT0DsQ7k3U00A0k001wA000T30007ky3kTwDUw7z3sTVzkw7kTwD1w7z3UzVzkwTkTk3byDs0Dzzw000001k000Mz0006Tw001U" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击进入战斗") + FindText().Click(X + 100 * WinRatio, Y, "L") + Sleep 500 + FindText().Click(X + 100 * WinRatio, Y, "L") + Sleep 500 + FindText().Click(X + 100 * WinRatio, Y, "L") + } + else { + BattleActive := 0 + AddLog("无战斗次数") + } +} +;战斗结算 +BattleSettlement() { + if (BattleActive = 0) { + return + } + Victory := 0 + CheckAutoBattle + AddLog("等待战斗结算") + TextTAB := "|*149$32.0Tzzzk3zzzw0zzzz0Dzzzk3zzzw0zzzz0Dzzzk3zzzw0w0zz0D0Dzk3k3zw0w0zz0D0Dzk3k3zw0w0y00D0D003k3k00w0w00D0D003k3k00w0w00D0D003k3k00w0w00D0D003k3k00w0w00D0D0Dzzzzzzzzzzzzzzzzzzzzw000000000000000000000U" + TextR := "|*147$41.zzk07zzzy003zzzk001zzy0000zzs1zw0xzUDzy0ny1zzz03s7zzz07UTzzz0D1zzzz0Q7zzzw0sTzzzk1UzyTz033zwTzy27zsTzzsDzkTzzkzzUDzzVzz0Dzz3zy0Dzy7zw07zwDzs07zsTzk0TzkzzU1zzVzz07zz3zy0TzU3zw3zy27zsDzw4DzkzzsMDzbzzUsDzTzz3kTzzzw7kTzzzkTkTzzz1zUTzzw3zUDzzUDzUDzy0zzU3zU3zzk000Tzzk001zzzs00Dzzzy01zzk" + check := 0 + while true { + Sleep 500 + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, TextTAB, , , , , , , TrueRatio, TrueRatio)) or (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, TextR, , , , , , , TrueRatio, TrueRatio)) { + check := check + 1 + ; AddLog("已命中" check "次") + ;需要连续三次命中 + if (check = 3) { + ;看到TAB的标志代表战斗结束了,看看怎么个事 + Text编队 := "|<编队>*103$46.tznzzznzXy7y0SDyC01s0szls07U7Xz7U0SASDsaTlslszW807WDXw1U0S8yDk601sXsz0szzWDVz3U0SAS7wQ00slsTUE03XX1w118CCQ3k44UsVkD7k03W60Tt00C8slw0Y0sz3302G3XsS4C98CD3s3lYUswTkzaG7Xnza" + Text下一关 := "|<下一关>*192$69.zzzzzzzzwzls001zzzzz3yD0007zzzzwTVs000zzzzzlwTzlzzzzzzk00TyDzzzzzw003zlzzzzzzU00TyDzzzzzzy7zzkDzzzzzzszzy0zk000zz7zzk1y0007zkzzyA3k000s000zlkTzzzz0007yDXzzzzzw3zzlyzzzzzzUTzyDzzzzzzs1zzlzzzzzzy23zyDzzzzzzUsDzlzzzzzzkDUTyDzzzzzk3y0zlzzzzzz1zwDyDzzzzzxzzxU" + ; 有编队代表输了,点Esc + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text编队, , , , , , , TrueRatio, TrueRatio)) { + AddLog("战斗失败!尝试返回") + GoBack + Sleep sleepTime + return False + } + ; 如果有下一关,就点下一关(爬塔的情况) + else if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text下一关, , , , , , , TrueRatio, TrueRatio)) { + AddLog("战斗成功!尝试进入下一关") + FindText().Click(X, Y, "L") + Victory := Victory + 1 + if Victory > 1 { + AddLog("共胜利" Victory "次") + } + } + ; 没有编队也没有下一关就点Esc(普通情况或者爬塔次数用完了) + else { + AddLog("战斗结束!") + GoBack + Sleep sleepTime + return True + } + } } - if UserCheckColor([1720, 2111], [1539, 1598], ["0x00AEFF", "0x00AEFF"], scrRatio) { - UserClick(1905, 1568, scrRatio) - Sleep sleepTime - } - if A_Index > waitTolerance * 50 { - MsgBox "登录失败!" - ExitApp + else { + ; AddLog("未命中,重新计数") + check := 0 } } } ;返回大厅 BackToHall() { - 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 "退回大厅失败!" - ExitApp + AddLog("尝试返回大厅") + Text方舟 := "|<方舟的图标>*200$57.0000w00000003zzU000003zzzk00003zzzzU0000zzzzz0000Tzzzzz0007zzzzzw003zzxzzzk00zzw7bzz00Dzz0wDzw03zzk7UTzk0Tzs0w1zz07zz0Tk7zw1zzkDzUzzkDzy3zy3zz3zzUzzkTzsTzw7zz3zzbzzzzzsDzyTzzzzzzzznzzzzzzzzzDzxzzzzzztzzUzzzzzz7zy7zz1zzsTzkTzsTzy3zz1zy3zzUDzs7zUTzw0zzUDk7zz03zy0w1zzk0Dzs7UTzy00zzkw7zzU03zz7Vzzs00Dzzzzzy000zzzzzz0001zzzzzk0003zzzzs00007zzzw000007zzy0000007zw000U" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text方舟, , 0, , , , , TrueRatio, TrueRatio)) { ;如果没有找到大厅的文本,就一直点击左下角的小房子 + UserClick(333, 2041, scrRatio) + Sleep 500 + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep 500 } } + if !WinActive(nikkeID) { + MsgBox "窗口未聚焦,程序已终止" + Pause + } + Sleep sleepTime } -;1: 防御前哨基地奖励 -OutpostDefence() { - ; --- 函数开始 --- (移除了 Start: 标签) - 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 "进入防御前哨失败! (超时)" - ExitApp - } - if loopCounter > 10 { ; 尝试次数过多,可能卡住 - MsgBox "进入防御前哨尝试次数过多,退出。" - ; 可以选择是否在退出前尝试返回大厅 - ExitApp - } - } - ; 点击 "一举歼灭" 按钮 - 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 "进入一举歼灭失败! (超时)" - ExitApp - } - if loopCounter > 10 { - MsgBox "进入一举歼灭尝试次数过多,退出。" - ExitApp - } - } - ; 检查是否有免费扫荡次数 (按钮非灰色) - 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, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3 * PicTolerance, 0.3 * PicTolerance, Text大厅, , , , , , , TrueRatio, TrueRatio)) { ;查找并点击大厅的方舟按钮 + 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 "扫荡确认超时,退出。" - ExitApp + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3 * PicTolerance, 0.3 * PicTolerance, Text方舟, , , , , , , TrueRatio, TrueRatio)) { + 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("处理弹窗超时,退出。") - ExitApp - } - } - ; 点击 "获得奖励" 按钮 - 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("前哨基地防御奖励领取后返回大厅异常! (超时)") - ExitApp - } - } } -;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) - 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 - } +;登录 +Login() { + AddLog("正在登录") + check := 0 + while True { + Text := "|<方舟的图标>*200$57.0000w00000003zzU000003zzzk00003zzzzU0000zzzzz0000Tzzzzz0007zzzzzw003zzxzzzk00zzw7bzz00Dzz0wDzw03zzk7UTzk0Tzs0w1zz07zz0Tk7zw1zzkDzUzzkDzy3zy3zz3zzUzzkTzsTzw7zz3zzbzzzzzsDzyTzzzzzzzznzzzzzzzzzDzxzzzzzztzzUzzzzzz7zy7zz1zzsTzkTzsTzy3zz1zy3zzUDzs7zUTzw0zzUDk7zz03zy0w1zzk0Dzs7UTzy00zzkw7zzU03zz7Vzzs00Dzzzzzy000zzzzzz0001zzzzzk0003zzzzs00007zzzw000007zzy0000007zw000U" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + check := check + 1 + } + else check := 0 + if (check = 3) { break } - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if UserCheckColor([2088], [1327], ["0x00A0EB"], scrRatio) { - UserClick(2202, 1342, scrRatio) - } - if A_Index > waitTolerance { - MsgBox "进入付费商店失败!" - ExitApp - } - } - 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) + ;点击蓝色的确认按钮(如果出现更新提示等消息) + Text := "|<确认>*192$51.zz1zyDy7s0s0TUzkz0601y3y7s0U0TkTkzksT3z3y7yC3kTwzkzlk00zzy7wC0073zkzU800kDy7s1X761zkz0AMMsDw7s1U07lzUT2A00yDw3sFU07lzUT2AMMyDs1sFX77kb2DWAEEy0kkwF007k663W800y0VsA1737k8D0U0wsy23w407W7UUTUXkw0wC7y6SDU7nlzsU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("发现更新,尝试点击") + FindText().Click(X, Y, "L") 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 "进入礼包页面失败!" - ExitApp - } - } - 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 "进入每日礼包页面失败!" - ExitApp - } - } - 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 "进入每周礼包页面失败!" - ExitApp - } - } - 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 "进入每月礼包页面失败!" - ExitApp - } - } - 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 "退出付费商店失败!" - ExitApp - } - } -} -;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 "普通商店免费领取:等待确认弹窗超时!" - ExitApp - } - } - ; --- 点击确认按钮 --- - 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 "普通商店免费领取:等待返回商店界面超时!" - ExitApp - } - } - ; --- 单次免费领取完成 --- -} -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) ; 点击进入商店 - Sleep sleepTime - loopCounter += 1 - if loopCounter > waitTolerance { - MsgBox "进入普通商店失败!" - ExitApp - } - } - ; 检查第一次免费领取是否可用 (按钮非蓝色) - 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) ; 点击刷新按钮 + Text := "|<一周内不再提示的空框>*200$28.7zzzVzzzz7zzzyzzzzzk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000Dw000zk003z000DzzzzxzzzzXzzzwU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("发现公告,尝试勾选一周内不再提示后关闭") + FindText().Click(X, Y, "L") 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 "普通商店刷新:等待确认弹窗超时!" - ExitApp - } + Text := "|<叉叉>*174$29.bzzzxDzzzmDzzz6DzzwSDzzlyDzz7yDzwTyDzlzyDz7zyDwTzyDlzzy77zzy8Tzzy1zzzy7zzzs7zzzU7zzy67zzsS7zzVy7zy7y7zsTy7zVzy7y7zy7sTzy7Vzzy67zzy0Tzzy1zzzyE" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime } - ; 点击刷新确认按钮 - refreshConfirmX := 2221 - refreshConfirmY := 1351 - UserClick(refreshConfirmX, refreshConfirmY, scrRatio) + } + Text := "|<领取>*196$38.lk0k1zsQ0A0023U70000SDsX01U0S0lk803UAM1kks3WCQ0C8sU103UC0000s3UE40C0w7l03WD1sk0sVkkA2A0AA7sT021Vw3k30AA4Ts0XW3Xy0QU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") 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 "普通商店刷新:确认后返回商店超时!" - ExitApp - } + } + Confirm() + } + AddLog("已处于大厅页面,登录成功") +} +; 付费商店每日每周免费钻 +CashShop() { + BackToHall + AddLog("===付费商店任务开始===") + AddLog("寻找付费商店") + Text := "|<付费>*190$44.003U3zz0M0sDzzsD0C3zzy7k3UTzz1s1y7zzkyzznzzzTzzwzzzrzzyDyxzw0S0yDSz23VzXqDlksDzzVwSC1zzsD7XUDyS3kws3XXUQCC0tss703UDzy3k0s3yzwQ3y7z1z71zVz01VkTkA000Q000000U" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击付费商店") + FindText().Click(X, Y, "L") + Sleep sleepTime + Text一级红点 := "|<带红点的礼物>*100$62.zzzzzzzzk3zzzzzzzzk0Tzzzzzzzs03zzzzzzzy00Tzzzzzzz007zzzzzzzk00zzzzzzzs00Dzzzzzzy003zzzzzzzU00znzyDzzs00DkDy0zzz003s1z07zzk01w0Dk1zzy00T7VsQDzzU0DlwADXzzw07wTU7kzzzk7z0000Tzzzzzs0007zzzzzz0007zzzzzzzzzzzzzzzzzzzzzzzzzz007U07zzzzk01s00zzzzw00S00Dzzzz007U03zzzzk01s00zzzzw00S00Dzzzz007U03zzzzk01s00zzzzw00S00Dzzzz007U03zzzzk01s00zzzzy" + Text二级红点 := "|<二级页面小红点>*200$69.000000000zk000000000TzU000000003kD000000000k0M00000000CTlbzzzzzzzXbzCzzzzzzzztzwrzzzzzzzzDzbzzzzzzzztzyTzzzzzzzzDznzzzzzzzztzyTzzzzzzzzDznzzzzzzzztzwzzzzzzzzz7zazzzzzzzzwTtrzzzzzzzzkwAzzzzzzzzz07bzzzzzzzzz3szzzzzzzzzzw7zzzzzzzzzzUzzzzzzzzzzw7zzzzzzzzzzUU" + Text三级红点 := "|<三级页面带礼包的红点>*157$80.zzzzzzzzzzzwDzzzzzzzzzzzs0zzzzzzzzzzzwC7zzzzzzzzzzyDszzzzzzzzzzz7z7zzzzzzzzzznztzzzzzzzzzzwzyDzzzzzzzzzzDznzzzzzzzzzzXzwzzzzzzzzzzwzzDzzzzzzzzzzDzbzzzzzzzzzzlzlzzzzzzzzzzyDsTzzzzzzzzzzUwDzzzzzzzzzzw07zzzzzzzzzzzk7zzzzzzzzzzzzzzzzzzzzzzzzzzzxzzzzzzzzzzzzyD7zsTzzzzzzzzXlzy7zzzzzzzzswTz007zzzzzzk37zk01zzzzzzw0lzs00TzzzzzzgATwDz7zzzzzzz77y01lzzzzzzzllzk0QTzzzzzzsQTz077zzzzzzs37zlllzzzzzzw0FzwQQzzzzzzz04Tz06Dzzzzzzm/7zk03zzzzzzzXltwTkzzzzzzzswST7zzzzzzzzyD7blzszzzzzzzXk1w00Dzzzzzzsy0TU03zzzzzzyDsTy03zzzzzzy" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text一级红点, , 0, , , , , TrueRatio, TrueRatio)) { + Sleep sleepTime + AddLog("点击一级页面") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + else { + AddLog("付费商店已领取!") + AddLog("===付费商店任务结束===") + return + } + while (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text二级红点, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击二级页面") + FindText().Click(X, Y, "L") + Sleep 500 + if (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text三级红点, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击三级页面") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<付费商店>*154$74.szby0TzszzwTyDtw00Q00Dz3z7yTU07001k00lz3k01k00w008E0Q00Tllz7Xw407003wMTlsz103k00s00wS0ETty34C00D7U06SS1l7a8nls0lXbk03s60wSDwMty00y1kD00776TW4DU03U01lnbslXt6AsU0QTty8syFXC8z77wTU0TY0nW01ls7U40t78lU0QS1sDsCTsCM07DVzzzzbzDzTvU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm } - Sleep 1000 ; 刷新后额外等待一下界面加载 - ShopFreeClaim() ; 执行第二次免费领取 } + else AddLog("付费商店已领取!") } - ;废铁商店检查是否已经购买 - 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 "废铁商店进入异常!" - ExitApp - } - } - if sleepTime < 1500 - Sleep 500 - global isBoughtTrash - stdCkptX := [349] - stdCkptY := [1305] - desiredColor := ["0x137CD5"] - if !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - isBoughtTrash := 0 + else AddLog("付费商店未找到!") + AddLog("===付费商店任务结束===") + BackToHall +} +;普通商店 +NormalShop() { + BackToHall + AddLog("===普通商店任务开始===") + Text := "|<商店的商>*200$29.zzlzzzy1zzzw004000000000U000z00z1zz1y7zy3sDzy700w0001k0003U0AC71ssAC3Vk0Q47s0s0Tk1k0013UU0771U0CC33sQQ67UssA01lkM033kkzy7VXzUD3zz1y7zzzwTzzzk" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击商店图标") + FindText().Click(X, Y, "L") + Sleep sleepTime } else { - isBoughtTrash := 1 + AddLog("未找到商店图标") + BackToHall + return } - ;如果需要,则购买竞技场商店前三本书 - if (numOfBook >= 1 or g_settings["CompanyWeapon"]) { - stdTargetX := 134 - stdTargetY := 1403 - 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 > waitTolerance { - MsgBox "竞技场商店进入异常!" - ExitApp - } - } - if sleepTime < 1500 - Sleep 500 + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("已进入百货商店") } - 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) + loop 2 { + Text100 := "|<100%>*205$34.XUC0loA0k3KQnnDBPnDAwlDAwnnxwnnDDbnDAwyTAwnnmAnnDD+n0A0tfC0s3a8" + while (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text100, , , , , , , TrueRatio, TrueRatio)) { + 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 "第一本书购买异常!" - ExitApp - } - } - 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 "第一本书购买异常!" - ExitApp - } - } - } - } - 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 "第二本书购买异常!" - ExitApp - } - } - 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 "第二本书购买异常!" - ExitApp - } - } - } - } - 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 "第三本书购买异常!" - ExitApp - } - } - 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 "第三本书购买异常!" - ExitApp - } - } - } - } - 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 "公司武器熔炉购买异常!" - ExitApp - } - } - 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 "公司武器熔炉购买异常!" - ExitApp - } - } - } - } - 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 "退出免费商店失败!" - ExitApp - } - } -} -;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 "进入前哨基地失败!" - ExitApp - } - } - 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 "进入前哨基地失败!" - ExitApp - } - } - ;派遣公告栏 - ;收菜 - 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 "进入派遣失败!" - ExitApp - } - } - 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) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "全部派遣失败!" - ExitApp - } - 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 "全部派遣失败!" - ExitApp - } - } - } - ;回到大厅 - 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 "退出前哨基地失败!" - ExitApp - } - } -} -;5: 好友点数收取 -FriendPoint() { - stdTargetX := 3729 - stdTargetY := 553 - 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 "进入好友界面失败!" - ExitApp - } - } - stdCkptX := [2104, 2197] - stdCkptY := [1825, 1838] - desiredColor := ["0x0CAFF4", "0xF7FDFE"] - stdTargetX := 2276 - stdTargetY := 1837 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) && !UserCheckColor([2104, 2054], [1825, 1876], [ - "0x8B8788", "0x8B8788"], scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入好友界面失败!" - ExitApp - } - } - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "赠送好友点数失败" - ExitApp - } - } - 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 "退出好友界面失败!" - ExitApp - } - } -} -;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) - Sleep sleepTime // 2 - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - ExitApp - } - } - stdCkptX := [1641] - stdCkptY := [324] - desiredColor := ["0x01D4F6"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - ExitApp - } - } - ;进入模拟室 - 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) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入模拟室失败!" - ExitApp - } - } - ;开始模拟 - 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) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入选关失败!" - ExitApp - } - } - ;选择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) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "开始模拟失败!" - ExitApp - } - } - 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选择页面失败!" - ExitApp - } - } - 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 "进入战斗准备页面失败!" - ExitApp - } - } - ;点击进入战斗 - 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 "模拟室结束异常!" - ExitApp - } - } - 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 "退回大厅失败!" - ExitApp - } - } -} -;7: 新人竞技场收菜 -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 "进入方舟失败!" - ExitApp - } - } - stdCkptX := [1641] - stdCkptY := [324] - desiredColor := ["0x01D4F6"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - ExitApp - } - } - ;收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) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入竞技场失败!" - ExitApp - } - } - stdCkptX := [1683] - stdCkptY := [606] - desiredColor := ["0xF7FCFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入竞技场失败!" - ExitApp - } - } - ;进入新人竞技场 - 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 := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击购买") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - ExitApp - } } - return - } - if A_Index > waitTolerance { - MsgBox "进入新人竞技场失败!" - ExitApp - } - } - 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 "选择对手失败!" - ExitApp - } - } - ;点击进入战斗 - 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 "新人竞技场作战失败!" - ExitApp - } - } - } - ;退回大厅 - 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 "退回大厅失败!" - ExitApp - } - } -} -;特殊竞技场 -SpecialArena(times) { -} -;8: 对前n位nikke进行好感度咨询(可以通过收藏把想要咨询的nikke排到前面) -NotAllCollection() { - stdCkptX := [2447] - stdCkptY := [1464] - desiredColor := ["0x444547"] - return UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) -} -LoveTalking(times) { - ;进入妮姬列表 - stdTargetX := 1497 - stdTargetY := 2004 - 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 "进入妮姬列表失败!" - ExitApp - } - } - stdCkptX := [1466, 1814] - stdCkptY := [428, 433] - desiredColor := ["0x3B3C3E", "0x3B3C3E"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入妮姬列表失败!" - ExitApp - } - } - ;进入咨询页面 - stdTargetX := 3308 - stdTargetY := 257 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1650] - stdCkptY := [521] - desiredColor := ["0x14B0F5"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - ;如果没次数了,直接退出 - if UserCheckColor(stdCkptX, stdCkptY, ["0xE0E0E2"], scrRatio) { - 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 := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - ExitApp - } - } - return - } - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入咨询页面失败!" - ExitApp - } - } - ;点进第一个妮姬 - stdTargetX := 736 - stdTargetY := 749 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1504] - stdCkptY := [1747] - desiredColor := ["0xF99F22"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入妮姬咨询页面失败!" - ExitApp - } - } - loop times { - stdCkptX := [1994] - stdCkptY := [1634] - desiredColor := ["0xFA6E34"] - ;如果能够快速咨询 - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) && !(g_settings["LongTalk"] && NotAllCollection()) { - ;点击快速咨询 - stdTargetX := 2175 - stdTargetY := 1634 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1994] - stdCkptY := [1634] - desiredColor := ["0xFA6E34"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入妮姬咨询页面失败!" - ExitApp - } - } - ;点击确定 - stdTargetX := 2168 - stdTargetY := 1346 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1504] - stdCkptY := [1747] - desiredColor := ["0xF99F22"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "快速咨询失败!" - ExitApp - } } } else { - ;如果不能快速咨询 - stdCkptX := [1982] - stdCkptY := [1819] - desiredColor := ["0x4A4A4C"] - if !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - stdTargetX := 2168 - stdTargetY := 1777 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1504] - stdCkptY := [1747] - desiredColor := ["0xF99F22"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "咨询失败!" - ExitApp + AddLog("没有可白嫖的东西") + } + if g_settings["NormalShopDust"] { + Text := "|<芯尘盒>*174$62.1UM00k00600wD00S003k0Tzw1ba03z0Tzzkxvk3zwDzzwSSy3zztzzyDbbnzzz3mw7lsyzzzUNq1sS77zzk0w0A7UUTzs07U00k07zy0RsE0S01zzVzDS07U0DzkTn7Vzzs7zy7w1sTzy3zzlz0D7zzUzzwxkTk1s0DzzDSDw0S03zzkbzkTzzvzzz1zs7zzyzzzk7w1zzzjzzy" + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + loop ok1.length { + AddLog("点击芯尘盒") + FindText().Click(ok1[A_Index].x, ok1[A_Index].y, "L") + Text := "|<信用点的图标>*169$29.000k0001s000Tk001vk007Xk00TDk03znk0DzDU0zyTU7zzz0Tzzz1zzzz7zzzwjzzxnDzzy6Dzzs0TzvU8zzy09zzk0DTr00DzQ00TxU00Te000Ts000RU000Q0000E004" + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买芯尘盒") + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } } - } - ;点击确认 - stdTargetX := 2192 - stdTargetY := 1349 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2109] - stdCkptY := [1342] - desiredColor := ["0x00A0EB"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "咨询失败!" - ExitApp - } - } - stdCkptX := [1504] - stdCkptY := [1747] - desiredColor := ["0xF99F22"] - stdTargetX := 1903 - stdTargetY := 1483 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - if Mod(A_Index, 2) == 0 - UserClick(stdTargetX, stdTargetY, scrRatio) - else - UserClick(stdTargetX, 1625, scrRatio) - Sleep sleepTime // 2 - if A_Index > waitTolerance * 2 { - MsgBox "咨询失败!" - ExitApp + else { + AddLog("只使用信用点购买,跳过") + Confirm } } } } - if A_Index >= times - break - ;翻页 - stdTargetX := 3778 - stdTargetY := 940 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [1982] - stdCkptY := [1819] - desiredColor := ["0x4A4A4C"] - numOfTalked := A_Index - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index + numOfTalked >= times + 2 - break 2 - if A_Index > waitTolerance { - MsgBox "咨询失败!" - ExitApp - } - } - } - ;退回大厅 - 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 "退回大厅失败!" - ExitApp - } - } -} -;9: 爬塔一次(做每日任务) -FailTower() { - 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 "进入方舟失败!" - ExitApp - } - } - stdCkptX := [1641] - stdCkptY := [324] - desiredColor := ["0x01D4F6"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - ExitApp - } - } - ;进入无限之塔 - 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) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入无限之塔失败!" - ExitApp - } - } - stdTargetX := 1953 - stdTargetY := 934 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2129, 2305] - stdCkptY := [1935, 1935] - desiredColor := ["0x2E77C2", "0x2E77C2"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "选择作战失败!" - ExitApp - } - } - stdTargetX := 2242 - stdTargetY := 2001 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - stdCkptX := [2129, 2305] - stdCkptY := [1935, 1935] - desiredColor := ["0x2E77C2", "0x2E77C2"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入作战失败!" - ExitApp - } - } - ;按esc - stdCkptX := [2065] - stdCkptY := [1954] - desiredColor := ["0x238CFD"] - stdTargetX := 3780 - stdTargetY := 75 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "按esc失败!" - ExitApp - } - } - ;按放弃战斗 - stdCkptX := [2065] - stdCkptY := [1954] - desiredColor := ["0x238CFD"] - stdTargetX := 1678 - stdTargetY := 1986 - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "放弃战斗失败!" - ExitApp - } - } - ;退回大厅 - 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 "退回大厅失败!" - ExitApp - } - } -} -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] " " - } - if info != "" { - info := "`n" info "已经爬不动惹dororo..." - } - return info -} -;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 "进入方舟失败!" - ExitApp - } - } - stdCkptX := [1641] - stdCkptY := [324] - desiredColor := ["0x01D4F6"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - ExitApp - } - } - ;进入无限之塔 - 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) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入无限之塔失败!" - ExitApp - } - } - 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 "进入企业塔失败!" - ExitApp - } - } - ;直到成功进入企业塔 - stdCkptX := [3738] - stdCkptY := [447] - desiredColor := ["0xF8FCFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入企业塔失败!" - ExitApp - } - } - ;进入关卡页面 - 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 "进入企业塔关卡页面失败!" - ExitApp - } - } - ;如果战斗次数已经用完 - 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 "企业塔自动战斗失败!" - ExitApp - } - } - ;如果战斗失败或次数用完 - if MissionFailed() || MissionEnded() { - if MissionFailed() { - towerName := "" - global failedTower - switch i { - case 1: - towerName := "极乐净土塔" - case 2: - towerName := "米西利斯塔" - case 3: - towerName := "泰特拉塔" - case 4: - towerName := "朝圣者塔" - default: - towerName := "" + if g_settings["NormalShopPackage"] { + Text := "|<礼包>*179$37.6301k03Xk0s01ls0zzbyw0zzvzS0zzwzj0zyS3bUTzD3nk7zrXts1zvryw0Qxvzy0Dytzz07zwLrb3zy3XnVkDVltks1sszsTzwQDsDzwC3s1zwU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(x, y, "L") + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买简介个性化礼包") + FindText().Click(x, y, "L") + Sleep sleepTime + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } } - failedTower.Push towerName } - Send "{Escape}" - Sleep sleepTime - while MissionFailed() || MissionEnded() { - Send "{Escape}" - Sleep sleepTime - } - stdCkptX := [3738] - stdCkptY := [447] - desiredColor := ["0xF8FCFE"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(3666, 1390, scrRatio) - Sleep sleepTime - if UserCheckColor([2088], [1327], ["0x00A0EB"], scrRatio) { - UserClick(2202, 1342, scrRatio) + } + ;确认至百货商店页面 + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("返回百货商店页面") + Confirm + } + Text := "|*184$36.UA7kC0081U607slXyT7ssXyT7ssUC10MlUC10M1XyT7s3XyT7slU60bstU60U" + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 1, , , , , TrueRatio, TrueRatio)) { + while true { + Text := "|<刷新的图标>*154$19.zlzz07y00C7w77z37z1bzs3zzVzz8zzUTzlzzs7zwUDwMDwA7wC0sD80Dz0Tk" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, , , , , , TrueRatio, TrueRatio)) { + AddLog("免费刷新一次") + FindText().Click(X, Y, "L") 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) - Sleep sleepTime + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + break } } - 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 "退回大厅失败!" - ExitApp - } + else break } + AddLog("===普通商店任务结束===") } -;11: 进入异拦 -Interception() { - global g_numeric_settings ; - 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 "进入方舟失败!" - ExitApp - } - } - stdCkptX := [1641] - stdCkptY := [324] - desiredColor := ["0x01D4F6"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { +; 竞技场商店 +ArenaShop() { + AddLog("===竞技场商店任务开始===") + Text := "|<竞技场商店的图标>*127$42.zzs0DzzzzU03zzzz001zzzy1y1zzzw7z0zzzsTTUzzzswDUzzzkwDUlzylwDUwTsVsDVz7lXsD1zXXXsS3zl7XsE7zt7XU0TzsD301zzsD3U0Tzs73kkTzsb3ksDzlXXks7zntXkw7wrxVUw3szzVUy1kzzk1z01zzk1z03zzw1zU7zzy3zsTzU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("进入竞技场商店") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入方舟失败!" - ExitApp - } } - ;进入拦截战 - stdTargetX := 1781 - stdTargetY := 1719 - 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 "进入拦截战失败!" - ExitApp - } - } - stdTargetX := 559 - stdTargetY := 1571 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep 1000 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep 1000 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep 1000 - ;选择BOSS - switch g_numeric_settings["InterceptionBoss"] { - case 1: - stdTargetX := 1556 - stdTargetY := 886 - stdCkptX := [1907] - stdCkptY := [898] - desiredColor := ["0xFA910E"] - case 2: - stdTargetX := 2279 - stdTargetY := 1296 - stdCkptX := [1923] - stdCkptY := [908] - desiredColor := ["0xFB01F1"] - case 3: - stdCkptX := [1917] - stdCkptY := [910] - desiredColor := ["0x037EF9"] - case 4: - stdTargetX := 2281 - stdTargetY := 899 - stdCkptX := [1916] - stdCkptY := [907] - desiredColor := ["0x00F556"] - case 5: - stdTargetX := 1551 - stdTargetY := 1299 - stdCkptX := [1919] - stdCkptY := [890] - desiredColor := ["0xFD000F"] - default: - MsgBox "BOSS选择错误!" - ExitApp - } - stdTargetX := 1556 - stdTargetY := 886 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep 2000 - if A_Index > waitTolerance { - MsgBox "选择BOSS失败!" - ExitApp - } - } - ;点击挑战按钮 - if UserCheckColor([1735], [1730], ["0x28282A"], scrRatio) { - 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 "退回大厅失败!" - ExitApp + Text := "|<燃烧代码的图标>*100$15.ztzyDz1zkDw0z07k0S23UsAD01s0DUVw4DldyD7nwww" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.23 * PicTolerance, 0.23 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) 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, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买燃烧代码手册") + FindText().Click(x, y, "L") + Sleep sleepTime + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } } } + } + Text := "|<水冷代码的图标>*122$17.zrvzDbwSDkQDUkS1Vs1bU3z07w0Ds0TU0z01z07y0Ty1zs" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) 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, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买水冷代码手册") + FindText().Click(x, y, "L") + Sleep sleepTime + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + } + Text := "|<风压代码的图标>*150$21.zwTzz1zzkCDy00s017U6QbzrU000z00Czzzk07zs0TzznzzDTztnzz4Tzw7w" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) 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, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买风压代码手册") + FindText().Click(x, y, "L") + Sleep sleepTime + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + } + Text := "|<电击代码的图标>*110$12.zxztznznzXz7y7y7w7s7k1k0U001w3y7w7wDwTwztztzvzrzU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) 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, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买电击代码手册") + FindText().Click(x, y, "L") + Sleep sleepTime + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + } + Text := "|<铁甲代码的图标>*150$20.sDVs1kC00100000000000000006001k00z00zk1zw0zy0DzU3zs0zy0Tzk7zy7zs" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) 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, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买铁甲代码手册") + FindText().Click(x, y, "L") + Sleep sleepTime + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + } + Text := "|<代码手册宝箱>*159$82.000000zs00000000000TXw0000000000300Q0000000000T03k000000000Drnzs000000007kCD1w00000003s1sy0z0000003w1v0r0Tk00001w0t001U7s000Sy0QE000s1zs0Dj0C40I0EM1ss3U4CI01s07600MM0r00000003A0l0/Y00000003m1g1n00000080E06yz00/0003k13lzzX000000004Vjzw1k0000001k3zU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) and g_settings["BookBox"] { + FindText().Click(x, y, "L") + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买代码手册宝箱") + FindText().Click(x, y, "L") + Sleep sleepTime + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + Text := "|<礼包>*179$37.6301k03Xk0s01ls0zzbyw0zzvzS0zzwzj0zyS3bUTzD3nk7zrXts1zvryw0Qxvzy0Dytzz07zwLrb3zy3XnVkDVltks1sszsTzwQDsDzwC3s1zwU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) and g_settings["ArenaShopPackage"] { + FindText().Click(x, y, "L") + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买简介个性化礼包") + FindText().Click(x, y, "L") + Sleep sleepTime + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + Text := "|<熔炉>*171$40.60k0k20s3U30Q3XzsS1kCTzVs7Uzzy7zzzzltzzzzzjbzzzyySTzVzrztzC7yDzbszzsTwT3znXzsQTzDTzltsQzzy7rU7zzsTS0Trj3zk3qQQCz0CFzltw0s7z73U10TwA608" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) and g_settings["ArenaShopFurnace"] { + AddLog("购买公司武器熔炉") + FindText().Click(x, y, "L") + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok1 := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(x, y, "L") + Sleep sleepTime + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok2 := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + AddLog("===竞技场商店任务结束===") +} +; 废铁商店 +ScrapShop() { + AddLog("===废铁商店任务开始===") + Text := "|<废铁商店的图标>*160$40.zw000zzzU001zzy0003zzk000Dzz3zzkTzsDzzVzz1zzy3zw7zzwDzUy7zkTy7s7zVzkTU7y3z3z07w7sDz0TsT1zz1zUwDzy7z3UzsTzw67zUTzsETy0TzU1zw0Tz27zw1zs8Dzw7z1kzzsTw71zVzzUy7y1zy7sDs1zkTkTk1z3zVzk7sDy3zkT1zwDzVwDzkTzzUzzVzzy7zy3zzkTzw0003zzs000DzzU001zzz000DzU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + if g_settings["ScrapShopGem"] { + Text := "|<珠宝>*171$40.00s01k3yHU070Dvi0zzyzjs7zzxszyTzznbztwDzCTz7U0zznUTzzjzS0TzwzzzVzzUtzz0D03bzsDzsC3y0zzUsTs3zy3tzk0zkzzzU1rXzvj0DSCDCszzy0Mtbzzs03UDzzc" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + ; 珠宝领了就默认整个任务做完了 + else { + AddLog("已执行,跳过") + AddLog("===废铁商店任务结束===") + BackToHall + return + } + Text := "|*124$23.76CMCAAkQMN0kksEVVkV33V267649DA0GCM0UME10kU21V8Ym2F1YUW31Vgi78" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买珠宝") + FindText().Click(X, Y, "L") + ;确认至百货商店页面 + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + if g_settings["ScrapShopVoucher"] { + loop 6 { + Text := "|<礼物的图标>*195$22.3sS0Tnw1XwM67VUMQCDzDzzwzzznzzzDzzwzzznzzzDzzwzs0000000Dwzkznz3zDwDwzkznz3zDwDwzW" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.15 * PicTolerance, 0.15 * PicTolerance, Text, , 0, , , , 1, TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买" A_Index "张好感券") + FindText().Click(X, Y, "L") + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + } + if g_settings["ScrapShopResources"] { + loop 6 { + Text := "|<小时>**50$83.000003zw0000000000063zC00000000008AjzA000000000k0bzzA00000001006R7zC000Dzzzzzzzzzz401k000000001zy0C2000000000RA0lzU00000000TM16zk00000000Pk6SLk00000000OU9vvU00100A00q0nQxU0k71wM00Y0ARn03kC3zs01c2MCS07XRazs03E4k3o076PB/U0701UAc0CBrSL00+030Hk0Qviby00Q0G0xU0trBBw00c0b1a03nCPss03E07Uw0DkQ7lU07817yk0TXsAD00SE17j0003U0S01YU11k000000007N01U000000000vW01zzzzzzzzzz5A00008020V0lHC00000k00060VXA00001U0000MX7NE" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3 * PicTolerance, 0.3 * PicTolerance, Text, , 0, , , , 1, TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|*124$23.76CMCAAkQMN0kksEVVkV33V267649DA0GCM0UME10kU21V8Ym2F1YUW31Vgi78" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买" A_Index "次养成资源") + FindText().Click(X, Y, "L") + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + Text := "|<信用点>**50$62.21U00000C01kw0Tzy03k0Q7U7zzU0jyDzTVTDg081XjrwLrv02ztf0755Wk0c0uE1VTTgDvyAY0ELnv3yzW9UA5wykjzcuE11TTg/zuCY0EIK/2U2Udzw5xykjzc+E13TDg9zu2Y0Ezrv3zzUdzqDzykUu8+TzXlMgQ2j2b1tsK/7ivsdzyS5yXnjS+LxbVrswdnnbztkRyCCQstkA83C0300U" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3 * PicTolerance, 0.3 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|*124$23.76CMCAAkQMN0kksEVVkV33V267649DA0GCM0UME10kU21V8Ym2F1YUW31Vgi78" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("购买信用点") + FindText().Click(X, Y, "L") + Text := "|<百货>*128$36.zzzwMt001sM1001kE1z3zU0Bz3zk0sk07ws0k07ww1k07wzzlz7s03ly7s03k07slXk07slXlz7slXlz7sV3k07y07k07U60k07kTlnz7vzzU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + } + AddLog("===废铁商店任务结束===") +} +; 模拟室 +SimulationRoom() { + EnterToArk + AddLog("===模拟室任务开始===") + AddLog("查找模拟室入口") + Text := "|<方舟中的模拟室>*121$58.zzzzzzzzjz727lrszsTwM0D6DXU00lU0wM6A0023070UMk00040Q01XXzkUU0k80D00D603lW1y00w80D6A7w67UU0w8wTU0C00303lw00M00Q2D7s0n0k1kM0Da7A603lU0w00EM07603k01lk0wM07i2D703V20M00AEA4Csl000lXsszni003jzzzzzzzzs" + while (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("进入模拟室") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<左上角的模拟室>*200$54.rn7vzvztzr03vbvk00nn7nUvlzs1zjVavnzw1U7VaPzzznbbnaPy03nXbvbvz7bXbbtbny77Vbblbnw031U7Vbnztz7wznbnztz7wTvUVzkTL03vVVw03rk7vb1ztzrnbnjAzszr7nXyRk00U" + while !(ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + AddLog("成功进入模拟室") + Text := "|<模拟结>*95$58.A6A3000E30kzsAM61UQ37zklcMC1kADQ37lUlzzwNkzP67LzzrzXxiMtVkATy36PXy70tzsANiDnzbrzUlUkiDzTM63q30s01zzszMA7s0DHz3lZszjyw3U37rXszunzwATS03VfDzklnw0i6A7Q3CQnysMlswQnnjvzXD1nk6AkDyAE040000kO" + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("退出进行中的模拟") + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + Text := "|<开始模拟>*174$88.zzzz7wzyTbDtzzy001wTlzts0DXbwk007lyDzb00SSPnU00T7szyQ03ssDDsyDs77DUSQy1YMzXtz0AQQ1U1s6NXyDbw0Xss403UNWDsyTsU03slyDXa8zXszW007X00yCQX000CNUwQ403styQ000tbzzk1yDVbtk0036Tzy000s6TbwTby1U0sK07UtwTlyTwC031z7yXYEz7tzssyA600SC03szbzVXsuQ01ssM7XyTw2DXty0zX34QTtzV8yDbkVyAQM1zbwDU0yQ71VnXUDyTly03tUy67ySPztzztyTbTywzzzU" + if (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击开始模拟") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + ;打过了就直接退 + Text := "|<已通关>*197$62.00000001047zz0kzy0s7XzzsSDzUD1kTzy3kzk1kw007UQDs1zzk00s3DzUzzyQ0C03zwDzzb03U0zz03k1zzsTDzk0Q0Tzy7nzw0DU7zzVwzz7zzxs0s7DzlzzzQ001nzwTzzb000Qzz07w1k0C7ATk1zUS03Vz7w1xw7U0szli0yDkzzyTzztz1zDzz7DzyT07kzzUUTz7U0u" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("今日模拟室已通关") + GoBack + AddLog("===模拟室任务结束===") return } - stdTargetX := 1924 - stdTargetY := 1779 - stdCkptX := [1390] - stdCkptY := [1799] - desiredColor := ["0x01AEF3"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + AddLog("选中5C") + Text := "|<5>*163$22.7zzUTzz3zzwDzzkzzz3zzsDk00z003w00Dk00zz03zz0Dzz1zzy7zzwTzztz0zU01y007w00Dk00z003xw0Tzs1yTkDtzzzXzzw7zzUDzw0TzU0Ts2" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime // 2 + } + Text := "|*164$26.01zU03zz03zzw1zzzUzzzwTzzy7zUz3z03lzU08Tk007s003y000z000Dk003w000z000Dk003w000z000Dk001y000Tk007w000zk0MDy0T1zzzsDzzz1zzzUDzzk1zzs07zs007U2" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime // 2 + } + Text := "|<快速模拟的图标>*200$42.zzk07zzzz000zzzw000Dzzk0007zzU0001zz00000zy00000Tw00000Ds00000Ds000007k0U1003k1k3U03U3s7k01U3yDs0103z7w0100zXy0000Tlz0000DsTk0007wDs0003y7w0001z3y0001z3w0003wDs0007wTk000TkzU000zVz0001z3y00U3y7w01U3w7s01U3s7k03k0k3U03k000007s000007w00000Dw00000Ty00000Tz00000zzU0003zzs0007zzw000Tzzz001zzzzs07zzU" + while (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击快速模拟") + FindText().Click(X + 100 * WinRatio, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "点击挑战失败!" - ExitApp - } } - ;选择编队 - switch g_numeric_settings["InterceptionBoss"] { - case 1: - stdTargetX := 1882 - stdTargetY := 1460 - stdCkptX := [1843] - stdCkptY := [1428] - case 2: - stdTargetX := 2020 - stdTargetY := 1460 - stdCkptX := [1981] - stdCkptY := [1428] - case 3: - stdTargetX := 2151 - stdTargetY := 1460 - stdCkptX := [2113] - stdCkptY := [1428] - case 4: - stdTargetX := 2282 - stdTargetY := 1460 - stdCkptX := [2248] - stdCkptY := [1428] - case 5: - stdTargetX := 2421 - stdTargetY := 1460 - stdCkptX := [2380] - stdCkptY := [1428] - default: - MsgBox "BOSS选择错误!" - ExitApp - } - desiredColor := ["0x02ADF5"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep 1500 - if A_Index > waitTolerance { - MsgBox "选择编队失败!" - ExitApp - } - } - ;如果不能快速战斗,就进入战斗 - stdCkptX := [1964] - stdCkptY := [1800] - desiredColor := ["0xF96B2F"] - if !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - stdTargetX := 2219 - stdTargetY := 1992 - stdCkptX := [1962] - stdCkptY := [1932] - desiredColor := ["0xD52013"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "进入战斗失败!" - ExitApp - } - } - ;退出结算页面 - stdTargetX := 904 - stdTargetY := 1805 - stdCkptX := [3731, 3713, 3638] - stdCkptY := [2040, 2034, 2091] - desiredColor := ["0xE6E6E6", "0xE6E6E6", "0x000000"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - CheckAutoBattle() - Sleep sleepTime - if A_Index > waitTolerance * 20 { - MsgBox "自动战斗失败!" - ExitApp - } - } - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退出结算页面失败!" - ExitApp - } - } - } - ;检查是否退出 - stdCkptX := [1390] - stdCkptY := [1799] - desiredColor := ["0x01AEF3"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { + Text := "|<跳过增益选择的图标>*141$26.s0k0D0D03w3s0zUzUDyDw3znzkzzzyDzzzvzzzzzzzzjzzznzvzszwzsDwDw3y3w0y0y0D0C010300U" + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("跳过增益选择") + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退出结算页面失败!" - ExitApp - } } - ;快速战斗 - stdTargetX := 2229 - stdTargetY := 1842 - stdCkptX := [1964] - stdCkptY := [1800] - desiredColor := ["0xF96B2F"] - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) + EnterToBattle + BattleSettlement + Text := "|<模拟结束的图标>*159$38.03zzzy01zzzzs0zzzzy0Dk00Dk3k001w0w000D0D0003k00000w00000D000003k0U000w0M000D0S0003kDU000w7zzU0D3zzs03nzzy00xzzzU0Dzzzs03zzzy00xzzzU0DDzzs03lzzy00wDzzU0D0y0003k7U000w0s000D020003k00000w00000D000003k3k000w0w000T0DU00Dk3zzzzw0Tzzzy03zzzz0000302" + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击模拟结束") + FindText().Click(X + 50 * WinRatio, Y, "L") Sleep sleepTime - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "快速战斗失败!" - ExitApp - } - } - ;退出结算页面 - stdTargetX := 904 - stdTargetY := 1805 - stdCkptX := [2232, 2391, 2464] - stdCkptY := [2100, 2099, 2051] - desiredColor := ["0x000000", "0x000000", "0x000000"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "快速战斗结算失败!" - ExitApp - } - } - while UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退出结算页面失败!" - ExitApp - } - } - ;检查是否退出 - stdCkptX := [1390] - stdCkptY := [1799] - desiredColor := ["0x01AEF3"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退出结算页面失败!" - ExitApp - } - } - Sleep 1000 - stdTargetX := 2229 - stdTargetY := 1842 - stdCkptX := [1964] - stdCkptY := [1800] - 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) + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退回大厅失败!" - ExitApp - } } + Text := "|<左上角的模拟室>*200$54.rn7vzvztzr03vbvk00nn7nUvlzs1zjVavnzw1U7VaPzzznbbnaPy03nXbvbvz7bXbbtbny77Vbblbnw031U7Vbnztz7wznbnztz7wTvUVzkTL03vVVw03rk7vb1ztzrnbnjAzszr7nXyRk00U" + while !(ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + AddLog("===模拟室任务结束===") } -;11: 邮箱收取 -Mail() { - stdTargetX := 3667 - stdTargetY := 81 - 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 "进入邮箱失败!" - ExitApp +; 模拟室超频 +SimulationOverClock() { + AddLog("===模拟室超频任务开始===") + Text := "|<剩余奖励的0>*80$26.s001wTzyCDzzl600C3001lU00AE0014000F0004E3w141VUF0E84E421410UF0E84E66140z0F0004E0014000FU00AA0071U03WDzzllzzsy000S" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("模拟室超频未完成") + Text := "|<开始超频>*173$63.zzyD7ztzwzs01nszyA1a000CTBX0FY077DUF4Q6Abnttw2QXtk4k7DDU00M0E0000C40E7z02001UrrHUACE00A7zs41U27DDkk70aA0Eltz60kA1806DDs3a3UD34Xty0QkDzsw8zDXk6E0AC0jtyy0n01Xlo" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime } } - stdCkptX := [2085] - stdCkptY := [1809] - desiredColor := ["0xCAC7C4"] ;检测灰色的领取按钮 - stdTargetX := 2085 - stdTargetY := 1809 - ;Sleep sleepTime ;加载容错 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) ;不是灰色就一直点全部领取 + else { + AddLog("模拟室超频已完成!") + return + } + Text := "|*168$49.03wzVzk3U0yT0Dk0E0DD03k09z7b3kszUzXn7wQzy01tXz60D00wlzX01U0CMzls0Hz7ATszz1zlaDwTzUzsnXwQzkDstk0S7k00Qy0TU0U0STUTs0s" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") Sleep sleepTime } - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - stdTargetX := 2394 - stdTargetY := 291 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) ;确认领取+返回直到回到大厅 + Text := "|<25>*121$44.U00y000k007U00A000s003000C000k001000DzzUEDzzzzw63zzzzz1Uzzzk00M00Dk006000w003U00C001s001U00y0000Dzzzzw03zzzzz00zzzzzk0001U000000E0010006000s001U00S000M00DU" + if (ok := !FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("未选择难度!跳过") + return + } + Text := "|<开始模拟>*177$110.zzzzzzzzzzTztzzzzzzzzzzlzszzXwQDwTzyT0003wTwDzkw00z7Xz3U000T7z7zwC007lsTks000DlzVzz3U01wS0wS0003wTsszkz73z3UD7z3wDw0QCDk3ttz08Flzkz3y077ls0k07U2AQTwDkzU1VwD0A00w1X37z3wDyAEE3wD00Tlsslzkz3zX000T3lz7wSCATwDkzsl007kM00z7XX7U008QQEDlw200Tkszlk00076Dzzy0Vz3w2DsQ0001lXzzzU000w0XyDU000w8s03k000S0MzXzlz3z0C00w3z1zUCCkTsTkzw3U0C0zszx7U47y7wDzUszXUC007ls00zVz3zsCDss3001wS0UDkzkzy1XyDMk00T7UM1sDwDz0MzXyDs1zlkQ8Q7z3zVa7kzXwADwQC763zkzkTU0Dss70S7b1k0zwDwDs03wA3s71zkwMTz3z7y60z33zXkTyTjTzlzzzbzTtzzzyzzzzU" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退出邮箱失败!" - ExitApp + } + final := false + while true { + Text := "|<获得>*120$30.xvzzzU0D8000C8sstwM0duxcsVkT80XnSA100A80s0880llwDlVlz009UzBntYTAnkCDCHWTDD3U" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime } - } -} -;12: 任务收取 -Mission() { - stdTargetX := 3341 - stdTargetY := 206 - 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 "进入任务失败!" - ExitApp + Text := "|<模拟通关>*103$63.rqzTzzzzzzyM1tbbQ0TDXm07AAkk3sswAHl1b71z2700A04yk3U0AM1l47w0C03V0DAUtUFz7w01s7640DszU0A0ssUF00001V67Y0A0130CA0wUFy3sE0t03YkDUDnUT8UM63sMSMEl8E0087UmD4TaHU1Xy4" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + final := True + AddLog("挑战最后一关") + FindText().Click(X, Y, "L") + Sleep sleepTime } - } - stdTargetX := 2286 - stdTargetY := 1935 - x0 := 1512 ;用于遍历任务 - y0 := 395 - while UserCheckColor([1365, 2087], [1872, 1997], ["0xF5F5F5", "0xF5F5F5"], scrRatio) { ;检测是否在任务界面 - Sleep sleepTime - UserClick(x0, y0, scrRatio) ;点任务标题 - Sleep sleepTime - if !UserCheckColor([1365, 2087], [1872, 1997], ["0xF5F5F5", "0xF5F5F5"], scrRatio) { ;退出 + EnterToBattle + BattleSettlement + if final = True { break } - stdCkptX := [2276] - stdCkptY := [1899] - desiredColor := ["0x7B7C7B"] - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { ;如果不是灰色就点 - Sleep sleepTime - UserClick(stdTargetX, stdTargetY, scrRatio) ;点领取 + AddLog("模拟室超频第" A_Index "关已通关!") + Text := "|*215$15.k0600k0K1bkAy1qk7q0wz3bwMU" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("获取第" A_Index "次增益") + FindText().Click(X, Y, "L") + Sleep 500 + FindText().Click(X, Y, "L") + Sleep 500 + FindText().Click(X, Y, "L") } - x0 := x0 + 280 ;向右切换标题 - } -} -;13: 通行证收取 兼容双通行证 兼容特殊活动 -Pass() { - OnePass() - stdCkptX := [3395] - stdCkptY := [368] - stdCkptY1 := [468] ;活动可能偏移 - desiredColor := ["0xFBFFFF"] ;白色的轮换按钮 - stdTargetX := 3395 - stdTargetY := 368 - stdTargetY1 := 468 - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { ;如果轮换按钮存在 - global PassRound - PassRound := 0 - while (PassRound < 2) { - userClick(stdTargetX, stdTargetY, scrRatio) ;转一下 + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") Sleep sleepTime - PassRound := PassRound + 1 - stdCkptX := [3437] - stdCkptY := [338] - desiredColor := ["0xFE1809"] ;红点 - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { ;如果转出红点 - Sleep sleepTime - userClick(stdTargetX, stdTargetY, scrRatio) ;再转一下 - Sleep sleepTime - OnePass() - break + } + } + Text := "|<模拟结束的图标>*159$38.03zzzy01zzzzs0zzzzy0Dk00Dk3k001w0w000D0D0003k00000w00000D000003k0U000w0M000D0S0003kDU000w7zzU0D3zzs03nzzy00xzzzU0Dzzzs03zzzy00xzzzU0DDzzs03lzzy00wDzzU0D0y0003k7U000w0s000D020003k00000w00000D000003k3k000w0w000T0DU00Dk3zzzzw0Tzzzy03zzzz0000302" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|*215$15.k0600k0K1bkAy1qk7q0wz3bwMU" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("获取第" A_Index "次增益") + FindText().Click(X, Y, "L") + Sleep 500 + FindText().Click(X, Y, "L") + Sleep 500 + FindText().Click(X, Y, "L") + } + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + AddLog("===模拟室超频任务结束===") +} +; 竞技场收菜 +Arena() { + EnterToArk() + AddLog("===竞技场收菜任务开始===") + AddLog("查找奖励") + Text := "|*103$36.V132Qn1162Mn99CGMHB9COMHD9CSMH312SMHV12SMHt3CSMHtDCSEH9DCGE31DC2H31D22H0XjX7H0U" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击奖励") + FindText().Click(X, Y, "L") + Text := "|<领取>*179$44.sw0C07zwC0300zz3k0s000UTXzCA01XszlX74Q00w0tt1U0D0CQKDBXlXb7nn8wsslswmD6CAk3AXk3mA0m8w0w3yAWD4D1zb8XnXsTlmMwsS7UwaS03VkDkT01kC7w3k0s1kyATyAACC7XzW7XnXwzsnxU" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击领取") + FindText().Click(X, Y, "L") + Sleep sleepTime + AddLog("尝试确认并返回方舟大厅") + Text := "|<方舟页面左上角的方舟>*111$36.zXzzVzzXzzVzz1zs03001s03001s33wDzsVXwTzslXw07st3w07U00w07U00sT7k33sz7sXXkz7kVXkz7llXVy7VzX3UDXy37kDXy7ztzzzDU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm } } } - if UserCheckColor(stdCkptX, stdCkptY1, desiredColor, scrRatio) { ;检测是否偏移 - global PassRound - PassRound := 0 - while (PassRound < 2) { - userClick(stdTargetX, stdTargetY1, scrRatio) ;转一下 - Sleep sleepTime - PassRound := PassRound + 1 - stdCkptX := [3437] - stdCkptY := [438] - desiredColor := ["0xFE1809"] ;红点 - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { ;如果转出红点 - Sleep sleepTime - userClick(stdTargetX, stdTargetY1, scrRatio) ;再转一下 - Sleep sleepTime - OnePass() - break - } - } + else AddLog("未找到奖励") + AddLog("===竞技场收菜任务结束===") + AddLog("进入竞技场") + Text := "|<竞技场>*80$59.zUzwDVz70T001sT3y80C003kU0wE0S00C000sk1y3Vw0010w7U0081Uy0UT000MDVw001U03sE0Q403007k00QM0600C001ss0ADsQ033lk0M00s647U00k01sC0T00Vk07sQ1s013sEnkw3k66D1V3V01Vw8E704001jk0US0MAC3zW1Xz1stzDzyD" + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击竞技场") + FindText().Click(X, Y, "L") + Sleep sleepTime } } -OnePass() { ;执行一次通行证 - stdTargetX := 3633 - stdTargetY := 405 - UserClick(stdTargetX, stdTargetY, scrRatio) +; 新人竞技场 +RookieArena() { + AddLog("===新人竞技场任务开始===") + AddLog("查找新人竞技场") + Text := "|<新人竞技场>*92$92.wznzlzzszwTXyTzy7UDwTy00D7sz60C007z7zU03lk1tU3U0Tzlzy43s00CQ0wF7zwTz0kw0021kz4Fzy7z0010QDUEDU00zUzk00QD3s00000DsDz00T607303Vk3y3zk07k00tk0U0Fz0Tw01k00QS0804Tk3z00Q1677420F7sEzk071k3s18U4FwC7w01wS0w0W804S3kzkXj7US0FUE371w3sMtlk3VwMUElUzUE60EE09w0ACAMTyA3U4463z67bz7jzr3y3XbtzvXU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击新人竞技场") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + AddLog("检测免费次数") + skip := false + Text免费 := "|<免费>*186$36.wTzy4Ls0zk01k0zz4FVkzk01103k03003k00U1Xk00XXXwQMnXXUQFk03k03k03s03z0zszXy8zslXwMtsXXksts671s1UC0bw3UzsU" + while True { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text免费, , , , , , 3, TrueRatio, TrueRatio)) { ;3代表从下往上找 + AddLog("有免费次数,尝试进入战斗") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + else break + if skip = false { + Text := "|*185$32.z7zzyT0TjzXU1szsksC7y8zXUzWDwM7s7z60S1zlX3UTwMsMbz6D08zVXs27kszUk0SDwC0DXzXs7szzU" + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("快速战斗已开启") + skip := true + } + else { + Text := "|*159$49.z7zk0TU0y0zU0700C07U0300671lzzXzyDsszzlzz7yATzszz7z601w03XzX00y01lzlXzz7zwzslzzXzyDsszzlzz3sQTzszzk0SDzwTzw0T7zyDzzUzXzz7zw" + if (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + AddLog("有笨比没开快速战斗,帮忙开了!") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + } + EnterToBattle + BattleSettlement + Text := "|<左上角的感叹号>*200$22.zwzzw0Dz3wTszwT7ztszznbwzaznyHzzwDzzkzzz3zDwDwzkznz3zDwjwzaTnyQzzntzyTXzXzVsTzU7zznzs" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + AddLog("没有免费次数,尝试返回") + Text := "|<左上角的竞技场>*200$54.zbztzTxzzU07tyTxk1U07tyDxs3wyzkk1xz7wwTUSDkyD003lzTkMTzzztyTss0s0Dtk1xs0k0Dsk1xwmnzDUnnxxalzDVtnxtik0Dtsbw3iyMztw7s7AyNztwDkyQwtvts7nywVw3XVVzwlbw7XrtzxlU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + GoBack + Sleep sleepTime + } + AddLog("已返回竞技场页面") + AddLog("===新人竞技场任务结束===") +} +;特殊竞技场 +SpecialArena() { + AddLog("===特殊竞技场任务开始===") + AddLog("查找特殊竞技场") + Text := "|<特殊竞技场>*93$91.tyDzzDzlzsyDszzws1U07s00wT7wM0kQ0E03w00SA0CA0M60AC0DVkw0077kQ1sy207UkS0031kS0010030010wT0ED000U2DU00kyDU004k0l13w01wM0QM0CTsl00C00y00CC0600000700Q0077000040U7U0C137X00003kk7k071l3k000lXss3s03sw3k20QslwE0z0CwS3k34CSMsEUD36CC0sD6CDUMMF41U4406z07bsQSsy3k2633zW3nwDzwT7y77jtzv3U" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击特殊竞技场") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + AddLog("检测免费次数") + skip := false + Text免费 := "|<免费>*200$35.wTzy8zk3zU0707zsXASDy00EsTw01U03s00337k01DDDstWQQS3nA00y00w01y01z0zwznyNztnbknrnCD3bDUEsT0Q3k/z1szyE" + while True { + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text免费, , , , , , 3, TrueRatio, TrueRatio)) { ;3代表从下往上找 + AddLog("有免费次数,尝试进入战斗") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + else break + if skip = false { + Text := "|*185$32.z7zzyT0TjzXU1szsksC7y8zXUzWDwM7s7z60S1zlX3UTwMsMbz6D08zVXs27kszUk0SDwC0DXzXs7szzU" + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("快速战斗已开启") + skip := true + } + else { + Text := "|*159$49.z7zk0TU0y0zU0700C07U0300671lzzXzyDsszzlzz7yATzszz7z601w03XzX00y01lzlXzz7zwzslzzXzyDsszzlzz3sQTzszzk0SDzwTzw0T7zyDzzUzXzz7zw" + if (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + AddLog("有笨比没开快速战斗,帮忙开了!") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + } + EnterToBattle + BattleSettlement + Text := "|<左上角的感叹号>*200$22.zwzzw0Dz3wTszwT7ztszznbwzaznyHzzwDzzkzzz3zDwDwzkznz3zDwjwzaTnyQzzntzyTXzXzVsTzU7zznzs" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + Confirm + } + } + AddLog("没有免费次数,尝试返回") + Text := "|<左上角的竞技场>*200$54.zbztzTxzzU07tyTxk1U07tyDxs3wyzkk1xz7wwTUSDkyD003lzTkMTzzztyTss0s0Dtk1xs0k0Dsk1xwmnzDUnnxxalzDVtnxtik0Dtsbw3iyMztw7s7AyNztwDkyQwtvts7nywVw3XVVzwlbw7XrtzxlU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + GoBack + Sleep sleepTime + } + AddLog("已返回竞技场页面") + AddLog("===特殊竞技场任务结束===") +} +;冠军竞技场 +ChampionArena() { + AddLog("===冠军竞技场任务开始===") + AddLog("查找冠军竞技场") + Text := "|<应援>*80$30.z7yQ0z3yM500CRg7zw4VDjQ80BjCQ09aSQDBaS00Aaw6TAkwS0CwyQ9DtyQ9DlyNX006F0M0AKQU" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + else { + AddLog("未在应援期间") + AddLog("===冠军竞技场任务结束===") + return + } + Text := "|<冠军竞技场内部的应援>*140$29.zbyTlyDwk200toYxrVd9vr20GbDA0YaSM19AwE2GHkk4X7XU3iTb27wzA1CUyN2E0MY2" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<晋级赛内部的应援>*100$41.0D00kzy0S01Xzzzzy33yrzzwD6NzzzszCnQ001yTzsC71tzzzQC1VzzyMQ31s7Qts7DzyRnUTzzwvb3zDytzw7wTzlps7UzzX3U73xy07067vg0S0ATzTzzkttyzzzXrzzDzz7aSy" + if (ok := FindText(&X := "wait", &Y := 10, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep 3000 + } + Text := "|<选择的图标>*180$22.z03zs03y007k00D000M00V007000y087s3kz0Dbs0zz00zs03z007s0U7060M0Q003s00Tk03zU0TzkDy" + if UserCheckColor([1926], [1020], ["0xF2762B"], scrRatio) { + AddLog("左边支持的人多") + UserClick(1631, 1104, scrRatio) + } + else { + AddLog("右边支持的人多") + UserClick(2097, 1096, 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 "进入通行证失败!" - ExitApp - } - } - stdCkptX := [1733] - stdCkptY := [699] - desiredColor := ["0xF1F5F6"] - stdTargetX := 2130 - stdTargetY := 699 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { ;左不是白则点右 - UserClick(stdTargetX, stdTargetY, scrRatio) + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") Sleep sleepTime } - stdCkptX := [1824] - stdCkptY := [1992] - desiredColor := ["0x7C7C7C"] ;检测灰色的全部领取 - stdTargetX := 1824 - stdTargetY := 1992 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) ;不是灰色就一直点领取 - Sleep sleepTime - } - stdCkptX := [2130] - stdCkptY := [699] - desiredColor := ["0xF1F5F6"] - stdTargetX := 1733 - stdTargetY := 699 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { ;右不是白则点左 - UserClick(stdTargetX, stdTargetY, scrRatio) - Sleep sleepTime - } - stdCkptX := [1824] - stdCkptY := [1992] - desiredColor := ["0x7C7C7C"] ;检测灰色的全部领取 - stdTargetX := 1824 - stdTargetY := 1992 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) ;不是灰色就一直点领取 - Sleep sleepTime - } - stdCkptX := [64] - stdCkptY := [470] - desiredColor := ["0xFAA72C"] - stdTargetX := 2418 - stdTargetY := 185 - while !UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - UserClick(stdTargetX, stdTargetY, scrRatio) ;确认领取+返回直到回到大厅 - Sleep sleepTime - if A_Index > waitTolerance { - MsgBox "退出通行证失败!" - ExitApp - } - } - stdCkptX := [3395] - stdCkptY := [368] - desiredColor := ["0xFBFFFF"] ;检测是否多通行证 - stdTargetX := 3395 - stdTargetY := 368 - if UserCheckColor(stdCkptX, stdCkptY, desiredColor, scrRatio) { - } + AddLog("===冠军竞技场任务结束===") + BackToHall } -;通用塔 +; 企业塔 +CompanyTower() { + EnterToArk + AddLog("===企业塔任务开始===") + Text := "|<无限之塔>*125$79.zzzzzzzzDznlns00Q00Dz3zsU0Q00C007zkzwE0600703Xs01y807z7zYE1s00S32DzXzk80w00C1k7zVzsA0Tzw70s7U00A26Dzy7kk0k006N07zy7wEM4007A03zy7y007w1za05zy7z40Ty0zl0UTw7zXzzy0Ts0MDw7zkU1y4CQ2ADsDzk00y376T67kDzk8QS3U3DU1k3zMQCA3k3bUME007y077s1nsCQw07z03zzztzzzzkDzntk" + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击无限之塔") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + ; 只要有一座塔是0/3就当作任务执行过了 + Text := "|<塔的外部0/3>*121$23.szi7UyM28wn4tty9lbw3XDV76T3CBzWQnzYtbj83C0MCS1ztzzznzzzbzw" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("今日企业塔已打过,返回") + AddLog("===企业塔任务结束===") + BackToHall + return + } + Text每日通关 := "|<每日通关>*124$58.vzzzzzzzzz7zs0Qs1sww0701lkDnXXzwTbX1w0407nyTs1k000DDtz07wTmAw0740Tty01k0QE1U00037tt0600W8wzbY0Tky8XnySH1y1s0701sA7lXs0w07008D3y7lyQk1Vy8" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text每日通关, , , , , , 5, TrueRatio, TrueRatio)) { ;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, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("已进入塔的内部") + Text := "|<极乐>*90$37.lzzzz1sk1w00wM1y00w68z7zw14TXXz1WDllzll1sszsMUs00M4QQ00A06D00663DzXy307sl71a7sslsX3sQQQF0sSCC004M7X0XXw7zrzzzDzU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { ;0代表使用上一次截屏 + AddLog("这座塔是极乐净土之塔") + } + Text := "|<米西>*96$36.nnnU00lnVU00lnXzaTsn7zaTtn7k00zlzk00000l08000l6My0Tl6My0TkC0w0DkS0sH7lzskn3lzsVnUk003nkk00jnxk00U" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + AddLog("这座塔是米西利斯之塔") + } + Text := "|<泰特>*93$37.zXzwT7s01uC0s00Q60DsTw30700C0wTU07000y7zUE0000GDsM00T7wT6MzU027C70001a10tXY0BkMlz07yC8w01z7gS0MTXsDADTlw7zDzxzDU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + AddLog("这座塔是泰特拉之塔") + } + Text := "|<朝圣>*99$37.sw1k01U00w00k0CT7kz7bDkky0E7w0z683w0DU4FU00E2QsTkNl0TyTw00DU0y0U7k0Dklns0701tztzU0wzsTyAMM0076QC002" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + AddLog("这座塔是朝圣者/超标准之塔") + } + Text := "|*83$39.0kCD0s041ls705kQ74scz7Usz77sw77ssz7Usz70sw76M877YsX10ssX4MD774MX7sssX4Mz770MX7sss34Ms7748300sll0M4TbSSL1U" + while (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + stdTargetX := 1850 + stdTargetY := 984 + AddLog("点击最新关卡") + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + EnterToBattle + } + BattleSettlement + sleep 5000 + RefuseSale + } + if !(A_Index = count) { + AddLog("点击下一个塔") + UserClick(2239, 1868, scrRatio) + Sleep sleepTime + } + } + AddLog("所有塔都打过了") + } + AddLog("===企业塔任务结束===") + BackToHall +} +; 通用塔 UniversalTower() { -} -; 通用函数,用于切换 g_settings Map 中的设置值 -ToggleSetting(settingKey, guiCtrl, *) { - global g_settings - ; 切换值 (0 变 1, 1 变 0) - g_settings[settingKey] := 1 - g_settings[settingKey] - ; 可选: 如果需要,可以在这里添加日志记录 - ; 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 -} -ChangeOnSleepTime(GUICtrl, *) { - global sleepTime - switch GUICtrl.Value { - case 1: sleepTime := 750 - case 2: sleepTime := 1000 - case 3: sleepTime := 1250 - case 4: sleepTime := 1500 - case 5: sleepTime := 1750 - case 6: sleepTime := 2000 - default: sleepTime := 1500 + EnterToArk + AddLog("===通用塔任务开始===") + Text := "|<无限之塔>*125$79.zzzzzzzzDznlns00Q00Dz3zsU0Q00C007zkzwE0600703Xs01y807z7zYE1s00S32DzXzk80w00C1k7zVzsA0Tzw70s7U00A26Dzy7kk0k006N07zy7wEM4007A03zy7y007w1za05zy7z40Ty0zl0UTw7zXzzy0Ts0MDw7zkU1y4CQ2ADsDzk00y376T67kDzk8QS3U3DU1k3zMQCA3k3bUME007y077s1nsCQw07z03zzztzzzzkDzntk" + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击无限之塔") + FindText().Click(X, Y, "L") + Sleep sleepTime } -} -ChangeOnColorTolerance(GUICtrl, *) { - global colorTolerance - switch GUICtrl.Value { - case 1: colorTolerance := 15 - case 2: colorTolerance := 35 - default: colorTolerance := 15 + Text := "|<塔内的无限之塔>*194$63.000000000E3zwTzs1U37QTznzz0C0PzsD0PMszz3Dy0k3Pz7zwyzU60TTs0D7nszzvvb01kMzbzzPTs0Q3zT1s3Dy070PzkD0Nvs1k3003s3zD0Q0Tzkv3TNkD07zyCQv3i7k0slrXzMTxzzk7ysDn3nATw0zo" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击塔内的无限之塔") + FindText().Click(X, Y, "L") + Sleep sleepTime } -} -ClickOnHelp(*) { - msgbox " - ( - ############################################# - 使用说明 - 对大多数老玩家来说Doro设置保持默认就好。 - 万一Doro失控,请按Ctrl + 1组合键结束进程。 - 万一Doro失控,请按Ctrl + 1组合键结束进程。 - 万一Doro失控,请按Ctrl + 1组合键结束进程。 - ############################################# - 要求: - - 【设定-画质-全屏幕模式 + 16:9的显示器比例】(推荐) 或 【16:9的窗口模式(窗口尽量拉大,否则像素识别可能出现误差)】 - - 设定-画质-开启光晕效果 - - 设定-画质-开启颜色分级 - - 游戏语言设置为简体中文 - - 以**管理员身份**运行DoroHelper - - 不要开启windows HDR显示 - ############################################# - 步骤: - -打开NIKKE启动器。点击启动。等右下角腾讯ACE反作弊系统扫完,NIKKE主程序中央SHIFT UP logo出现之后,再切出来点击“DORO!”按钮。如果你看到鼠标开始在左下角连点,那就代表启动成功了。然后就可以悠闲地去泡一杯咖啡,或者刷一会儿手机,等待Doro完成工作了。 - -也可以在游戏处在大厅界面时(有看板娘的页面)切出来点击“DORO!”按钮启动程序。 - -游戏需要更新的时候请更新完再使用Doro。 - ############################################# - 其他: - - -检查是否发布了新版本。 - -如果出现死循环,提高点击间隔可以解决80%的问题。 - -如果你的电脑配置较好的话,或许可以尝试降低点击间隔。 - - )" -} -ClickOnDoro(*) { - WriteSettings() - global g_settings, g_numeric_settings ; - title := "勝利女神:妮姬" - try { - WinGetClientPos , , &userScreenW, &userScreenH, "勝利女神:妮姬" - } catch as err { - title := "ahk_exe nikke.exe" + Text := "|*83$39.0kCD0s041ls705kQ74scz7Usz77sw77ssz7Usz70sw76M877YsX10ssX4MD774MX7sssX4Mz770MX7sss34Ms7748300sll0M4TbSSL1U" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("已进入塔的内部") + stdTargetX := 1926 + stdTargetY := 908 + Sleep sleepTime + AddLog("点击最新关卡") + UserClick(stdTargetX, stdTargetY, scrRatio) + Sleep sleepTime + EnterToBattle + BattleSettlement + sleep 3000 + RefuseSale } - numNikke := WinGetCount(title) - if numNikke = 0 { - MsgBox "未检测到NIKKE主程序" - ExitApp + AddLog("===通用塔任务结束===") + BackToHall +} +; 异常拦截 +Interception() { + BackToHall + EnterToArk + AddLog("===异常拦截任务开始===") + Text := "|<拦截战>*200$57.nnnzDDzbxyTSz0NbwzBnvbyDCzbxkD8ztszw7j0U1k00TXxyQ0C003wz0nzzxrbzbkSTzzYxzwzjlzzs1az3xo7zy4Qbk7Y3k3k3UywwCTzz0QDrrVnzzsXXyyySTzz0QTrrXnzztbXSQsSM0D0E3k20b01s0MSQH4" + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime } - loop numNikke { - nikkeID := WinGetIDLast(title) - WinGetClientPos , , &userScreenW, &userScreenH, nikkeID - global scrRatio - scrRatio := userScreenW / stdScreenW - ;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"] - SimulationRoom() - if g_settings["Arena"] { - Arena() ;收菜 - if g_settings["RookieArena"] ;新人竞技场 - RookieArena(g_numeric_settings["NumOfRookieBattle"]) - if g_settings["SpecialArena"] ;新人竞技场 - SpecialArena(g_numeric_settings["NumOfSpecialBattle"]) - else - BackToHall() + Text := "|<异常个体拦截战>*200$94.07nRznzDTrhwBjjdzS03y7xszSrtrySk1vzjnDa0sEC03svDzc2wyCSDrzw8zj0zjbjbStszTzrryws1z0zxzb1wzy1/VvzzzDzrzRPX0tCS3WSz07zTxhjTzUtvy00wWDxzk2RzzHjjxjjrQzrzSDrzxAqvZyzQbzTxxzM1k0s48" + while !(ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + AddLog("已进入异常拦截界面") + Text := "|<0/3>*90$31.zzwTzw7yDUw0z70A0T7V2D7XnkDXlzs7lszkXsszkFwQTs8yCDzUT7Dzl737lsU3Xw0M3ly0S3lzkTzwzzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + AddLog("异常拦截次数已耗尽") + AddLog("===异常拦截任务结束===") + return + } + loop 5 { + switch g_numeric_settings["InterceptionBoss"] { + case 1: + Text := "|<克>*200$43.zzz0zzzzzzUTzzzzzkDzzzzzs3zzy00000030000001U000000k000000M000000Tzzs3zzzzzw3zzzzzy1zzzzzz0TzzzU0000Dzk00007zs00003zw00001zy00000zz0zzzUTzUTzzkDzkDzzs7zs7zzw3zw00001zy00000zz00000TzU0000Dzk00007zs00003zzs3w3zzzw1y1zzzy0z0zzzz0TUTzzz0TkDxzzUDs7yDzU7w3y1zU7y1z0z03z0zUQ03zUDUE03zk00803zs00603zw003U7zz003kDzzk03wzzzzzzs" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("已选择BOSS克拉肯") + break + } + case 2: + Text := "|<镜>*200$44.zTzzw7zzUzzy0zzsDz0003w1zk000z00Q000DU070003k01z3s7w00TUz1y007sDkT0Tzy3s7kDzz000w7zw0001Uzz0000M00k000700A0001s03zzzzy00zzzzzk0D0007z0zk001zkDw000Tw3z1zw7z0zkTz1zU7w3zUS0070007U01k001s00Q3zUS0071zw7y0TkDz1zkDw000Tw3z0007z0zk001zkCzUQ7zw37s71zz01y3kTzk0TUw7zs07kD1zy03s3kQz01w1w73k1w0T0Uw1y0Dk0DUzk7w07wzw7zU3zTzbzzXs" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("已选择BOSS镜像容器") + break + } + case 3: + Text := "|<茵>*200$41.zs7zUDzzkDz0TzzUDy0zs0000000000000000000000000000000007zUTy0zzz0zy1zzzzzzzzzzzzzzzk000007U00000D000000S000000w000001s7zzzw3kDy3zs7UTw3zkD0zs7zUS1U0030w300061s6000A3kA000M7UM001kD0zs1zUS1zU1z0w3z01y1s7w01w3kDU01s7UQ0M0kD0k1w1US1U7w30w3UTwC1s7Xzww3kDTzvs7U00000D000000S000000w000001s000003k7zzzk7UzzzzkS" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("已选择BOSS茵迪维利亚") + break + } + case 4: + Text := "|<过>*200$43.zzzzzkDzzzzzs7z7zzzw3z1zzzy1z0Tzzz0zU7zzzUTs1zzzkDy0zzzk3zUC00007sD00003wTU0001zTk0000zzs0000Tzzzzk7zzzzzw3zzzzzy1zzzwTz0z03s7zUTU1w1zkDk0z0Ts7s0TkDw3w0Ds3y1zs7y0z0zy3zUTUTz1zkzkDzUzwzs7zkTzzw3zsDzzy1zw7zzy0zy3zy00zz1zz00TzUzzk0DzUTzs0DzU7zw0Tz00zzzzz007zzzz0007zw000000008D0000047s000077z00003rzw0001vzzzzzzk" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("已选择BOSS过激派") + break + } + case 5: + Text := "|<死>*200$42.U0000010000000000000000000000000000U000001zUDz0zzzUTz0zzzUTz0zzz0Tz0zzz0Tz0zzz0070zzy0030zDy0030y7w0030w3s0030s1s7s3001k7s7003UDs700D0Ts700T0TsD01z0nkD07zVUUD0DzvU0T0zzz00T0zzzU0T0zzzk0z0zzzs1z0zzzw1z0zzzs3z0zzzk3z0zXzU7z0zUz0Dz0zUy0Tz0z0s0Tz060U0zzU0101zzU01U7zzU01kDzzk03szzzy0TU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("已选择BOSS死神") + break + } + default: + MsgBox "BOSS选择错误!" + Pause } - if g_settings["LoveTalking"] - LoveTalking(g_numeric_settings["NumOfLoveTalking"]) - if g_settings["FailTower"] - FailTower() - if g_settings["CompanyTower"] - CompanyTower() - 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() + AddLog("非对应BOSS,尝试切换") + UserClick(2287, 891, scrRatio) + Sleep sleepTime } - if isBoughtTrash == 0 - MsgBox "协同作战商店似乎已经刷新了,快去看看吧" - MsgBox "Doro完成任务!" CompanyTowerInfo() - if g_settings["SelfClosing"] - ExitApp - Pause -} -SleepTimeToLabel(sleepTime) { - return String(sleepTime / 250 - 2) -} -ColorToleranceToLabel(colorTolerance) { - switch colorTolerance { - case 15: return "1" - case 35: return "2" + Text := "|<挑战>*200$53.tzzzzzzzznyATznzbzbyNzzbzCTDwnzzDzASStbDyTyQsMnCTw1wz086Mzs1ty0sAHzlznzbkM7zbz07DkkTzDk0yTtbzyTkTwznDzwzwzsDaDzsztnUSQ7w07nY3ss7s0DaMD1l7nyTUyQ3b7bwz1wtbDDDty7tzCTyTnwTnwQzwzbszbttttzDVrDXnnk0S3iSDXbU0s0MszUD7k3UVnz0yTnDXTzzzzzzzi" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<异常>*130$40.U03z77400DwQMEAEz0003zXw00000Dkzz000z7zw3zvwE0GDzln01c007wz7U00zk0Tk0Tz01yDnzzlzszDy000001s000007U00000SD7W7wzswS0TnzXlU3zDyD62" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + switch g_numeric_settings["InterceptionBoss"] { + case 1: + Text := "|<01>*200$13.Us0A3bVnktsQwCS7D3bVnktsQwCS7D3bVnktsQwCS3D87Y" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + } + case 2: + Text := "|<02>*200$16.Uw41U3aQCNktb3bwCTktz3bwCTUtkHa3CNwtbnaTCNwtbnaTCNwFbkC0U" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + } + case 3: + Text := "|<03>*200$16.Uw01U3aQCNktb3aQCTktz3bwCTUtsHbkCTktz3bwCTktb3aQCNkNX870U" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + } + case 4: + Text := "|<04>*200$18.UTXUD36D37D37CH7CH7CH7Cn7Cn7An7An7Bn7Bn79l7807Dl7Dn7Dn7Dn6DnUTnU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + } + case 5: + Text := "|<05>*200$17.kQ10M0QnstblnDXaT7AyCNwQm8tU1ny3bw7DsCTkQzUtz1nC3aQbAt4MW1sA" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + } default: - return "1" + MsgBox "BOSS选择错误!" + Pause } -} -IsCheckedToString(foo) { - if foo - return "Checked" - 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"]) -} -WriteSettings(*) { - global g_settings, g_numeric_settings, sleepTime, colorTolerance - ; 从 g_settings Map 写入开关设置 - for key, value in g_settings { - IniWrite(value, "settings.ini", "Toggles", key) - } - for key, value in g_numeric_settings { - IniWrite(value, "settings.ini", "NumericSettings", key) - } - ; 写入其他独立设置 - IniWrite(sleepTime, "settings.ini", "Other", "sleepTime") - IniWrite(colorTolerance, "settings.ini", "Other", "colorTolerance") -} -LoadSettings() { - global g_settings, g_numeric_settings, sleepTime, colorTolerance - default_settings := g_settings.Clone() - ; 从 Map 加载开关设置 - for key, defaultValue in default_settings { - readValue := IniRead("settings.ini", "Toggles", key, defaultValue) - g_settings[key] := readValue - } - default_numeric_settings := g_numeric_settings.Clone() ; 保留一份默认数值设置 - for key, defaultValue in default_numeric_settings { - readValue := IniRead("settings.ini", "NumericSettings", key, defaultValue) - ; 确保读取的值是数字,如果不是则使用默认值 - if IsNumber(readValue) { - g_numeric_settings[key] := Integer(readValue) ; 转换为整数 - } else { - g_numeric_settings[key] := defaultValue + AddLog("已切换到对应队伍") + Sleep sleepTime + Text0 := "|<0/3>*60$37.k3zr01k0zlU0EyDtzz1zbwzzkzlwTzsTsyTzsDwTDs07yD7w03z7bzz1zXnzzkzntzzs7lszzsU1wz00M1yTU0s" + Text快速战斗 := "|<快速战斗>*191$95.wzXzzznzyTtzzzszlz7zbz3zwTlDzzlzXyDz700DszWDwDXz7wDy400Dlz4TsD7y201yA00zUCAzs6Dk403yTkzz0QTzwQTU717zk03y0slzzsz0D6DzU07wT03tzly2SATz66Dsw07UzXw7wMw2AQTlw7z0z7kDsks400zXzATUyDwM00y801s0SNzlwTsk01wS0Tk0w3zzszly1zsw0zXls7zzU3Xw3zlk0TDXkTz0077s7zW48ST7Vy000SDU7z0MswyD3s00DwT67y9lztwS4k7wTswS7k7nzk0k9zzszlUw70003U003zzlzW3w6C00700A7zzXz6DwQz00ST4wTzz7zDzzzzzzzzzxzzyTk" + Text进入战斗 := "|<进入战斗>*200$115.zzzzzzzzzzzzyzzzzsztzlszztzzzyDyCzzzwTsTswTzsTzzz7z6DznyDy7wSDzw7zzzXzX7zkT7zVyD7zz1zzzlzllzs7Xzsk00TzkTzzs0wszz1lzys00DzwDzzw0SDzzkszzw007zz3zzy0D7zzywTzzsMTzzUzzz7z03zzyDzzwSDzzkTzzXw01yDz7zzyD7zzk7zzly07y1zXz0z7Xzzs3zzszURzUDlz0T10Dzw0zzwDyCTw3szkA003zwATzU0T6Dz3wTz6001zy67zk07X7zvyDzXU01zy7Vzs03l7zzz3zlwD7zz3kzwTVw3zzzU1syDXzz3wDyDsy3zzs00wS7lzzVz3z7wT1zs000yC7szzVzUzXyDVz000Dz73wTzUzsDlz7krU0CDz1nyDzUzy3sz3kNkDz7z0Tzzz0zz0w01kAzzzXz01zyD0zzkC00U0Tzzlz3U0070zzwD000kDzzsznw003kzzz7Xw8sDzzwTxzk03xzzzvlzDy7zzyDw" + while True { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text0, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("异常拦截次数已耗尽") + break + } + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text快速战斗, 0, 0, , , , , TrueRatio, TrueRatio)) { + AddLog("已激活快速战斗") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + else if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text进入战斗, 0, 0, , , , , TrueRatio, TrueRatio)) { + AddLog("未激活快速战斗,尝试普通战斗") + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|*100$35.03k7k60606040A0A000M0M00zksks1zVzVk070D3y0C067w0S0ADsTzk8Q0zlsEs1XVUVU0301000606040C0C0A" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + UserClick(2123, 1371, scrRatio) + Sleep 500 + if (A_Index > 30) { + break + } + } + Sleep sleepTime + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + AddLog("跳过动画") + } + BattleSettlement + } + Text := "|<异常个体拦截战>*200$94.07nRznzDTrhwBjjdzS03y7xszSrtrySk1vzjnDa0sEC03svDzc2wyCSDrzw8zj0zjbjbStszTzrryws1z0zxzb1wzy1/VvzzzDzrzRPX0tCS3WSz07zTxhjTzUtvy00wWDxzk2RzzHjjxjjrQzrzSDrzxAqvZyzQbzTxxzM1k0s48" + while !(ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm } } - ; 加载其他独立设置 (带默认值) - sleepTime := IniRead("settings.ini", "Other", "sleepTime", 1500) - colorTolerance := IniRead("settings.ini", "Other", "colorTolerance", 15) + AddLog("===异常拦截任务结束===") + BackToHall } -SaveSettings(*) { - WriteSettings() - MsgBox "设置已保存!" -} -; 全局设置 Map 对象 -global g_settings := Map( - "OutpostDefence", 1, ; 前哨基地防御 - "CashShop", 1, ; 付费商店 - "FreeShop", 1, ; 免费商店 - "Expedition", 1, ; 派遣 (之前是 isCheckedExpedtion) - "FriendPoint", 1, ; 好友点数 - "Mail", 1, ; 邮箱 - "Mission", 1, ; 任务 - "Pass", 1, ; 通行证 - "SimulationRoom", 1, ; 模拟室 - "Arena", 1, ; 竞技场收菜 - "RookieArena", 1, ; 新人竞技场 - "SpecialArena", 1, ; 特殊竞技场 - "LoveTalking", 1, ; 咨询 - "CompanyWeapon", 0, ; 企业武器熔炉 (商店) - "Interception", 0, ; 拦截战 - "CompanyTower", 1, ; 企业塔 - "UniversalTower", 1, ; 通用塔 - "FailTower", 0, ; 每日爬塔任务 - "LongTalk", 1, ; 详细咨询 (若图鉴未满) - "AutoCheckUpdate", 0, ; 自动检查更新 - "SelfClosing", 0, ; 完成后自动关闭程序 - "BookFire", 0, ; 手册:燃烧 - "BookWater", 0, ; 手册:水冷 - "BookWind", 0, ; 手册:风压 - "BookElec", 0, ; 手册:电击 - "BookIron", 0, ; 手册:铁甲 - ;"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" - ExitApp -} -;读取设置 -SetWorkingDir A_ScriptDir -try { - LoadSettings() -} -catch as err { - WriteSettings() -} -if g_settings["AutoCheckUpdate"] { - CheckForUpdateHandler(false) ; 调用核心函数,标记为非手动检查 -} -/** - * 添加一个与 g_settings Map 关联的复选框到指定的 GUI 对象. - * @param guiObj Gui - 要添加控件的 GUI 对象. - * @param settingKey String - 在 g_settings Map 中对应的键名. - * @param displayText String - 复选框旁边显示的文本标签. - * @param options String - (可选) AutoHotkey GUI 布局选项字符串 (例如 "R1.2 xs+15"). - */ -AddCheckboxSetting(guiObj, settingKey, displayText, options := "") { - global g_settings, ToggleSetting ; 确保能访问全局 Map 和处理函数 - ; 检查 settingKey 是否存在于 g_settings 中 - if !g_settings.Has(settingKey) { - MsgBox("错误: Setting key '" settingKey "' 在 g_settings 中未定义!", "添加控件错误", "IconX") - return ; 或者抛出错误 +; 前哨基地收菜 +OutpostDefence() { + BackToHall + AddLog("===前哨基地收菜任务开始===") + Text := "|<前哨基地的图标>*130$37.7k00SAEw00SAS7U0SAP3s0SAQsT0SAQC7kSAQXUwSAQMQDyAQC73yAQ7VsTAQ1wC7wS0T3lyQ07ksDy01wT3y00DlkzU03sQ7s00y31y00TUsTU0RsC3w0QT3kz0QDkw7kQAw71wQADVsSQADsS3QACS7Uk" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击进入前哨基地") + FindText().Click(X, Y, "L") + Sleep sleepTime } - ; 构建选项字符串,确保 Checked/空字符串 在选项之后,文本之前 - initialState := IsCheckedToString(g_settings[settingKey]) - fullOptions := options (options ? " " : "") initialState ; 如果有 options,加空格分隔 - ; 添加复选框控件,并将 displayText 作为第三个参数 - cbCtrl := guiObj.Add("Checkbox", fullOptions, displayText) - ; 绑定 Click 事件,使用胖箭头函数捕获当前的 settingKey - cbCtrl.OnEvent("Click", (guiCtrl, eventInfo) => ToggleSetting(settingKey, guiCtrl, eventInfo)) - ; 返回创建的控件对象 (可选,如果需要进一步操作) - return cbCtrl + else { + AddLog("未找到前哨基地!返回") + return + } + Text := "|<%>*74$24.U7y703y703w713wD33wD33sD33sT33sT33kT33kz33Uz33Vz33Vz033z033zU73zkC3zzy7zzw7zzwDzzwDzzsTzzsTzzsTzzks7zkk1zUU1zVU0zVUkz3Vkz3Vkz3Vky7Vky7Vky7VkwDVkwDVksTU0sTU0szk1szs3U" + if (ok := FindText(&X := "wait", &Y := 10, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击左下角资源") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<免费一举歼灭的红点>*194$67.000000000C0000000000zs000000000sD000000001k1k00000001kwQ00000000lz600000000lzlU0000000tzwk0000000Rzy80000000QzzbzzzzzzzyTzm00000003Dzt00000000nztU0000000Nzwk00000004TwM000000017wM00000000k0M00000000A0M000000001zs0000000007s0000000003k0000000001U0000000000k0000000000M0000000000A0E" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|<歼灭>*182$46.U3s7U000000S0008003s000kz0zzsTz3zXzzlzw0yDzz7zk3szwsSD0DXzlVsssU0y67XX001ssQQ40073Ulk1U0wS3D07szvk7zkzXzz0TzXyDzsEzwDszzVVzVzXzsC3wDyDz1w7UzszUDs27zXw1zk8zyDsTzkzztzrzzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击进行歼灭") + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|<获得奖励的图标>*191$34.zzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzk00TzzU01zzz00Dzzw01zzzs07zzzk0zzzz07zwTy0Tw1zw3zk7zkTz0TzVzw1zzDzk7zxzz0Tzzzw1zzzzk7zzzz0Tzzzw1zzzzk3zzzz000000000001U00007U0001s" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + Sleep sleepTime + } + } + } + else AddLog("没有免费一举歼灭") + AddLog("尝试常规收菜") + Text := "|<获得奖励的图标>*191$34.zzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzzsTzzzzVzzzzy7zzzk00TzzU01zzz00Dzzw01zzzs07zzzk0zzzz07zwTy0Tw1zw3zk7zkTz0TzVzw1zzDzk7zxzz0Tzzzw1zzzzk7zzzz0Tzzzw1zzzzk3zzzz000000000001U00007U0001s" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击收菜") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + AddLog("尝试返回前哨基地主页面") + Text := "|<%>*74$24.U7y703y703w713wD33wD33sD33sT33sT33kT33kz33Uz33Vz33Vz033z033zU73zkC3zzy7zzw7zzwDzzwDzzsTzzsTzzsTzzks7zkk1zUU1zVU0zVUkz3Vkz3Vkz3Vky7Vky7Vky7VkwDVkwDVksTU0sTU0szk1szs3U" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + Sleep sleepTime + } + AddLog("已返回前哨基地主页面") + AddLog("===前哨基地收菜任务结束===") + if g_settings["Expedition"] ;派遣 + Expedition() + BackToHall() +} +; 派遣 +Expedition() { + AddLog("===派遣委托任务开始===") + AddLog("查找派遣公告栏") + Text := "|<派遣公告栏的图标>*145$58.zzzzsTzzzzzzzy0zzzzzzzzU0zzzzzzzw00zzzzzzz000zzzzzzk1k1zzzzzw0Dk1zzzzzU3zU1zzzzs0yDU1zzzy0DUDU3zzzU1wQDU3zzw0T3wTU3zz07kzsT03zk1yDzsT07w0DVzzsT07U3sTzzsz040y7zzzsy00Dlzzzzky01wTzxzzky0D3zzXzzls0szzw7zzVU3bzzUDzza0CTzw0TzyM0tzzs1zztU3bzzkDzza0CTzzVzzyM0tyzzDzjtU3btzzzyza0CTbzzznyM0tyDzzzDtU3bszzzsza0CTVzzzXyM0ty7zDwDtU3bsDkTkza0CTUy0y3yM0ty1k0kDtU3bs6010za0CTU0003yM0ty0000DtU3bs0000za0CTU0003yM0ty0000DtU3by0001za0CTw000TyM0tzw007ztU3Vzw01zy60DXzw0DzVs0T3zs3zsT00T3zszz7k00T7zzzky080z7zzwDU3s0y7zz3s0Ts0y7zsz07zk0y7y7k1zzk1yDVw0Tzzk1w8T03zzzk1w7s0zzzzU1wy0DzzzzU3zU3zzzzzU3s0TzzzzzU307zzzzzz001zzzzzzz00Tzzzzzzz03zzzzzzzz0zzzzzzzzyDzzzzU" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击派遣公告栏") + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|<全部领取的符号>*190$28.zz3zzzwDzzzkzzzz3zzzwDzzzkzzzz3zzzwDzzzkzzzU07zy00zzw03zzs0TzzU3zzz0Dz7y1zUTs7y1zkzs7zbzUTyzy1zzzs7zzzUTzzy1zzzs7zzzU000000000U0006" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击全部领取") + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|<左上角的派遣>*149$68.000040001w01k00TU20TzzUS03zw1sDzzsDszzzUz3zzy3zTzzsDsyTDUTbzzk1zDzzs1tzy00Dnzzy0AT0101szzzU07k7s0Q07k001wzz00Dzzzm0TDzs03zzzxs7nzy00zzzyzVwzs001zzwDwTDS0TwTzz1z7nrk7z7zzk7VwxxVzlw1w0sTDDwTwTzz007nnzXz7zzk01wwzs7lzzw08SDDw1wT00077Xny0T7zzw1tswT07lzzz0yyD7k1wTzzkDjXlw0T7k3w7nswTU7lzzz1wyDDs3wTzzkyD7yz1zrzzsTblzrszzU01rlwTxyTzzzzxwyDyD7nzzzzSDVy3kwDzzzVXsQ0M60zzzs0A2000U0zzwU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + UserClick(1595, 1806, scrRatio) + Sleep 500 + } + } + Text := "|<全部派遣的符号>*193$35.00Ty0007zz000zzzU03zzzU0DzzzU0zzzzU3zzzzUDzzzzUTzzzzVzbwzz3y7kzz7w3UzyTw3Uzwzw3Uztzw3Uzvzw3Uzzzy3Uzzzs71zTzUQ7yzy1kTxzs71znzUw7zXy3UTz7wDVzwDwzbzsDzzzzUTzzzz0Tzzzw0Tzzzk0Tzzz00Tzzw00Dzzk007zy0001zU08" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<派遣的符号>*191$33.zzUDzzzU0Dzzk00Tzs000zy0003zU000Ds0000y00003k0000Q0k601UD1s081wTU007ly000T7s001wTU007ky000T3s003wT000z7k00Dlw003sT000y7k00DXw041sT01U61k0C00003k0000T00007w0001zk000Tz0007zw001zzs00zzzk0TzU" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击全部派遣") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + else AddLog("派遣公告栏未找到!") + AddLog("===派遣委托任务结束===") + BackToHall +} +; 好感度咨询 +LoveTalking() { + BackToHall + UserClick(1497, 1994, scrRatio) ;点击妮姬图标位置(识图很困难) + Text := "|<咨询>*109$44.rlzzjkzsQ7blwDy200wC3zk00DVU0DkU3sk03wMEzs00yC6Tq7wA70zUU101U7kC0E00EC3U41kC3ss13yDkyC0Fs00TXU4S007ssV7U01y20FsTkTU04SDy7s017Vz1y2DVs00T1z0S007lzkDU01yzw3U" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<左上角的咨询>*111$37.nXztszkE0sQTw00CA07U0Da03sl7y01wM3U7sUMDUU4001kM28kMCAF7sSD60XU0DX0Fk07l20s03s00QTlw00C7ky0SD00T7s7U0Dby3lz7zz7U" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + if g_settings["Appreciation"] { + Appreciation + } + UserClick(313, 756, scrRatio) ;点击妮姬头像位置(识图很困难) + Sleep sleepTime + } + AddLog("===妮姬咨询任务开始===") + Text咨询 := "|<咨询的咨>*178$30.zzXzzlz3zzUT3zzUC000sC000yA001zw63VzsC7VzsS7Xzsy3XzXw3rw3s1zU3k0z0DUED0y0s13s1w0zs7z1zwTzlzwTzzw0007w0007w0007w7zw7wDzw7wDzw7wDzw7w7zw7w0007w0007w0007w7zw7yDzzzU" + Text快速咨询 := "|<快速咨询>*195$91.szbzzzDzzXzzTXzwTnzXz3zVlzz7lzyDtzsk03kM07lszz701w801yM03sM060U0z7wTzsMlyQ01000Tz00TwMNzwDlU7bDzU0DwQAzwDwk3nbzlX7sQ3y206MDtnkNlXUQ0z1k387sMsA01ksA7sslbX00D600tsD1wQMnlU07ns7zyTsyC0Nsy1zts1zk01z708wTUzws0Ds00zXX4SDUTyEF3w00TlE2D7l7z0NlyDyDs017XlVz2wzz7z7w0TXlksT0TzzXzXy7TlsUy30007k01y7y1wEzXbU03s00zbz0yBztzz07wTwTzzkw" + Text20 := "|<20/>*240$24.3000DkM3Tly3Tvz71vz71vb73zbD3rbC7rbCTXbCzvzQzvzQTtyQ00Qs000s000k000kU" + Text10 := "|<0/10>*178$38.Dw1g3z7zUvVzvkwCQwDs773i1y1lkvUTUQQCs7s773i1y1nUvUTUQsCs7wDC3j3rzb0tzszlkCDwU" + loop 10 { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.05 * PicTolerance, 0.1 * PicTolerance, Text20, , , , , , , TrueRatio, TrueRatio)) { + AddLog("图鉴已满") + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.05 * PicTolerance, 0.05 * PicTolerance, Text快速咨询, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("图鉴已满,尝试快速咨询") + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + AddLog("已咨询" A_Index "次") + Sleep sleepTime + } + } + else AddLog("该妮姬已咨询") + } + else { + AddLog("图鉴未满") + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text咨询, 0, 0, , , , , TrueRatio, TrueRatio)) { + AddLog("尝试普通咨询") + FindText().Click(X, Y, "L") + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + AddLog("已咨询" A_Index "次") + } + Sleep sleepTime + Text := "|<左上角的咨询>*200$35.zbzzvz60DbXzw0Db3zn6zw0DiRzlyTwTznyVkTXUQDCTbavsyDjBrvyzS3DXvywqM07wtglzDsENbzTlbn7wz7za01yTsSTnzztk" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + UserClick(1894, 1440, scrRatio) ;点击1号位默认位置 + Sleep 200 + UserClick(1903, 1615, scrRatio) ;点击2号位默认位置 + Sleep 200 + Send "{]}" ;尝试跳过 + Sleep 200 + } + Sleep sleepTime + } + else { + AddLog("该妮姬已咨询") + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text10, 0, 0, , , , , TrueRatio, TrueRatio)) { + AddLog("咨询次数已耗尽,跳过任务") + break + } + } + } + Text := "|<左上角的咨询>*200$35.zbzzvz60DbXzw0Db3zn6zw0DiRzlyTwTznyVkTXUQDCTbavsyDjBrvyzS3DXvywqM07wtglzDsENbzTlbn7wz7za01yTsSTnzztk" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + Text := "|<向右的符号>*126$29.03zzy03zzy07zzy07zzy07zzw0Dzzw0Dzzw0Dzzs0Tzzs0Tzzs0Tzzk0zzzk0zzzk0zzzU1zzzU1zzzU1zzz03zzz03zzz03zzy03zzy07zzy07zzw07zzw0Dzzw0Dzzs0Dzzs0Tzzs0TzzU1zzz03zzw0Dzzs0zzzU1zzy07zzw0Tzzk0zzz03zzy07zzs0TzzU1zzz03zzw0Dzzk0zzzU1zzy07zzs0Tzzk0zzz03zzw0Dzzs0TzzU1zzy07zzw0Dzzk0zzz03zzy07zzs0Tzzs" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + AddLog("下一个妮姬") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + AddLog("===妮姬咨询任务结束===") + BackToHall +} +; 花絮鉴赏 +Appreciation() { + AddLog("===花絮鉴赏任务开始===") + Text := "|<花絮鉴赏会的N>*184$44.000000000000000000Dy00000zzz0000k00M000M00300087xU8004DzzV002Dzzy8017zzzl00lzzzwE08zzzzU02DzzzsU1bxzsy80NzDyDm0CTlzXwk7bw7szDztz0yDnzyTk7XwzzbwsMzDztzD2DnzyTns3wzzbwz0zDztzDwDnzyTnzXwzzbwzwy/zxzDzzWzzDzzzsjzlzzzwPzyTzzz4zzXzzzWDzwDzzV3zzVzzUUzzy000EDzzw00M3zzzzzw0zzzzzs0Dzzzzk02" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, 0, 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Text := "|*191$67.DztzwC7zU7sDzwzzb7zsDzDzyTznbzyDzr00C0tnU77VvU070Qtk070Tzy3zyQzy3U7zz1zyCDzXU3zzUzy73ztk1y00Q03U0SQ0z00C01k07C0TU0700tk3bUTk03U0Qw3lsSzztk0CDzkTyDzws077zs7y3zyQ03Uzk0w4" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + AddLog("播放第一个片段") + FindText().Click(X, Y, "L") + } + Text领取 := "|<领取>*200$40.wzzzzzzVU1U1zy706000kD3wEU24QTl608E070Qs0U0Q1n4lkFl74P7976QFUAYQ1s60GFk7UzX970S3yA4QMwDtkFl1ls716063Uz1s0E7Xs3V60D767yMsyswTtbrzrzzbzs" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text领取, , , , , , , TrueRatio, TrueRatio)) { + Text播放 := "|<播放>*200$52.kzzXznyDz3U07y7sTwC00TsTVzks03zly7z3l27U0MTk328y01000A01s04000003kTk0AA00DVy33ks00y7sAD3s0Ds00kwC00TU037k0MUS004S03X3sEU1k000TV3k70s01y4D0w3U07skw3wC4ATX3sTks01wADUz3U07kkw1wC00T7303ksElsQ8043U07000k0S00SA67VVs01xktzi" + AddLog("播放下一个片段") + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text播放, , , , , , , TrueRatio, TrueRatio)) { + Send "{]}" ;尝试跳过 + } + else FindText().Click(X, Y, "L") + } + else FindText().Click(X, Y, "L") + AddLog("领取奖励") + GoBack + Sleep sleepTime + GoBack + Sleep sleepTime + } + else AddLog("花絮鉴赏任务已完成") + AddLog("===花絮鉴赏任务结束===") +} +; 好友点数收取 +FriendPoint() { + BackToHall + AddLog("===好友点数任务开始===") + Text := "|<好友>*200$33.rzzyzyy0zrzbzDU007tzbzayTwzxrrzbziyTw0NY0TXnByTsSQDrzPrlyzngyDryyDkyzbVwzrttXDszwT4" + while (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击好友") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<赠送>*192$44.0AQT7lwE377kwC4sk1yDXXD80DlU02G03ws00YWEzy00984Dzy7mG0HUzlwYY4sDs0980C3002G03wk00Yk1zDsD9A0Tnw1kG07wz0AAXtzD1Vns0TnUwAC07sETWNXlw2Tx68wS03w3m07X001zU1tw00U" + while (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击赠送") + FindText().Click(X, Y, "L") + } + AddLog("===好友点数任务结束===") + BackToHall +} +; 邮箱收取 +Mail() { + BackToHall + AddLog("===邮箱任务开始===") + Text := "|<带红点的邮箱>*140$49.zzzzzzzzzzzzzzzzzzzzzzszzzzzzzU7zzzzzzVkzzzzzzXwDzzzzzXzbzzzzznzlzzzzzlzwzzzzzszyTzzzzwzzDzzzzyDzbzU0077zXzU003lzlzm001s0Fztk00S00zwy00DU0zyTk07s1zz7w0DzrzzUzUDzzzzk7sTnzzzs1zzUDzzw0Dz01zzy03z00zzz00S00TzzU0000Dzzk00007zzs00003zzw00001zzy00000zzz00000TzzU0000Dzzk00007zzs00003zzw00003zzzU0003zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzk" + while (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击邮箱") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + else { + AddLog("邮箱已领取") + AddLog("===邮箱任务结束===") + return + } + Text := "|<全部领取的图标>*240$33.zz07zzz007zzU00Dzs000zy0003zU000Ds0000y00003k60k0Q1sD01UTXw0A1yTk107sz000TXw001zDk007wz000TXw007wz001zDk00Tnw007sz041yTk1UTXw0A1sD01k60k0S00003s0000zU000Dy0003zs000zzU00Dzz007zzz07zw" + while (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击全部领取") + FindText().Click(X, Y, "L") + } + AddLog("===邮箱任务结束===") + BackToHall +} +;排名奖励(停用) +RankingReward() { + EnterToArk() + AddLog("===排名奖励任务开始===") + Text := "|<带红点的奖杯>*200$56.zzzzzzzyDzzzzzzzw0zzzzzzzwTXzzzzzzzDwTzzzzzzbzbzzzzzzvzwzzzzzzyzzDzzzzzzDznzzzzzznzwzzzzzzyzzDzzzzzzbznzzzzzztztz00000zDwTk0000DkyDw00003y07z00000zwDy000001zzz0000007zzXU0000tzzls0000TDzwy00007nzzDU0001wzzns0000TDzwy00007nzzDU0001wzzns0000TDzwS00007nzzbU0001tzzsw0000QTzz30000ADzzs000007zzz000003zzzy00003zzzzs0007zzzzz0003zzzzzs000zzzzzy000Tzzzzzk00Dzzzzzy007zzzzzzs07zzzzzzzU7zzzzzzzs1zzzzzzzz0Tzzzzzzzk7zzzzzzzw1zzzzzzzz0TzzzzzzzU7zzzzzzzs1zzzzzzzk03zzzzzy0001zzzzz0000DzzzU" + while (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.05 * PicTolerance, 0.05 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Sleep sleepTime + FindText().Click(X, Y, "L") + Sleep sleepTime + loop 2 { + Text := "|<红点>*200$19.0T00zs1kD0U1kVwMnz6HzlNzwtzyQzzCTzbDznnztdzsqTsn7ssk0sC1s3zk0DU8" + while (ok := FindText(&X := "wait", &Y := 1, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("发现红点,尝试点击") + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|<获得>*143$57.zXzDzzzzzzwDkzzlk03U000DwC0080000z1k01U0007kS7wA0001s7k01zXy7z1y00DwTlzstk01lby8zi67wC0Tl3zkk01s7yADwC00D0zlXz3s03U7w4TkTzzs0U00s3000X00070M007sE00s3U01y3w7z0TzVzUTUzxXvs7s3w7zwM0040T0TzX0001Xs3zwM00AQS4DzXlyDzXUkzwS7lzsMC3zXsSDz23sDwTXVy0UzUzXykDkADyDwTy1z3nztzXzkTU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|<排名>*143$35.lsXzVzXl7y0D72Ds0404700008A7kkQFs73lsXy4DX11y0z023w1s34TU00C8s00EkEM7slUUuDlXl7wTX7WDs04D4Tk08S8zU0TyFz7wU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + Confirm + } + GoBack + } + } + stdTargetX := 1858 + stdTargetY := 615 + UserMove(stdTargetX, stdTargetY, scrRatio) + Send "{WheelDown 30}" + Sleep sleepTime + } + } + else AddLog("没有可领取的奖励,跳过") + AddLog("===排名奖励任务结束===") + BackToHall +} +; 任务收取 +Mission() { + BackToHall + AddLog("===每日任务奖励领取开始===") + Text := "|<带红点的任务>*200$48.zzzzzrzwzzzzzrzwzzzzznzxzzwDznztzz00znztzs007sznzk003wT7zUTy0y0Dy1zzkTlzw7zzsDzzwDzzwDzzsTzzy7zzkzzzz3zzU" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.05 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + else { + AddLog("每日任务奖励已领取") + AddLog("===每日任务奖励领取结束===") + return + } + loop 4 { + if A_Index = 2 { + Text := "|<周任务的图标>*150$37.zzU0zzzy003zzw000Tzw1zk7zw3zy1zw7zzkTw7zzw7w7zlz1y7zsDky7zw3wD3zy0T73zz0DVXzzU3klzzk0wEzzs0S0Tzw0D0Dzy07U7zz03k3zz01s1zz00w0zz00S4Tz00D6Dz00DX3z007VVz007lsT007kwDk07sT3y07sTkzszsTsDzzsDy1zzkDzUTzkDzw0z0Tzz000Tzzs00zzzzU3zzU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + if A_Index = 3 { + Text := "|<主线任务的图标>*150$36.zzU1zzzw00Dzzs003zzU001zz0VV0zy3VVkTw73ksDsD3kw7sT7sS7ky7sT3ky7sT3U00001U00001U00001XwDyDl3wDyDt3wTyDs3wTyDs3wTyDs3wDyDs3wDwDlU00081U00001U00001k00003ky7wT3sS7sS7sT7sy7wD3kwDy3XlkTz1VVUzzU0U1zzk003zzw00Dzzz00zzU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + if A_Index = 4 { + Text := "|<成就的图标>*150$36.zzyTzzzz00zzzw00Dzzk003zzUDw1zz1zzUTw7zzkTwDzzwDsTyzy7kzwTy3lzwDz3VzsDzVXzs7zV3zk7zk7y00Dk7k003k7U003s7U003s7k007s7s00Ds7y00Ts7z00zk7y00zk3y00zk3y00TkVy00TVVy1UTVky7kT3kSTwy3sDzzw7w7zzsDy3zzkTz0zz0zzU7s1zzk007zzw00TzzzU3zzU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + Text := "|<灰色的领取>*157$40.wzzs0zzVU1U00y706000kD3wE024QDl200E070Ak0U0Q0l4lkFl74P7874QFU4UQ0s60GFk3UTX170C3yA4QEsDlkFk1Uw71S063kz1s007Xs3U20D677w0EysyTkXW" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + UserClick(2130, 1982, scrRatio) ;点领取 + Sleep 500 + } + } + AddLog("===每日任务奖励领取结束===") + BackToHall +} +; 通行证收取 兼容双通行证 兼容特殊活动 +Pass() { + BackToHall() + AddLog("===通行证任务开始===") + AddLog("执行第一个通行证") + OnePass() + Text := "|<通行证的旋转符号>*200$27.zy7zzy07zz00Dzk00zw3wDzVzvzsTzzz3zzbkzzsS7zy1lzzU6Dzz70Dzsw3zz7kzzkzDzy7zzzVzxzsDz3w3zk00zz00Dzy07zzy7zw" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + UserClick(3387, 389, scrRatio) + Text := "|<带红点的通行证的旋转符号>*200$35.zzzzs7zzzzDbzzzwzbzzzvzjzzzrzTzzzDyzzzyTxzzzyzvzzzxzrzkztzDw0Dsszk07w3y007zzs7sTzzkzxzzz3zzzzy7zzTzsTzwDzkzzkDzXzz0Tz7zzXzs1zz7zs7zyDzsTzsTztzzkzzzzz3zzyzw7zzsTUTzzU01zzzU07zzzk0zzzzwDzzy" + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("执行第二个通行证") + UserClick(3387, 389, scrRatio) + Sleep sleepTime + OnePass() + } + } + else AddLog("只有这么一个通行证") + AddLog("===通行证任务结束===") + BackToHall() +} +;执行一次通行证 +OnePass() { + UserClick(3633, 405, scrRatio) + Sleep sleepTime + loop 2 { + if A_Index = 1 { + Text := "|<任务>*200$41.30307U07Xz0T00Tzz1zzUzzs7zzXzy0zzyDUw1zbsT1s1zzVy3k1zzXzzyTzzzzzyTzzbzzwwwD7zzsTxwD1s3zzwS3k7zzsw7U7zzVsD01wD3rzwDkS7jzvzTwDTznszkSTz70z2" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + if A_Index = 2 { + Text := "|<奖励>*200$41.1VU0010Lbk3zb1zTzDzy7zzyTzw7zzwzxs7znlzzyDrzXzzzzby7zzzzzsDzzzzzUTyzkzw0zxzUzU1zvzTzznzrzzzzbzyzzzzTzxvzzwzzvkzy1zzrjzzvzzyztzrzzwz0zDzvsk0A183Y" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + Text := "|<灰色的全部>*148$40.zlzzXsDy3zwD0Dk7y000y0Ds003UkTk1487kT6AF0z0S8l4001U00s00C001s03s017z7zzz6DsDz0AMs03s0FXU0DU16DsTy740zlzsQE6003U14s00604TU00s0Ny" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + UserClick(2168, 2020, scrRatio) ;点领取 + Sleep 500 + } + } + BackToHall() +} +; 剧情活动(小活动) +Activity() { + BackToHall + Text := "|<作战出击的出击>*200$78.zzkDzzzzzzzzzzzkDzzzzzzzzzsDkDzzzzzzzzzsDkDzzzzzzzzzsDkDsDzzzsDzzsDkDs7zzzsDzzsDkDs7zzzsDzzsDkDs7zUzsDzzsDkDs7zU007zzsDkDs7zU0007zs7kDs7zU00003s007s7zU00003s00007zzs0003s00007zzzk003s00007zzzs7y3zw0007zzzsDzzzzk007y0zsDzz0zkDzDw0007zz0zkDzzy0000Dz0zkDzzy0000000zkDw3y0000000zkDw1zzk00000zkDw1zzzk0000zkDw1zrzs7s00zkDw1zkTsDzz0zkDw1zkDsDzz0TkDw1zkDsDsD000Dw1zkDsDs70001w1zkDsDs7000001zkDsDs7U00001zkDsDs7z00001zkDsDs7zzw001zk0k7s7zzzzU1zk003s7zzzzw1zk00007zzzzw1zk00007zzzzzzzy00007zzzzzzzzzs007zzzzzzzzzzz07zzzzzzzzzzzs7zzzzzzzzzzzzjU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y + 100 * WinRatio, "L") + Sleep sleepTime + } + loop 4 { + Confirm + } + AddLog("===剧情活动任务开始===") + AddLog("尝试完成挑战任务") + Text := "|<挑战>*200$40.vzzzzzzDaTyTawyNztyNndazbto2aHy1bk8NDtyTnlVzbs3DaTyS3wyNztzDktbz7wq7a7k3mEsNDDD9n1aQywDBaTnvtwytzDjbnnbQwwPCCNk3Vglsb08kXDkxyza" + if (ok := FindText(&X := "wait", &Y := 5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep 3000 + Text := "|<关卡的循环图标>*50$33.zvzzzzzDzzzzsTzzzz0zzz001s0000700000M0000D003s7zy0z3zzk7szzy0zTzzk7zzzy0zzzzk7zzzy0zzzzk7zzwy0zzyDk7zz1y0TzU0001s0000C00001s007zzk7zzzzVzzzzzDzzzzxzw" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , , , , , 3, TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Text := "|<快速战斗的图标>*194$29.UD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0Ty0w1zs3k7zUD0Ty0w1zs3k7zUD0Ty0w1zs3k7zUD0Ty0w1zs3k7zs" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + AddLog("快速战斗已激活") + FindText().Click(X, Y, "L") + Text := "|<进行战斗的战斗>*186$45.zzrzzzbzbwPzzwTszWDyDXz3wMzUwTs3X7y1Xz0ARzwATs1VbzvXz3s0TTwTsy07kzXz7k9y3wTsTlbsDXs0C8zlwT01k7zTXs0C1zzs07lkDzk00yD3w0007lsz003syC6M1wT01U3zzXs000TzwT0047zzXsy1kzzwTzzzDzzbw" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + } + Text := "|<左上角的挑战>*110$38.ls7yT7wS1z7kD607kwF000w16k00T0Ea207ss1lU3yS0QC1z7Ui30D061001k1UEE0A0MC44H763l15llVwMFAMM76AH040V30k00MFkAM66TzDzznU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + Confirm + } + AddLog("完成挑战任务") + } + else { + EnterToBattle + BattleSettlement + AddLog("完成挑战任务") + } + } + } + Text := "|<剧情活动>*200$73.zzvvyTzztzzrk3xxk0wS0y1vs1ayM0zC1z0xwynT7XzztzzwS0Ni00Dzwzzw10Ar3wzzwDzy0aSPX01lk0M1bH7Blzzwz3w1nc0ayw0zznzbtolnTQ0TztzrwsttjiTjzU3viQ04rr07xk1tnQ03vvXnwvww1C1txxk1wxyQ072wyys0ySTDDXX0QTQzST07zn3aSTiSDzU3zzX" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + GoBack + } + Text := "|<奖励>*120$32.tlz0NmM1U2Q00M3bU3C0E8Q3U0071s7081y1tC1zU4HwTs14006GH001YYnsDs8As0y220C1000DkE0VU" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y - 100 * WinRatio, "L") + Sleep sleepTime + ; Text := "|<离活动开始还剩下的剩下>*200$36.zbtzzzU7tzzzwztU00yTNznz01NznzyzNznzqbNzlzaXNzkTqbNzk7qrNznXalNznnwTNznzsDtznzsXtznzavtznziznznzyzXznzU" + ; if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + ; AddLog("困难未开放,可以继续") + ; } + UserClick(1662, 2013, scrRatio) + Sleep sleepTime + UserClick(1662, 2013, scrRatio) + Sleep sleepTime + UserClick(1662, 2013, scrRatio) + Sleep sleepTime + Text := "|<1.11>*200$58.zzzzzzjzzzzjzzzyzzzzwzzzznzzjzXzzzyDzwzsDzzzUzz3s0zzzk3z0Ds3zzzUDz0zkDzzz0zy3z0zzzw3zsDy3zzzsDzUzsDzzzUzz3zUzzzy3zwDy3zzzsDzkzsDzzzUzz3zUzzzy3zwDy3zzzsDzkzsDzzzUzz3zUzzzy3zwDy3z0zsDzkzsDw3zUzz3zUzkDy3zwDy3y0TsDzkzsDw3zUzz3zUzkDy3zwDy3zSzsDzkTs7zzzUTy0w07zzs0TU0U1zzz07w0C0Dzzs0zU3nXzzzi7yQTTDzzxyzvtxzzzzzzzjzs" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + AddLog("刷11关") + FindText().Click(X, Y, "L") + Text := "|<快速战斗的图标>*194$29.UD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0Ty0w1zs3k7zUD0Ty0w1zs3k7zUD0Ty0w1zs3k7zUD0Ty0w1zs3k7zs" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + AddLog("快速战斗已激活") + FindText().Click(X, Y, "L") + Text := "|*130$23.66CMAAQYMMt8klkFV1lX2HX64b649CA2GQM4Ysk91lUG399UWGH3YZa73XBiLM" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.15 * PicTolerance, 0.15 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("进行多倍率快速战斗") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<进行战斗的战斗>*186$45.zzrzzzbzbwPzzwTszWDyDXz3wMzUwTs3X7y1Xz0ARzwATs1VbzvXz3s0TTwTsy07kzXz7k9y3wTsTlbsDXs0C8zlwT01k7zTXs0C1zzs07lkDzk00yD3w0007lsz003syC6M1wT01U3zzXs000TzwT0047zzXsy1kzzwTzzzDzzbw" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + } + AddLog("完成活动关卡") + } + else { + EnterToBattle + BattleSettlement + AddLog("完成活动关卡") + } + } + else { + AddLog("未找到第11关,退出") + } + } + Text := "|<剧情活动>*200$73.zzvvyTzztzzrk3xxk0wS0y1vs1ayM0zC1z0xwynT7XzztzzwS0Ni00Dzwzzw10Ar3wzzwDzy0aSPX01lk0M1bH7Blzzwz3w1nc0ayw0zznzbtolnTQ0TztzrwsttjiTjzU3viQ04rr07xk1tnQ03vvXnwvww1C1txxk1wxyQ072wyys0ySTDDXX0QTQzST07zn3aSTiSDzU3zzX" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + GoBack + } + AddLog("===剧情活动任务结束===") + BackToHall +} +; 免费招募 +FreeRecruit() { + BackToHall() + AddLog("===每日免费招募开始===") + Text每天免费 := "|<每天免费>*156$64.wzzzzzbzz9zU0s03w1z00S01U0DU7zmNnzzyTwQzk0601ztzU07Abs07zby00Q00t6S00QttwNna9s01nba3aE01z3z00Q03167wDw03s0DgNzUTz9zbAw03wMzsbSNnk07Xky6Qt0TztsTVUs20kTyDbzbDUMTsU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text每天免费, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + AddLog("进入招募页面") + Sleep sleepTime + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text每天免费, , 0, , , , , TrueRatio, TrueRatio)) { + Text每日免费 := "|<每日免费>*122$73.szzs07z3zw00s01w01z07y00A00y00z03zU04TzzDwT3XzU0001zbyD007k0200Dnz7U01s00U07szXkkkw00MlXw01wQwS3W0E0y00y00C1l800D7wT007U04007byDk07s03a6Tnz7z0zwtll07tzXz2TyQss01w01z3DDA0w00y00y3X7UEDz1z00S3k30S3zVzbzDjw3Vzt" + if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3 * PicTolerance, 0.3 * PicTolerance, Text每日免费, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("进行招募") + FindText().Click(X, Y, "L") + Recruit() + } + else { + ; 点击翻页 + Sleep sleepTime + UserClick(3774, 1147, scrRatio) + Sleep sleepTime + } + } + } + AddLog("===每日免费招募结束===") + UserClick(1929, 1982, scrRatio) ;点击大厅 +} +Cooperate() { + BackToHall + AddLog("===协同作战任务开始===") + ; 把鼠标移动到活动栏 + stdTargetX := 150 + stdTargetY := 257 + UserMove(stdTargetX, stdTargetY, scrRatio) + Text := "|*40$40.00000Q000001U00000A000001U00000A000001U00000A000001U00000A000003U000Dzw00E0zzU0303zw00Q0C0003k0s000T03U003w0C000Tk0s003z03U00Tw0C003zk0s00Tz03U03zw0Dzzzzk0zzzzz03zzzzw0Dzzzzk0zzzzz03zzzzw0Dzzzzk0zzzzz03zzzzw0Dzzzzk0zzzzz03zzzzw0Dzzzzs" + loop 20 { + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Sleep sleepTime + FindText().Click(X, Y, "L") + break + } + else { + AddLog("尝试滑动左上角的活动栏") + Send "{WheelDown 7}" + Sleep sleepTime + } + if (A_Index > 20) { + AddLog("未能找到协同作战") + return + } + } + while true { + ;一直找开始匹配 + Text匹配 := "|<匹配>*200$51.0000s0400000700U00001z4zz0yC7zs7zs7lkzw0Dz0yC7z00zs7Vkzs07z0wD7z48zs7Xszsd600wT7z5ck07Xstsh600sT771Uls37sssA6DsEz273slz0Ds1sz6Ds1z0D00lz2Tzzs04Dszzzz3kVw3zzzsz4DU000D00lw0000s0600000700k0U" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text匹配, , , , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|<通知>**50$48.0DzyTU00TA07MUTytw03Mzzzkw07MzU3sT4Ck0U3QS0Sk0U3Cz0TU3XX7s03WDXX0803nAXXzslny7XXUM03U0XXUM03U0XXUMlnU0XXwM03yDXXAM0366XX4MEX63XX4MlXA1XXAMl3A1XXsMt7sM03k3zzksU3V001UxU3nk01ljXXqy07v0zzU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + BackToHall + return + } + } + else { + BackToHall + return + } + while true { + ;防止有人取消,反复检测 + Text接受 := "|<接受>**50$48.7kT001zw4kNUTzk64rtzM0064w01M03yww01SSTAkDDDCSP4kDDACDCCkDDDSCADww01k0014s01k0014w01nzztQDnznzztsDXzv00Pk001z00Tks01X7sMwzD7VXsk4qDC1llk4o6A0s3U4r0Q1s3sQzkDTU0TMy03E1k1Es7XM7w3U" + if (ok := FindText(&X := "wait", &Y := 30, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text接受, , , , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Sleep sleepTime + Text准备 := "|<准备>**50$54.y6AM067zUX4Q80A01kXAS80M00ElgSDlk00kks00H0TVUMk00G0D3UMkwDmA0709UyDnz0D0D0yDny07z3000z00032000M0D033800w1zs37syDo3zyCAsyDbU00QAMwDlU00E8M00FXkwMMs00lXkwMEsyDlU00Mkca81U00MlcyDtXkwMV800NXkwMX8009U00Mn800NU00MU" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text准备, , , , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + break + } + if A_Index > waitTolerance { + MsgBox "进入作战失败!" + Pause + } + } + BattleSettlement + Sleep 5000 + } + AddLog("===协同作战任务结束===") + BackToHall +} +SoloRaid() { + BackToHall + AddLog("===单人突击任务开始===") + Text := "|<单人突击的图标>*101$54.zU3w0D303z01s0D301z00s0C301z00k06200y00k06600y3kkw467Uy3UUw447Vy7UUwAA71w7VUs8AD1w710088D3s0100MMC3s0300MMS3s0700EES7s023kkkS7k063Ukkw7kQ67UUUw7kw47VVUwDUwA71VVsDUsAD11VsDVs8D3100T1sMC3300z1kMS2301z3kES6203z7ksy6607zzUzw7zzzzzVzwDzzzzzbzwzzzzzzjztzzzzzU" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + } + else { + AddLog("不在单人突击活动时间") + AddLog("===单人突击任务结束===") + return + } + Text := "|<左上角的单人突击>*112$73.syDzVzzkzzwTwT7zkzs00TyDy73zsTw00700400TwDy003U0200Dy7z4Qlk01667z3zUA3zszU03zVzsDUzsDk01zUTwQEs008kkzkDzy1y00400Ts3zy0T11200DsFz001llny7zsMTU00sss001wC7zUTwQQ000wD1zU7yCA000MDkT0Uz007wTwDw61s3U03yDyDzb1z3k01" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Text := "|<奖励内容的图标>*183$30.zkT3zzWSFzzbAxzzjgwzzbVxzzXVlzzkn3zU0001bzUztDzVzwDzVzw00000TzVzyTzVzyTzVzyTzVzyTzVzyTzVzyTzVzyTzVzy00000U0001bzVztbzVztbzVztbzVztbzVztbzVztbzVztbzVztbzVztk0001U" + Confirm + Text方舟 := "|<方舟的图标>*200$57.0000w00000003zzU000003zzzk00003zzzzU0000zzzzz0000Tzzzzz0007zzzzzw003zzxzzzk00zzw7bzz00Dzz0wDzw03zzk7UTzk0Tzs0w1zz07zz0Tk7zw1zzkDzUzzkDzy3zy3zz3zzUzzkTzsTzw7zz3zzbzzzzzsDzyTzzzzzzzznzzzzzzzzzDzxzzzzzztzzUzzzzzz7zy7zz1zzsTzkTzsTzy3zz1zy3zzUDzs7zUTzw0zzUDk7zz03zy0w1zzk0Dzs7UTzy00zzkw7zzU03zz7Vzzs00Dzzzzzy000zzzzzz0001zzzzzk0003zzzzs00007zzzw000007zzy0000007zw000U" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text方舟, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("单人突击活动已结束") + AddLog("===单人突击任务结束===") + return + } + } + ; 选中第七关 + UserClick(2270, 231, scrRatio) + Sleep sleepTime + while True { + Text := "|<左上角的单人突击>*112$73.syDzVzzkzzwTwT7zkzs00TyDy73zsTw00700400TwDy003U0200Dy7z4Qlk01667z3zUA3zszU03zVzsDUzsDk01zUTwQEs008kkzkDzy1y00400Ts3zy0T11200DsFz001llny7zsMTU00sss001wC7zUTwQQ000wD1zU7yCA000MDkT0Uz007wTwDw61s3U03yDyDzb1z3k01" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + Confirm + } + Sleep sleepTime + Text := "|<快速战斗的图标>*194$29.UD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0TzUD0Ty0w1zs3k7zUD0Ty0w1zs3k7zUD0Ty0w1zs3k7zUD0Ty0w1zs3k7zs" + if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , , , , , , TrueRatio, TrueRatio)) { + AddLog("快速战斗已激活") + FindText().Click(X, Y, "L") + Sleep sleepTime + Text := "|*130$23.66CMAAQYMMt8klkFV1lX2HX64b649CA2GQM4Ysk91lUG399UWGH3YZa73XBiLM" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.15 * PicTolerance, 0.15 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("进行多倍率快速战斗") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Text := "|<进行战斗>*200$93.zzzzzzzzzzzzzzrxzbbzbzzzbwTzzwTXwszss07wzWTyTXwDb7yD01zbwNzkwTlsET3zzzwTXDz3XzQ00szzzzUCTzwQTzU0DCTzzw3XzzzXzz37zXzzzbw0zzwTzwszsM07wy07lzXsDb7z600zbkDy3wT1sMTls07sznjwDXw800sDz7w0SMzlwTlU071zsz03lDzzXyD77sDz7swS1zzw0ltsztzsz7nkTzs06CD7zDz7syT3y001lVsztzszDnsz003yCT7zDz7syS6s7wTUrxztzsz1XUnzzXs0TwzDz7s080zzwTC007tz0z00A7zzXvy00zDsDtyPkzzwTzzzzxzzzzzzzzzrw" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + AddLog("===单人突击任务结束===") + BackToHall + return + } + Text := "|<挑战>*180$55.szbDzzzkzwTV3zwTsNyDkVzy7w8z7sEzz3y4DXY8FzVz320048Tk1VX0020Ts0kzU010Dw0M0E20UDy7k0C3UE7z3s07Xk87zVw03kS4Dzky0rs723y01sEk3V0T00w8E10U7U0S0M30E1k0D0A2080sS7UDVU48QDXk7sk66S7lw7wR33T3sy2yD1VbVsS3D7Uklk0C03XUsMs040210w0Q00010kS0C0030kQzUD3snkszzwTzzzww" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + else { + AddLog("已无挑战次数,返回") + AddLog("===单人突击任务结束===") + BackToHall + return + } + Text := "|<确认的图标>*184$34.zy03zzzU07zzs00zzz0Tzzzs7zzvz1zzz7sDzzsD1zzz1wDzzsDVzzz1y7zzsDkzzz1z3zzsDwDzz1zlyTsDz7kz1zwT1sDzly31zk7w0Dz0Ts1zw0zkDzl3zVzz6DzDzsMTzzzXkzzzwD3zzzVy7zzw7wDzzUzkDzw7zkDz0zzU007zz001zzz00TzzzkDzy" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + Sleep 3000 + Text := "|<进入战斗>*200$109.zzzzzzzzzzbzbzzzwTtzXXzzbzzzlzXjzzyDsTlkzzVzzzszlXzlz7y7ssTzkTzzwTslzsDXzVsQDzw7zzyDwQTy1lztU00zz1zzz0CDzzUszzk00TzkzzzU7bzzwwTzw00TzwDzzkzV3zzyDzzlkzzw3zzsz00yTz7zzssTzy1zzwT01z3zXw3wQDzz0TzyDkDzUTly0yC7zzUDzz7z7Ts7szUE00TzV3zw0DX7z3wTw800Dzklzw03lXzvyDyC007zksTy01sXzzz7z7lsTzsS7z7sw1zzz03XswDzsT3zXwT1zzs01lsS7zsDkzlyDUzs001ssT3zsDsDsz7kzU00TwADVzwDy3wTXsPk1yDw7DtzwDzUyDlsAtzz7w0zzzs7zsD00k4TzzXw8001s7zy3U0E0DzzlyD000wDzzXk00MDzzszjs00TDzztsz4w7zzwTzzzzzzzzzzzzzbzzyTs" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + BattleSettlement() + } + } + AddLog("===单人突击任务结束===") + BackToHall +} +; 德雷克·反派之路 +RoadToVillain() { + BackToHall() + AddLog("===反派之路任务开始===") + Text := "|*200$29.zzzznzzzy3zzwtbztlnCDbVaEC73BaNA6HQaPAYtAqN9WPgWOAq11kNw270XNYSN6bzxm9DznY5zy7AzzwCTzzzU" + while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + FindText().Click(X, Y, "L") + Sleep sleepTime + } + loop 3 { + if A_Index = 1 { + Text := "|<任务>*181$41.1U103U03Uz0D00Dzz0zzkTzs3zzVvz0Tzy7US0zXsD0w0rzUy1s0Tz3w3kDzzvzzyTsznzzwQQ33zzs0w070w1zzwC1s3zzsQ3k0T3ks7U0w71nzw7kC3bztzDw7DzlsTkC0030T2" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击任务") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + if A_Index = 2 { + Text := "|<周任务>*183$62.7zz0Q1s0s03zzs7zz0TzUzzy3zzkDzwDzzUzzkDzz3XlsSTk7yTUzzyDUw1zzkDzzbsD0Bzs3zxty3k7zzszzyTzztzzzDzzXzzyTwzXzzsTzzX7U0vzS7zzkzzwSzrVsD0Dzz7jxsS3k3zzlvrS7Uw07kwQzrUsDU3sDDDzsCzzXw7nnny3jztyTsMET0vzyS3w003UC0000Q2" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击周任务") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + if A_Index = 3 { + Text := "|<奖励>*181$40.3VU0031CD0DzQCtzszxkzzzXzr1jwSC0Q1vvkzzzTXy3zzzyDkDzzyzy0z1rnjU3zbQCs0TyRk3U1rtrzzzbRbTzzyRytzzztrvb0zU7zyQTzUTjlzwTtzzyzUzjzttk0Q/Mb8" + if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击奖励") + FindText().Click(X, Y, "L") + Sleep sleepTime + } + } + Text := "|<灰色的全部领取>*170$81.zrzzbzzxzzzzzzwTzwz0zDU707zzVzw0s7sy0s107lbz07Qy3xzbA0wSDwsvbrDjwvX67szrjRww0DUSw1zUytvD9wsw3rcDw7nDPzjjbaSNs07s0PDxxgwvnDwDz03Rw3hbaTNznzzzvbkBgw3sTyTzzzQznhbWT3w0Dw0vbyRgwlwTU1zU7QzrVba7Xznzwwv7kzDs0sTyTzjbNyDsz0C1znzwsvztyNzlX400DU7TzbbbzQwU" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击全部领取") + UserClick(1662, 2013, scrRatio) + Sleep 500 + } + Text := "|<活动结束>*150$67.byDztzbnzwzsUDUQzXsy00SuDzyTnU300Dzjzw1nQDzbzzXzy0FDDw06A040n873w03Xsz0ta60SQtzyznwnbzzCQzyDtivUzzU0TM0xqRUM3s0D4yQlCvwtz0zaTC06Tywz07bDb77D1SS4lnU3zW61UCCQ/k1zv3jk7DDg" + while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) { + AddLog("点击全部领取") + UserClick(1662, 2013, scrRatio) + Sleep 500 + } + Sleep sleepTime + } + AddLog("===反派之路任务结束===") + BackToHall() } -;创建gui -doroGui := Gui(, "Doro小帮手" currentVersion) -doroGui.Opt("+Resize") -doroGui.MarginY := Round(doroGui.MarginY * 0.9) -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) -Tab := doroGui.Add("Tab3", "xm") ;由于autohotkey有bug只能这样写 -Tab.Add(["设置", "收获", "商店", "日常", "默认"]) -Tab.UseTab("设置") -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) -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") -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) -Tab.UseTab() -doroGui.Add("Button", "Default w80 xm+100", "DORO!").OnEvent("Click", ClickOnDoro) -doroGui.Show() ^1:: { ExitApp } ^2:: { - Pause -1 + Pause +} +^3:: { + Initialization() + ; WinMove (A_ScreenWidth / 2) - (NikkeWP / 2), (A_ScreenHeight / 2) - (NikkeHP / 2), 1920, 1080, nikkeID ;窗口缩放居中 + WinMove (A_ScreenWidth / 2) - (NikkeWP / 2), (A_ScreenHeight / 2) - (NikkeHP / 2), 2347, 1350, nikkeID ;我电脑的尺寸 +} +^4:: { +} +;调试指定函数 +^0:: { + ;添加基本的依赖 + Initialization() + ;下面写要调试的函数 + RoadToVillain() } diff --git a/README.md b/README.md index b22a4a5..1c03ed8 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,19 @@ # DoroHelper -PC 端日常任务清理助手。一键清理多项日常事务。支持国际服和港澳台服客户端。支持多开。 +PC 端日常任务清理助手。一键清理多项日常事务。支持国际服和港澳台服客户端。 +## 我们联合! + +- 牢 N 写的功能类似的[手机脚本](https://github.com/Zebartin/autoxjs-scripts) + +- 牢 D 功能类似的[模拟器脚本](https://github.com/takagisanmie/NIKKEAutoScript) + ## 免责声明 -本项目仅供个人学习研究使用,严禁用于商业用途。除 Github 以外其他任何网站、社交平台中有关本项目的内容**均非本人发布**,若造成侵犯著作权、版权或违反网络安全法规等任何后果,均与本人无关。 +本项目仅供个人学习研究使用,严禁用于商业用途。除 Github 和下方 qq 群以外其他任何网站、社交平台中有关本项目的内容**均非本人发布**,若造成侵犯著作权、版权或违反网络安全法规等任何后果,均与本人无关。 使用任何脚本程序均有封号风险,请谨慎。 @@ -21,7 +27,7 @@ PC 端日常任务清理助手。一键清理多项日常事务。支持国际 ### 运行 ahk 文件(推荐) 1. 将整个项目文件下载到本地并解压(右上角绿色 code 按钮-Download ZIP) -1. 下载[AutoHotkey V2.0](https://www.autohotkey.com/download/ahk-v2.exe) +1. 下载并安装[AutoHotkey V2.0](https://www.autohotkey.com/download/ahk-v2.exe) 1. 以管理员身份运行 DoroHelper.ahk ### 运行 exe 文件 @@ -33,42 +39,70 @@ PC 端日常任务清理助手。一键清理多项日常事务。支持国际 Doro 只是想让你少被该死的读条、闪光弹和重复劳动折磨。一键清理多项日常事务(按顺序执行),包括: -- **前哨基地防御** - - - 1 次一举歼灭+2 次收菜 - - **付费商店** - 领取每日、周、月免费钻 -- **免费商店** +- **普通商店** - - 普通商店每天白嫖 2 次 - - 竞技场购买自定义数量的属性技能书 + - 每天白嫖 2 次 + - 用信用点买芯尘盒 + - 购买简介个性化礼包 + +- **竞技场商店** + + - 购买指定类型的属性技能书 + - 购买代码手册宝箱 + - 购买简介个性化礼包 - 购买公司武器熔炉 -- **派遣远征和收菜** -- **收取赠送好友点数** -- **模拟室 5C 通关** -- **新人竞技场进行自定义数量的战斗** +- **模拟室** - - 顺带收取 pjjc 囤积超过 50%的菜 + - 普通模拟室 + - 模拟室超频 -- **进行十次好感度咨询** -- **光速爬塔失败 1 次(蹭每日任务点数)** -- **爬企业塔** +- **竞技场** -- **自动异常拦截** + - 竞技场收菜 + - 新人竞技场 + - 特殊竞技场 + - 冠军竞技场 -- **邮箱收取** +- **无限之塔** -- **每日奖励收取** + - 尽可能地爬企业塔 + - 尽可能地爬通用塔 -- **Pass 收取** +- **常规奖励领取** + + - 前哨基地收菜 + - 进行派遣 + - 好感度咨询 + - 花絮鉴赏 + - ~~方舟排名奖励~~ + - 好友点数收取 + - 邮箱收取 + - 任务收取 + - 通行证收取 + +- **限时奖励领取** + + - 活动期间每日免费招募 + - 协同作战摆烂 + - 单人突击日常 + - 德雷克·反派之路 + +## 妙妙工具 + +- 剧情模式 + - 对话时如果只有一个选项,在短暂延迟后点击该选项 + - 如果有两个选项,则等待玩家选择 + - 自动进行下一段剧情,自动启动 auto + - 自动将观看过的剧情收藏 ## 要求 -- 【设定-画质-全屏幕模式 + 16:9 的显示器比例】(推荐) 或 【16:9 的窗口模式】(窗口尽量拉大,否则像素识别可能出现误差) +- 16:9 全屏或窗口模式 - 设定-画质-开启光晕效果 @@ -84,16 +118,23 @@ Doro 只是想让你少被该死的读条、闪光弹和重复劳动折磨。一 也可以在游戏处在大厅界面时(有看板娘的页面)切出来点击“DORO!”按钮启动程序。 -## 其他 - -如果出现死循环,提高点击间隔可以解决 80%的问题。 - -如果你的电脑配置较好的话,可以尝试降低点击间隔。 - ## 反馈和改进 加入[DoroHelper 反馈群](https://qm.qq.com/q/f0Q1yr7vzi)(584275905) +## 支持和鼓励 + +知一一:前任作者牢 H 停更后,DoroHelper 的绝大部分维护和新功能的添加都是我在做,这耗费了我大量时间和精力,希望有条件的小伙伴们能支持一下 + + + +支付宝收款码 +微信收款码 + +
+ ## 借物表 [Github.ahk-API-for-AHKv2](https://github.com/samfisherirl/Github.ahk-API-for-AHKv2) + +[FindText-for-AHKv2](https://www.autohotkey.com/boards/viewtopic.php?f=83&t=116471) diff --git a/doro.ico b/doro.ico index fd8358e..8452680 100644 Binary files a/doro.ico and b/doro.ico differ diff --git a/img/alipay.png b/img/alipay.png new file mode 100644 index 0000000..c02af34 Binary files /dev/null and b/img/alipay.png differ diff --git a/img/weixin.png b/img/weixin.png new file mode 100644 index 0000000..f091a09 Binary files /dev/null and b/img/weixin.png differ 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 new file mode 100644 index 0000000..c9472cc --- /dev/null +++ b/lib/FindText.ahk @@ -0,0 +1,3319 @@ +;/* +;=========================================== +; 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 (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 + } + 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 || 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 + 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) < nW && ty < nH ? cors[ty * nW + tx + 1] : WindowColor), C_[++k]) + loop 71 + 0 * (k := 71 * 25) + this.SC(0xFFFFAA, C_[++k]) + ListLines lls + _Gui := FindText_Capture + _Gui["MySlider1"].Enabled := nW > 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 < nH + 1 - CutDown && G_.Call("RepColor")) + return + case "CutL": + if (CutLeft + CutRight >= nW) + return + CutLeft++, k := CutLeft - nW + loop nH + k += nW, (A_Index > CutUp && A_Index < nH + 1 - CutDown && G_.Call("CutColor")) + return + case "CutL3": + loop 3 + G_.Call("CutL") + return + case "RepR": + if (CutRight <= 0) || (bg != "" && InStr(color, "**") && CutRight = 1) + return + k := 1 - CutRight, CutRight-- + loop nH + k += nW, (A_Index > CutUp && A_Index < nH + 1 - CutDown && G_.Call("RepColor")) + return + case "CutR": + if (CutLeft + CutRight >= nW) + return + CutRight++, k := 1 - CutRight + loop nH + k += nW, (A_Index > CutUp && A_Index < nH + 1 - CutDown && G_.Call("CutColor")) + return + case "CutR3": + loop 3 + G_.Call("CutR") + return + case "RepU": + if (CutUp <= 0) || (bg != "" && InStr(color, "**") && CutUp = 1) + return + k := (CutUp - 1) * nW, CutUp-- + loop nW + k++, (A_Index > CutLeft && A_Index < nW + 1 - CutRight && G_.Call("RepColor")) + return + case "CutU": + if (CutUp + CutDown >= nH) + return + CutUp++, k := (CutUp - 1) * nW + loop nW + k++, (A_Index > CutLeft && A_Index < nW + 1 - CutRight && G_.Call("CutColor")) + return + case "CutU3": + loop 3 + G_.Call("CutU") + return + case "RepD": + if (CutDown <= 0) || (bg != "" && InStr(color, "**") && CutDown = 1) + return + k := (nH - CutDown) * nW, CutDown-- + loop nW + k++, (A_Index > CutLeft && A_Index < nW + 1 - CutRight && G_.Call("RepColor")) + return + case "CutD": + if (CutUp + CutDown >= nH) + return + CutDown++, k := (nH - CutDown) * nW + loop nW + k++, (A_Index > CutLeft && A_Index < nW + 1 - CutRight && G_.Call("CutColor")) + return + case "CutD3": + loop 3 + G_.Call("CutD") + return + case "Gray2Two": + 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 + _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) < nW && ty < nH && show[i := ty * nW + tx + 1] + this.SC((ascii[i] ? 0 : 0xFFFFFF), C_[k]) + return + case "Modify": + Modify := FindText_Capture["Modify"].Value + return + case "MultiColor": + MultiColor := FindText_Capture["MultiColor"].Value + Result := "" + ToolTip + return + case "FindShape": + FindShape := FindText_Capture["FindShape"].Value + (FindShape && !MultiColor) && FindText_Capture["MultiColor"].Value := MultiColor := 1 + return + case "Undo": + Result := RegExReplace(Result, ",[^/]+/[^/]+/[^/]+$") + ToolTip Trim(Result, ",") + return + case "Similar1", "Similar2", "Similar3": + i := FindText_Capture[cmd].Value + for k, v in ["Similar1", "Similar2", "Similar3"] + (v != cmd) && FindText_Capture[v].Value := i + return + case "GetTxt": + txt := "" + if (bg = "") + return + k := 0 + ListLines (lls := A_ListLines) ? 0 : 0 + loop nH { + v := "" + loop nW + v .= !show[++k] ? "" : ascii[k] ? "1" : "0" + txt .= v = "" ? "" : v "`n" + } + ListLines lls + return + case "Auto": + G_.Call("GetTxt") + if (txt = "") { + FindText_Capture.Opt("+OwnDialogs") + MsgBox Lang["s13"], "Tip", "4096 T1" + return + } + while InStr(txt, bg) { + if (txt ~= "^" bg "+\n") + txt := RegExReplace(txt, "^" bg "+\n"), G_.Call("CutU") + else if !(txt ~= "m`n)[^\n" bg "]$") + txt := RegExReplace(txt, "m`n)" bg "$"), G_.Call("CutR") + else if (txt ~= "\n" bg "+\n$") + txt := RegExReplace(txt, "\n\K" bg "+\n$"), G_.Call("CutD") + else if !(txt ~= "m`n)^[^\n" bg "]") + txt := RegExReplace(txt, "m`n)^" bg), G_.Call("CutL") + else break + } + txt := "" + return + case "OK", "SplitAdd", "AllAdd": + _Gui := FindText_Capture + _Gui.Opt("+OwnDialogs") + G_.Call("GetTxt") + if (txt = "") && (!MultiColor) { + MsgBox Lang["s13"], "Tip", "4096 T1" + return + } + if InStr(color, "#") && (!MultiColor) { + k := i := j := 0 + ListLines (lls := A_ListLines) ? 0 : 0 + loop nW * nH { + if (!show[++k]) + continue + i++ + if (k = SelPos) { + j := i + break + } + } + ListLines lls + if (j = 0) { + MsgBox Lang["s12"], "Tip", "4096 T1" + return + } + color := "#" j "-" StrSplit(color "-", "-")[2] + } + Comment := _Gui["Comment"].Value + if (cmd = "SplitAdd") && (!MultiColor) { + if InStr(color, "#") { + MsgBox Lang["s14"], "Tip", "4096 T3" + return + } + bg := StrLen(StrReplace(txt, "0")) + > 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 < w) + continue + i := Format("{:d}", i) + v := RegExReplace(txt, "m`n)^(.{" i "}).*", "$1") + txt := RegExReplace(txt, "m`n)^.{" i "}"), i := 0 + while InStr(v, bg) { + if (v ~= "^" bg "+\n") + v := RegExReplace(v, "^" bg "+\n") + else if !(v ~= "m`n)[^\n" bg "]$") + v := RegExReplace(v, "m`n)" bg "$") + else if (v ~= "\n" bg "+\n$") + v := RegExReplace(v, "\n\K" bg "+\n$") + else if !(v ~= "m`n)^[^\n" bg "]") + v := RegExReplace(v, "m`n)^" bg) + else break + } + if (v != "") { + v := Format("{:d}.", InStr(v, "`n") - 1) . this.bit2base64(v) + s .= "`nText.=`"|<" SubStr(Comment, 1, 1) ">" 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" + . "currentScale := A_ScreenDPI / 96" + . "`ntitle := `"ahk_exe nikke.exe`"" + . "`nnikkeID := WinGetIDLast(title)" + . "`nWinGetClientPos &NikkeX, &NikkeY, &NikkeW, &NikkeH, nikkeID" + . "`nPicTolerance := 1" + . "`nTrueRatio := A_ScreenDPI / 96 * NikkeW / 2347" + . "`nt1:=A_TickCount, Text:=X:=Y:=`"`"" s + . "`nif (ok:=FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1*PicTolerance, 0.1*PicTolerance, Text,,,,,,, TrueRatio, TrueRatio)){" + . "`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 ================= +;