From 5a9a9533a500d296008fbc79fc394282ac46209f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=9F=A5=E4=B8=80=E4=B8=80?= <1204244136@qq.com>
Date: Tue, 13 May 2025 10:14:44 +0800
Subject: [PATCH] =?UTF-8?q?perf:=20=E6=8C=81=E7=BB=AD=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
调整了函数位置,使其更直观、修复了一些bug、加入了一些小功能
---
DoroHelper.ahk | 934 ++++++++++++++++++++++++-----------------------
lib/FindText.ahk | 1 +
2 files changed, 471 insertions(+), 464 deletions(-)
diff --git a/DoroHelper.ahk b/DoroHelper.ahk
index 2087279..62b3b3c 100644
--- a/DoroHelper.ahk
+++ b/DoroHelper.ahk
@@ -13,12 +13,12 @@ global waitTolerance := 50
global sleepTime := 1000 ; 声明并初始化全局变量
; 全局设置 Map 对象
global g_settings := Map(
- "Award", 1, ; 奖励领取总开关
- "OutpostDefence", 1, ; 前哨基地收菜
- "CashShop", 1, ; 付费商店
+ ;商店
"Shop", 1, ; 商店总开关
+ "CashShop", 1, ; 付费商店
"NormalShop", 1, ; 普通商店
"NormalShopDust", 1, ; 普通商店:芯尘盒
+ "NormalShopPackage", 0, ; 普通商店:简介个性化礼包
"ArenaShop", 1, ; 竞技场商店
"BookFire", 1, ; 竞技场商店:燃烧手册
"BookWater", 1, ; 竞技场商店:水冷手册
@@ -32,31 +32,39 @@ global g_settings := Map(
"ScrapShopGem", 1, ; 废铁商店:珠宝
"ScrapShopVoucher", 1, ; 废铁商店:好感券
"ScrapShopResources", 1, ; 废铁商店:养成资源
- "Expedition", 1, ; 派遣
- "FriendPoint", 1, ; 好友点数
- "Mail", 1, ; 邮箱
- "Mission", 1, ; 任务
- "Pass", 1, ; 通行证
+ ; 模拟室
"SimulationRoom", 1, ; 模拟室
"SimulationOverClock", 1, ; 模拟室超频
+ ; 竞技场
"Arena", 1, ; 竞技场收菜
- "RankingReward", 1, ; 排名奖励
"RookieArena", 1, ; 新人竞技场
"SpecialArena", 1, ; 特殊竞技场
"ChampionArena", 0, ; 冠军竞技场
+ ; 咨询妮姬
"LoveTalking", 1, ; 咨询
- "CompanyWeapon", 1, ; 企业武器熔炉 (商店)
- "Interception", 1, ; 拦截战
+ ; 无限之塔
"Tower", 1, ; 无限之塔总开关
"CompanyTower", 1, ; 企业塔
"UniversalTower", 0, ; 通用塔
- "LongTalk", 1, ; 详细咨询 (若图鉴未满)
- "AutoCheckUpdate", 0, ; 自动检查更新
- "SelfClosing", 1, ; 完成后自动关闭程序
+ ; 异常拦截
+ "Interception", 1, ; 拦截战
+ ; 奖励
+ "Award", 1, ; 奖励领取总开关
+ "OutpostDefence", 1, ; 前哨基地收菜
+ "Expedition", 1, ; 派遣
+ "FriendPoint", 1, ; 好友点数
+ "Mail", 1, ; 邮箱
+ "RankingReward", 1, ; 排名奖励
+ "Mission", 1, ; 任务
+ "Pass", 1, ; 通行证
"FreeRecruit", 1, ; 活动期间每日免费招募
"RoadToVillain", 1, ; 德雷克·反派之路
"Cooperate", 1, ; 协同作战
"SoloRaid", 1, ; 个人突击
+ ; 其他
+ "AutoCheckUpdate", 0, ; 自动检查更新
+ "SelfClosing", 1, ; 完成后自动关闭程序
+ "OpenBlablalink", 0, ; 完成后打开Blablalink
)
; 其他非简单开关的设置 Map 对象
global g_numeric_settings := Map(
@@ -74,12 +82,172 @@ SetWorkingDir A_ScriptDir
try {
LoadSettings()
}
-catch as err {
+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 终止:ctrl + 2")
+doroGui.Add("Text", "R1", "初始化:ctrl + 3 调整窗口:ctrl + 4")
+doroGui.Add("Link", " R1", '项目地址')
+doroGui.SetFont()
+doroGui.Add("Button", "R1 x+10", "帮助").OnEvent("Click", ClickOnHelp)
+doroGui.Add("Button", "R1 x+10", "检查更新").OnEvent("Click", ClickOnCheckForUpdate)
+BtnClear := doroGui.Add("Button", "R1 x+10", "清空日志").OnEvent("Click", (*) => LogBox.Value := "")
+Tab := doroGui.Add("Tab3", "xm") ;由于autohotkey有bug只能这样写
+Tab.Add(["设置", "任务", "商店", "战斗", "奖励", "日志"])
+Tab.UseTab("设置")
+doroGui.SetFont("cred s10 Bold")
+doroGui.Add("Text", , "除非你知道自己在做什么,否则不要修改")
+doroGui.SetFont()
+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["sleepTime"], [750, 1000, 1250, 1500, 1750, 2000]).OnEvent("Change", (CtrlObj, Info) => ChangeNum("sleepTime", CtrlObj))
+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)
+Tab.UseTab("任务")
+AddCheckboxSetting(doroGui, "Shop", "商店购买", "R1.2")
+AddCheckboxSetting(doroGui, "SimulationRoom", "模拟室", "R1.2")
+AddCheckboxSetting(doroGui, "Arena", "竞技场", "R1.2 Section")
+AddCheckboxSetting(doroGui, "LoveTalking", "咨询妮姬", "R1.2 xs Section")
+AddCheckboxSetting(doroGui, "Tower", "无限之塔", "R1.2 xs")
+AddCheckboxSetting(doroGui, "Interception", "异常拦截", "R1.2 xs")
+AddCheckboxSetting(doroGui, "Award", "奖励收取", "R1.2 xs")
+Tab.UseTab("商店")
+doroGui.Add("Text", "R1.2 Section", "付费商店")
+AddCheckboxSetting(doroGui, "CashShop", "领取付费商店免费钻(进不了的别选)", "R1.2 xs+15")
+doroGui.Add("Text", "R1.2 xs Section", "普通商店")
+AddCheckboxSetting(doroGui, "NormalShop", "每日白嫖2次", "R1.2 xs+15")
+AddCheckboxSetting(doroGui, "NormalShopDust", "用信用点买芯尘盒", "R1.2 xs+15")
+AddCheckboxSetting(doroGui, "NormalShopPackage", "购买公司武器熔炉", "R1.2 xs+15")
+doroGui.Add("Text", " R1 xs", "竞技场商店")
+AddCheckboxSetting(doroGui, "BookFire", "燃烧", "R1.2 xs+15")
+AddCheckboxSetting(doroGui, "BookWater", "水冷", "R1.2 X+0.5")
+AddCheckboxSetting(doroGui, "BookWind", "风压", "R1.2 X+0.5")
+AddCheckboxSetting(doroGui, "BookElec", "电击", "R1.2 X+0.5")
+AddCheckboxSetting(doroGui, "BookIron", "铁甲", "R1.2 X+0.5")
+AddCheckboxSetting(doroGui, "BookBox", "购买代码手册宝箱", "R1.2 xs+15")
+AddCheckboxSetting(doroGui, "ArenaShopPackage", "购买简介个性化礼包", "R1.2 xs+15")
+AddCheckboxSetting(doroGui, "ArenaShopFurnace", "购买公司武器熔炉", "R1.2 xs+15")
+doroGui.Add("Text", "R1.2 xs Section", "废铁商店")
+AddCheckboxSetting(doroGui, "ScrapShopGem", "购买珠宝", "R1.2 xs+15")
+AddCheckboxSetting(doroGui, "ScrapShopVoucher", "购买全部好感券", "R1.2 xs+15")
+AddCheckboxSetting(doroGui, "ScrapShopResources", "购买全部养成资源", "R1.2 xs+15")
+Tab.UseTab("战斗")
+doroGui.Add("Text", "R1.2 Section", "竞技场")
+AddCheckboxSetting(doroGui, "RookieArena", "新人竞技场", "R1.2 XP+15 Y+M")
+AddCheckboxSetting(doroGui, "SpecialArena", "特殊竞技场", "R1.2 Y+M")
+AddCheckboxSetting(doroGui, "ChampionArena", "冠军竞技场(跟风竞猜)", "R1.2 Y+M")
+doroGui.Add("Text", "R1.2 xs Section", "异常拦截编队")
+doroGui.Add("DropDownList", "XP+15 Y+M Choose" InterceptionBossToLabel(), ["克拉肯(石),编队1", "镜像容器(手),编队2", "茵迪维利亚(衣),编队3", "过激派(头),编队4", "死神(脚),编队5"]).OnEvent("Change", (CtrlObj, Info) => ChangeNum("InterceptionBoss", CtrlObj))
+doroGui.Add("Text", "R1.2 xs Section", "模拟室(打5C,普通关卡需要快速战斗)")
+AddCheckboxSetting(doroGui, "SimulationOverClock", "模拟室超频(默认使用上次的tag)", "R1.2 XP+15 Y+M")
+doroGui.Add("Text", "R1.2 xs Section", "无限之塔")
+AddCheckboxSetting(doroGui, "CompanyTower", "尽可能地爬企业塔", "R1.2 xs+15")
+AddCheckboxSetting(doroGui, "UniversalTower", "尽可能地爬通用塔", "R1.2 xs+15")
+Tab.UseTab("奖励")
+doroGui.Add("Text", "R1.2 Section", "常规奖励")
+AddCheckboxSetting(doroGui, "OutpostDefence", "领取前哨基地防御奖励+1次免费歼灭", "R1.2 Y+M Section")
+AddCheckboxSetting(doroGui, "Expedition", "领取并重新派遣委托", "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")
+doroGui.Add("Text", "R1.2 Section", "限时奖励")
+AddCheckboxSetting(doroGui, "FreeRecruit", "活动期间每日免费招募", "R1.2")
+AddCheckboxSetting(doroGui, "RoadToVillain", "德雷克·反派之路", "R1.2")
+AddCheckboxSetting(doroGui, "Cooperate", "协同作战摆烂", "R1.2")
+AddCheckboxSetting(doroGui, "SoloRaid", "单人突击日常", "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["LoveTalking"]
+ LoveTalking()
+ 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["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["FreeRecruit"]
+ FreeRecruit()
+ if g_settings["RoadToVillain"]
+ RoadToVillain()
+ if g_settings["Cooperate"]
+ Cooperate()
+ if g_settings["SoloRaid"]
+ SoloRaid()
+ BackToHall
+ }
+ MsgBox "Doro完成任务!"
+ CalculateAndShowSpan()
+ if g_settings["OpenBlablalink"]
+ OpenBlablalink
+ if g_settings["SelfClosing"]
+ ExitApp
+ Pause
+}
;初始化
Initialization() {
global stdScreenW := 3840
@@ -108,7 +276,7 @@ Initialization() {
}
else {
; 没有找到该进程的窗口
- AddLog("没有找到进程为 '" . targetExe . "' 的窗口,初始化失败!")
+ MsgBox("没有找到进程为 '" . targetExe . "' 的窗口,初始化失败!")
Pause
}
nikkeID := winID
@@ -118,7 +286,122 @@ Initialization() {
scrRatio := NikkeH / stdScreenH ;确定nikke尺寸之于额定尺寸的比例(4K),主要影响点击
WinRatio := NikkeW / 2347 ;确定nikke尺寸之于额定nikke尺寸的比例(我是在nikke宽度2347像素的情况下截图的),主要影响识图
TrueRatio := currentScale * WinRatio
- AddLog("nikke坐标是:" NikkeX "," NikkeY "`n屏幕宽度是" A_ScreenWidth "`n屏幕高度是" A_ScreenHeight "`nnikke宽度是" NikkeW "`nnikke高度是" NikkeH "`n额定缩放比例是" scrRatio "`ndpi缩放比例是" currentScale "`n窗口缩放比例是" WinRatio "`n图片缩放系数是" TrueRatio)
+ AddLog("`nnikke坐标是:" NikkeX "," NikkeY "`n屏幕宽度是" A_ScreenWidth "`n屏幕高度是" A_ScreenHeight "`nnikke宽度是" NikkeW "`nnikke高度是" NikkeH "`ndpi缩放比例是" currentScale "`n窗口缩放比例是" WinRatio "`n图片缩放系数是" TrueRatio "`n缩放容忍度是" PicTolerance)
+}
+/**
+ * 添加一个与 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
+}
+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%的问题。
+ -如果你的电脑配置较好的话,或许可以尝试降低点击间隔。
+
+ )"
+}
+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) {
@@ -238,6 +521,85 @@ CheckAutoBattle() {
autoBurstOn := true ; 设置标志位,表示已尝试开启或已开启
}
}
+;添加日志
+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 := "") {
+ local logContent := LogBox.Value
+ local lines := StrSplit(logContent, "`n") ; 按换行符分割
+ local timestamps := []
+ local match := ""
+ ; 提取所有时间戳(格式 HH:mm:ss)
+ for line in lines {
+ if (RegExMatch(line, "^\d{2}:\d{2}:\d{2}(?=\s*-\s*)", &match)) {
+ timestamps.Push(match[])
+ }
+ }
+ ; 直接取最早(第1个)和最晚(最后1个)时间戳(日志已按时间顺序追加)
+ earliestTimeStr := timestamps[1]
+ latestTimeStr := timestamps[timestamps.Length]
+ ; 转换为秒数
+ earliestSeconds := TimeToSeconds(earliestTimeStr)
+ latestSeconds := TimeToSeconds(latestTimeStr)
+ ; 检查转换是否有效
+ if (earliestSeconds = -1 || latestSeconds = -1) {
+ AddLog("推算跨度失败:日志时间格式错误。")
+ return
+ }
+ ; 处理跨午夜情况(如 23:59:59 → 00:00:01)
+ if (latestSeconds < earliestSeconds) {
+ latestSeconds += 24 * 3600 ; 加上一天的秒数(86400)
+ }
+ ; 计算总时间差(秒)
+ spanSeconds := latestSeconds - earliestSeconds
+ spanMinutes := Floor(spanSeconds / 60)
+ remainingSeconds := Mod(spanSeconds, 60)
+ ; 格式化输出
+ outputText := "Doro已帮你节省时间: "
+ if (spanMinutes > 0) {
+ outputText .= spanMinutes " 分 "
+ }
+ outputText .= remainingSeconds " 秒"
+ ; 添加到日志
+ AddLog(outputText)
+ MsgBox outputText
+}
+OpenBlablalink() {
+ Run("https://www.blablalink.com/")
+}
;点左下角的小房子的对应位置的右边(不返回)
Confirm() {
stdTargetX := 474
@@ -246,6 +608,7 @@ Confirm() {
AddLog("点击默认位置(" Round(stdTargetX * scrRatio) "," Round(stdTargetY * scrRatio) ")")
Sleep 500
}
+;按Esc
GoBack() {
AddLog("返回")
Send "{Esc}"
@@ -338,6 +701,7 @@ BackToHall() {
stdTargetX := 333
stdTargetY := 2041
UserClick(stdTargetX, stdTargetY, scrRatio)
+ Sleep 500
}
if !WinActive(nikkeID) {
MsgBox "窗口未聚焦,程序已终止"
@@ -472,7 +836,7 @@ NormalShop() {
AddLog("没有可白嫖的东西")
}
Text := "|<芯尘盒>*174$62.1UM00k00600wD00S003k0Tzw1ba03z0Tzzkxvk3zwDzzwSSy3zztzzyDbbnzzz3mw7lsyzzzUNq1sS77zzk0w0A7UUTzs07U00k07zy0RsE0S01zzVzDS07U0DzkTn7Vzzs7zy7w1sTzy3zzlz0D7zzUzzwxkTk1s0DzzDSDw0S03zzkbzkTzzvzzz1zs7zzyzzzk7w1zzzjzzy"
- if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) {
+ if (ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) and g_settings["NormalShopDust"] {
AddLog("点击芯尘盒")
FindText().Click(X, Y, "L")
Text := "|<信用点的图标>*169$29.000k0001s000Tk001vk007Xk00TDk03znk0DzDU0zyTU7zzz0Tzzz1zzzz7zzzwjzzxnDzzy6Dzzs0TzvU8zzy09zzk0DTr00DzQ00TxU00Te000Ts000RU000Q0000E004"
@@ -754,7 +1118,7 @@ SimulationRoom() {
AddLog("===模拟室任务开始===")
AddLog("查找模拟室入口")
Text := "|<方舟中的模拟室>*121$58.zzzzzzzzjz727lrszsTwM0D6DXU00lU0wM6A0023070UMk00040Q01XXzkUU0k80D00D603lW1y00w80D6A7w67UU0w8wTU0C00303lw00M00Q2D7s0n0k1kM0Da7A603lU0w00EM07603k01lk0wM07i2D703V20M00AEA4Csl000lXsszni003jzzzzzzzzs"
- if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) {
+ 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
@@ -951,14 +1315,17 @@ RookieArena() {
}
AddLog("检测免费次数")
Text免费 := "|<免费>*186$36.wTzy4Ls0zk01k0zz4FVkzk01103k03003k00U1Xk00XXXwQMnXXUQFk03k03k03s03z0zszXy8zslXwMtsXXksts671s1UC0bw3UzsU"
- while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text免费, , , , , , 3, TrueRatio, TrueRatio)) { ;3代表从下往上找
- AddLog("有免费次数,尝试进入战斗")
- FindText().Click(X, Y, "L")
- Sleep sleepTime
+ while True {
+ while (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text免费, , , , , , 3, TrueRatio, TrueRatio)) { ;3代表从下往上找
+ AddLog("有免费次数,尝试进入战斗")
+ FindText().Click(X, Y, "L")
+ Sleep sleepTime
+ }
+ else break
Text := "|*185$32.z7zzyT0TjzXU1szsksC7y8zXUzWDwM7s7z60S1zlX3UTwMsMbz6D08zVXs27kszUk0SDwC0DXzXs7szzU"
- if !(ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) {
+ if !(ok := FindText(&X := "wait", &Y := 2, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) {
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, , , , , TrueRatio, TrueRatio)) {
+ 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
@@ -1127,46 +1494,14 @@ LoveTalking() {
}
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)) {
- FindText().Click(X, Y, "L")
AddLog("下一个妮姬")
+ FindText().Click(X, Y, "L")
+ Sleep 500
}
}
AddLog("===妮姬咨询任务结束===")
BackToHall
}
-; 通用塔
-UniversalTower() {
- EnterToArk
- AddLog("===通用塔任务开始===")
- Text := "|<无限之塔>*125$79.zzzzzzzzDznlns00Q00Dz3zsU0Q00C007zkzwE0600703Xs01y807z7zYE1s00S32DzXzk80w00C1k7zVzsA0Tzw70s7U00A26Dzy7kk0k006N07zy7wEM4007A03zy7y007w1za05zy7z40Ty0zl0UTw7zXzzy0Ts0MDw7zkU1y4CQ2ADsDzk00y376T67kDzk8QS3U3DU1k3zMQCA3k3bUME007y077s1nsCQw07z03zzztzzzzkDzntk"
- 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 := "|<塔内的无限之塔>*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
- }
- 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
- }
- AddLog("===通用塔任务结束===")
- BackToHall
-}
; 企业塔
CompanyTower() {
EnterToArk
@@ -1235,13 +1570,46 @@ CompanyTower() {
AddLog("===企业塔任务结束===")
BackToHall
}
+; 通用塔
+UniversalTower() {
+ 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
+ }
+ 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
+ }
+ 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
+ }
+ AddLog("===通用塔任务结束===")
+ BackToHall
+}
; 异常拦截
Interception() {
BackToHall
EnterToArk
AddLog("===异常拦截任务开始===")
Text := "|<拦截战>*200$57.nnnzDDzbxyTSz0NbwzBnvbyDCzbxkD8ztszw7j0U1k00TXxyQ0C003wz0nzzxrbzbkSTzzYxzwzjlzzs1az3xo7zy4Qbk7Y3k3k3UywwCTzz0QDrrVnzzsXXyyySTzz0QTrrXnzztbXSQsSM0D0E3k20b01s0MSQH4"
- if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) {
+ 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
}
@@ -1382,7 +1750,7 @@ OutpostDefence() {
Sleep sleepTime
}
Text := "|<免费一举歼灭的红点>*194$67.000000000C0000000000zs000000000sD000000001k1k00000001kwQ00000000lz600000000lzlU0000000tzwk0000000Rzy80000000QzzbzzzzzzzyTzm00000003Dzt00000000nztU0000000Nzwk00000004TwM000000017wM00000000k0M00000000A0M000000001zs0000000007s0000000003k0000000001U0000000000k0000000000M0000000000A0E"
- if (ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) {
+ 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"
@@ -1453,40 +1821,6 @@ Expedition() {
AddLog("===派遣委托任务结束===")
BackToHall
}
-;排名奖励
-RankingReward() {
- EnterToArk()
- AddLog("===排名奖励任务开始===")
- Text := "|<带红点的奖杯>*200$56.zzzzzzzyDzzzzzzzw0zzzzzzzwTXzzzzzzzDwTzzzzzzbzbzzzzzzvzwzzzzzzyzzDzzzzzzDznzzzzzznzwzzzzzzyzzDzzzzzzbznzzzzzztztz00000zDwTk0000DkyDw00003y07z00000zwDy000001zzz0000007zzXU0000tzzls0000TDzwy00007nzzDU0001wzzns0000TDzwy00007nzzDU0001wzzns0000TDzwS00007nzzbU0001tzzsw0000QTzz30000ADzzs000007zzz000003zzzy00003zzzzs0007zzzzz0003zzzzzs000zzzzzy000Tzzzzzk00Dzzzzzy007zzzzzzs07zzzzzzzU7zzzzzzzs1zzzzzzzz0Tzzzzzzzk7zzzzzzzw1zzzzzzzz0TzzzzzzzU7zzzzzzzs1zzzzzzzk03zzzzzy0001zzzzz0000DzzzU"
- 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
- 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")
- 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
- }
- }
- AddLog("===排名奖励任务结束===")
- BackToHall
-}
; 好友点数收取
FriendPoint() {
BackToHall
@@ -1528,6 +1862,41 @@ Mail() {
AddLog("===邮箱任务结束===")
BackToHall
}
+;排名奖励
+RankingReward() {
+ EnterToArk()
+ AddLog("===排名奖励任务开始===")
+ Text := "|<带红点的奖杯>*200$56.zzzzzzzyDzzzzzzzw0zzzzzzzwTXzzzzzzzDwTzzzzzzbzbzzzzzzvzwzzzzzzyzzDzzzzzzDznzzzzzznzwzzzzzzyzzDzzzzzzbznzzzzzztztz00000zDwTk0000DkyDw00003y07z00000zwDy000001zzz0000007zzXU0000tzzls0000TDzwy00007nzzDU0001wzzns0000TDzwy00007nzzDU0001wzzns0000TDzwS00007nzzbU0001tzzsw0000QTzz30000ADzzs000007zzz000003zzzy00003zzzzs0007zzzzz0003zzzzzs000zzzzzy000Tzzzzzk00Dzzzzzy007zzzzzzs07zzzzzzzU7zzzzzzzs1zzzzzzzz0Tzzzzzzzk7zzzzzzzw1zzzzzzzz0TzzzzzzzU7zzzzzzzs1zzzzzzzk03zzzzzy0001zzzzz0000DzzzU"
+ if (ok := FindText(&X := "wait", &Y := 3, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.05 * PicTolerance, 0.05 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) {
+ 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")
+ 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() {
stdTargetX := 3341
@@ -1595,25 +1964,6 @@ Pass() {
}
}
}
- 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
- }
- }
- }
}
OnePass() { ;执行一次通行证
stdTargetX := 3633
@@ -1693,13 +2043,13 @@ 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每天免费, , , , , , , TrueRatio, TrueRatio)) {
+ 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, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text每天免费, , , , , , , TrueRatio, TrueRatio)) {
+ 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 := 1.5, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.3 * PicTolerance, 0.3 * PicTolerance, Text每日免费, , 0, , , , , TrueRatio, TrueRatio)) {
+ 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()
@@ -1750,7 +2100,7 @@ RoadToVillain() {
}
}
Text := "|<灰色的全部领取>*170$81.zrzzbzzxzzzzzzwTzwz0zDU707zzVzw0s7sy0s107lbz07Qy3xzbA0wSDwsvbrDjwvX67szrjRww0DUSw1zUytvD9wsw3rcDw7nDPzjjbaSNs07s0PDxxgwvnDwDz03Rw3hbaTNznzzzvbkBgw3sTyTzzzQznhbWT3w0Dw0vbyRgwlwTU1zU7QzrVba7Xznzwwv7kzDs0sTyTzjbNyDsz0C1znzwsvztyNzlX400DU7TzbbbzQwU"
- while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1 * PicTolerance, 0.1 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) {
+ while !(ok := FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2 * PicTolerance, 0.2 * PicTolerance, Text, , 0, , , , , TrueRatio, TrueRatio)) {
AddLog("点击全部领取")
UserClick(1921, 1994, scrRatio)
Sleep 200
@@ -1892,350 +2242,6 @@ SoloRaid() {
AddLog("===单人突击任务结束===")
BackToHall
}
-; 通用函数,用于切换 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
-}
-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(*) {
- 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["LoveTalking"]
- LoveTalking()
- 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["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["FreeRecruit"]
- FreeRecruit()
- if g_settings["RoadToVillain"]
- RoadToVillain()
- if g_settings["Cooperate"]
- Cooperate()
- if g_settings["SoloRaid"]
- SoloRaid()
- BackToHall
- }
- MsgBox "Doro完成任务!"
- CalculateAndShowSpan()
- if g_settings["SelfClosing"]
- ExitApp
- Pause
-}
-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)
-}
-/**
- * 添加一个与 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 ; 或者抛出错误
- }
- ; 构建选项字符串,确保 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
-}
-;创建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 终止:ctrl + 2")
-doroGui.Add("Text", "R1", "初始化:ctrl + 3 调整窗口:ctrl + 4")
-doroGui.Add("Link", " R1", '项目地址')
-doroGui.SetFont()
-doroGui.Add("Button", "R1 x+10", "帮助").OnEvent("Click", ClickOnHelp)
-doroGui.Add("Button", "R1 x+10", "检查更新").OnEvent("Click", ClickOnCheckForUpdate)
-BtnClear := doroGui.Add("Button", "R1 x+10", "清空日志").OnEvent("Click", (*) => LogBox.Value := "")
-Tab := doroGui.Add("Tab3", "xm") ;由于autohotkey有bug只能这样写
-Tab.Add(["设置", "任务", "商店", "战斗", "奖励", "日志"])
-Tab.UseTab("设置")
-doroGui.SetFont("cred s10 Bold")
-doroGui.Add("Text", , "除非你知道自己在做什么,否则不要修改")
-doroGui.SetFont()
-AddCheckboxSetting(doroGui, "AutoCheckUpdate", "自动检查更新(确保能连上github)", "R1.2")
-AddCheckboxSetting(doroGui, "SelfClosing", "任务完成后自动关闭程序", "R1.2")
-doroGui.Add("Text", , "点击间隔(毫秒)")
-doroGui.Add("DropDownList", "Choose" g_numeric_settings["sleepTime"], [750, 1000, 1250, 1500, 1750, 2000]).OnEvent("Change", (CtrlObj, Info) => ChangeNum("sleepTime", CtrlObj))
-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)
-Tab.UseTab("任务")
-AddCheckboxSetting(doroGui, "Shop", "商店购买", "R1.2")
-AddCheckboxSetting(doroGui, "SimulationRoom", "模拟室", "R1.2")
-AddCheckboxSetting(doroGui, "Arena", "竞技场", "R1.2 Section")
-AddCheckboxSetting(doroGui, "LoveTalking", "咨询妮姬", "R1.2 xs Section") ; 注意 Section 选项用法(保存此控件位置并定义一个新控件段)
-AddCheckboxSetting(doroGui, "Tower", "无限之塔", "R1.2 xs")
-AddCheckboxSetting(doroGui, "Interception", "异常拦截", "R1.2 xs")
-AddCheckboxSetting(doroGui, "Award", "奖励收取", "R1.2 xs")
-Tab.UseTab("商店")
-doroGui.Add("Text", "R1.2 Section", "付费商店")
-AddCheckboxSetting(doroGui, "CashShop", "领取付费商店免费钻(进不了商店的别选)", "R1.2 xs+15")
-doroGui.Add("Text", "R1.2 xs Section", "普通商店")
-AddCheckboxSetting(doroGui, "NormalShop", "每日白嫖2次", "R1.2 xs+15")
-AddCheckboxSetting(doroGui, "NormalShopDust", "用信用点买芯尘盒", "R1.2 xs+15")
-doroGui.Add("Text", " R1 xs", "竞技场商店")
-AddCheckboxSetting(doroGui, "BookFire", "燃烧", "R1.2 xs+15")
-AddCheckboxSetting(doroGui, "BookWater", "水冷", "R1.2 X+0.5")
-AddCheckboxSetting(doroGui, "BookWind", "风压", "R1.2 X+0.5")
-AddCheckboxSetting(doroGui, "BookElec", "电击", "R1.2 X+0.5")
-AddCheckboxSetting(doroGui, "BookIron", "铁甲", "R1.2 X+0.5")
-AddCheckboxSetting(doroGui, "BookBox", "购买代码手册宝箱", "R1.2 xs+15")
-AddCheckboxSetting(doroGui, "ArenaShopPackage", "购买简介个性化礼包", "R1.2 xs+15")
-AddCheckboxSetting(doroGui, "ArenaShopFurnace", "购买公司武器熔炉", "R1.2 xs+15")
-doroGui.Add("Text", "R1.2 xs Section", "废铁商店")
-AddCheckboxSetting(doroGui, "ScrapShopGem", "购买珠宝", "R1.2 xs+15")
-AddCheckboxSetting(doroGui, "ScrapShopVoucher", "购买全部好感券", "R1.2 xs+15")
-AddCheckboxSetting(doroGui, "ScrapShopResources", "购买全部养成资源", "R1.2 xs+15")
-Tab.UseTab("战斗")
-doroGui.Add("Text", "R1.2 Section", "竞技场")
-AddCheckboxSetting(doroGui, "RookieArena", "新人竞技场", "R1.2 XP+15 Y+M")
-AddCheckboxSetting(doroGui, "SpecialArena", "特殊竞技场", "R1.2 Y+M")
-AddCheckboxSetting(doroGui, "ChampionArena", "冠军竞技场(跟风竞猜)", "R1.2 Y+M")
-doroGui.Add("Text", "R1.2 xs Section", "异常拦截编队")
-doroGui.Add("DropDownList", "XP+15 Y+M Choose" InterceptionBossToLabel(), ["克拉肯(石),编队1", "镜像容器(手),编队2", "茵迪维利亚(衣),编队3", "过激派(头),编队4", "死神(脚),编队5"]).OnEvent("Change", (CtrlObj, Info) => ChangeNum("InterceptionBoss", CtrlObj))
-doroGui.Add("Text", "R1.2 xs Section", "模拟室(打5C,普通关卡需要快速战斗)")
-AddCheckboxSetting(doroGui, "SimulationOverClock", "模拟室超频(默认使用上次的tag)", "R1.2 XP+15 Y+M")
-doroGui.Add("Text", "R1.2 xs Section", "无限之塔")
-AddCheckboxSetting(doroGui, "CompanyTower", "尽可能地爬企业塔", "R1.2 xs+15")
-AddCheckboxSetting(doroGui, "UniversalTower", "尽可能地爬通用塔", "R1.2 xs+15")
-Tab.UseTab("奖励")
-AddCheckboxSetting(doroGui, "OutpostDefence", "领取前哨基地防御奖励+1次免费歼灭", "R1.2 Section")
-AddCheckboxSetting(doroGui, "Expedition", "领取并重新派遣委托", "R1.2 xs+15")
-AddCheckboxSetting(doroGui, "FriendPoint", "好友点数收取", "R1.2 xs")
-AddCheckboxSetting(doroGui, "Mail", "邮箱收取", "R1.2")
-AddCheckboxSetting(doroGui, "RankingReward", "方舟排名奖励", "R1.2 xs")
-AddCheckboxSetting(doroGui, "Mission", "任务收取", "R1.2")
-AddCheckboxSetting(doroGui, "Pass", "通行证收取", "R1.2")
-AddCheckboxSetting(doroGui, "FreeRecruit", "活动期间每日免费招募", "R1.2")
-AddCheckboxSetting(doroGui, "RoadToVillain", "德雷克·反派之路", "R1.2")
-AddCheckboxSetting(doroGui, "Cooperate", "协同作战摆烂", "R1.2")
-AddCheckboxSetting(doroGui, "SoloRaid", "单人突击日常", "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()
-;添加日志
-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 := "") {
- local logContent := LogBox.Value
- local lines := StrSplit(logContent, "`n") ; 按换行符分割
- local timestamps := []
- local match := ""
- ; 提取所有时间戳(格式 HH:mm:ss)
- for line in lines {
- if (RegExMatch(line, "^\d{2}:\d{2}:\d{2}(?=\s*-\s*)", &match)) {
- timestamps.Push(match[])
- }
- }
- ; 直接取最早(第1个)和最晚(最后1个)时间戳(日志已按时间顺序追加)
- earliestTimeStr := timestamps[1]
- latestTimeStr := timestamps[timestamps.Length]
- ; 转换为秒数
- earliestSeconds := TimeToSeconds(earliestTimeStr)
- latestSeconds := TimeToSeconds(latestTimeStr)
- ; 检查转换是否有效
- if (earliestSeconds = -1 || latestSeconds = -1) {
- AddLog("推算跨度失败:日志时间格式错误。")
- return
- }
- ; 处理跨午夜情况(如 23:59:59 → 00:00:01)
- if (latestSeconds < earliestSeconds) {
- latestSeconds += 24 * 3600 ; 加上一天的秒数(86400)
- }
- ; 计算总时间差(秒)
- spanSeconds := latestSeconds - earliestSeconds
- spanMinutes := Floor(spanSeconds / 60)
- remainingSeconds := Mod(spanSeconds, 60)
- ; 格式化输出
- outputText := "Doro已帮你节省时间: "
- if (spanMinutes > 0) {
- outputText .= spanMinutes " 分 "
- }
- outputText .= remainingSeconds " 秒"
- ; 添加到日志
- AddLog(outputText)
- MsgBox outputText
-}
^1:: {
ExitApp
}
@@ -2253,7 +2259,7 @@ CalculateAndShowSpan(ExitReason := "", ExitCode := "") {
;调试指定函数
^0:: {
;添加基本的依赖
- Initialization()
+ ; Initialization()
;下面写要调试的函数
- ChampionArena()
+ OpenBlablalink
}
diff --git a/lib/FindText.ahk b/lib/FindText.ahk
index 30cb9f5..c9472cc 100644
--- a/lib/FindText.ahk
+++ b/lib/FindText.ahk
@@ -3030,6 +3030,7 @@ int __attribute__((__stdcall__)) PicFind(
. "`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)){"