private void CatchData_GetData_Click(object sender, EventArgs e) { CatchData = new DataJudge("0,0 @ 000000", "CatchData"); CatchData_GetDataShow.Text = ""; try { CatchData.XYToStr = CatchData_CatchXY.Text; CatchData_GetDataShow.Text += CatchData.XYToStr + " @ "; string[] wh = CatchData_CatchWH.Text.Split(','); CatchData.Color = FunctionBitmap.GetColorData(new Bitmap(CatchData_GamePicture.Image), CatchData.XYToStr, Convert.ToInt32(wh[0]), Convert.ToInt32(wh[1])); CatchData_GetDataShow.Text += CatchData.Color; } catch (Exception) { CatchData_GetDataShow.Text = "颜色信息获取失败,请检查" + Environment.NewLine + " 1.是否成功获取游戏窗口" + Environment.NewLine + " 2.数值输入是否错误"; } }
/// <summary> /// 判断给定数据和图像中的颜色数据是否一样(相似) /// </summary> /// <param name="data">需要判定的数据</param> /// <param name="rin">容许色差阈值(0~441)</param> /// <param name="OffsetX">X坐标偏移</param> /// <param name="OffsetY">Y坐标偏移</param> /// <returns></returns> public static bool Judge(DataJudge data, Bitmap bitmap = null, int rin = 0, int OffsetX = 0, int OffsetY = 0) { if (data == null) { throw new Exceptions.DataErrorException("给定的判定数据为 null !"); } if (GlobalObject.GameHandle.IsSuccess) { if (bitmap == null) { bitmap = GameHandle.GetGameBitmap(); } return(Judge(bitmap, data, rin, OffsetX, OffsetY)); } else { throw new Exceptions.NoGameHandleException(); } }
/// <summary> /// 判断给定数据和图像中的颜色数据是否一样(相似) /// </summary> /// <param name="bmp">需要判断的游戏图像</param> /// <param name="data">需要判定的数据</param> /// <param name="rin">容许色差阈值(0~441)</param> /// <param name="OffsetX">X坐标偏移</param> /// <param name="OffsetY">Y坐标偏移</param> /// <returns></returns> private static bool Judge(Bitmap bmp, DataJudge data, int rin = 0, int OffsetX = 0, int OffsetY = 0) { lock (_locked) { // 更改ui控件显示 GlobalObject.GetUIForm().ChangeJudgeCoordinate(data.XYToStr, 2); Delay(Random(2, 10)); try { DataJudge DecisionData = new DataJudge($"{(data.XY.X + OffsetX).ToString()},{(data.XY.Y + OffsetY).ToString()} @ {FunctionBitmap.GetColorData(bmp, $"{(data.XY.X + OffsetX).ToString()},{(data.XY.Y + OffsetY).ToString()}", data.Width, data.Height)}", "取得数据-" + data.Name); if (!DecisionData.ColorCollection.IsExist()) { throw new Exceptions.DataErrorException("从图像中提取的颜色集合数据错误!"); } else if ((DecisionData.ColorCollection.X != data.ColorCollection.X) || (DecisionData.ColorCollection.Y != data.ColorCollection.Y)) { throw new Exceptions.DataErrorException("从图像中提取的颜色集合与给定的判定数据大小不符合!"); } for (int y = 0; y < DecisionData.ColorCollection.Y; y++) { for (int x = 0; x < DecisionData.ColorCollection.X; x++) { if (!IsSimilarColor(DecisionData.ColorCollection[x, y], data.ColorCollection[x, y], rin)) { return(false); } } } Delay(Random(2, 10)); return(true); } finally { GlobalObject.GetUIForm().ChangeJudgeCoordinate(data.XYToStr, 1); } } }
/// <summary> /// 超时系统 /// </summary> public void OvertimeProcess() { Delay(200); if (Judge(DataJudgePonds.母港1)) { return; } DateTime Pt = DateTime.Now;//超时时刻 TimeSpan Ptm = TimeSpan.Zero; Set_AddMessage("判定已超时。"); Set_ChangeStatus($"{ExecutedNumber}:Lua 脚本判定已超时 {((int)Ptm.TotalSeconds).ToString()} 秒", Color.White, Color.Red); var 战斗中 = new DataJudge("387,3 @ 2DA9D7|41B8D3|5DC1D0", "战斗中"); var 夜战中 = new DataJudge("386,6 @ 4EABCF|247A9C|004968", "夜战中"); var 罗盘娘 = new DataJudge("398,128 @ 72706C|1B1915|191713|AFADA9", "罗盘娘"); var 成果1 = new DataJudge("85,78 @ 24292C|FFF6F2|FFF6F2|FFF6F2|24292C", "成果1"); var 成果2 = new DataJudge("49,78 @ 24292C|FFF6F2|FFF6F2|FFF6F2|24292C", "成果2"); var 舰船掉落 = new DataJudge("756,437 @ 36A7AA|D3E3E3|72B9BA", "舰船掉落"); var 旗舰大破 = new DataJudge("673,86 @ A2514D|FFD6D3|AF7879|8C343B", "旗舰大破"); var 道具掉落 = new DataJudge("758,436 @ 2C989B|BCD0D1|A1C3C5|169396", "道具掉落(非舰船掉落)"); var 追击与夜战突入 = new DataJudge("52,33 @ 1DBDC0|222D30|1F7073|1DBDC0", "不追击与夜战突入"); var 进击与撤退 = new DataJudge("267,235 @ 718889|6A8A90|92B2BA", "进击与撤退"); var 择阵型 = new DataJudge("442,184 @ FFF6F2|5C8F8E|D2D7D4", "选择阵型"); var 择阵型摁下 = new DataJudge("442,184 @ FFF6F2|ED9A53|F9DAC6", "选择阵型(已摁下)"); var 入渠舰船确认 = new DataJudge("495,397 @ 1E8786|80AEAC|FFF6F2", "舰船确认"); while (true) { if (IsDisposed) { this.Thread.Abort(); // 检测线程是否被关闭 } Delay(1000); if (IsDisposed) { this.Thread.Abort(); } Ptm = DateTime.Now - Pt; Set_ChangeStatus($"{ExecutedNumber}:Lua 脚本判定已超时 {((int)Ptm.TotalSeconds).ToString()} 秒", Color.White, Color.Red); if (Judge(DataJudgePonds.母港1)) { Delay(200); Set_AddMessage($"超时检测已结束,共超时: {((int)Ptm.TotalSeconds).ToString()}秒。"); return; } else if (Judge(DataJudgePonds.远征回港) || Judge(DataJudgePonds.远征归来1) || Judge(DataJudgePonds.远征归来2)) { Click(DataClickPonds.舰娘立绘); continue; } Delay(200); if (Judge(DataJudgePonds.左侧返回母港1) || Judge(DataJudgePonds.左侧返回母港2)) { Click(new DataClick("60,223|86,292", "左侧返回母港")); continue; } else if (Judge(战斗中) || Judge(夜战中)) { continue; } Delay(200); // 战斗地图中 if (Judge(罗盘娘) || Judge(成果1) || Judge(成果2) || Judge(舰船掉落, null, 200) || Judge(旗舰大破) || Judge(道具掉落)) { Click(DataClickPonds.舰娘立绘); continue; } Delay(200); if (Judge(追击与夜战突入)) { Click(new DataClick("285,208|239,236|249,270|298,277|341,246|331,209", "追撃せず")); continue; } else if (Judge(进击与撤退)) { Click(new DataClick("500,208|460,239|467,271|516,277|552,246|546,214", "撤退")); continue; } // 入渠 if (Judge(入渠舰船确认)) { Click(new DataClick("288,394|342,406", "入渠确认否")); } // 例外,将关闭线程 if (Judge(择阵型) || Judge(择阵型摁下)) { Set_AddMessage("脚本遇到了侵蚀鱼雷的袭击已被击沉。"); this.StopThread(); } } }
/// <summary> /// 检测进击时是否有破损船 /// </summary> /// <param name="GroupMember"></param> /// <param name="DetectionStatus"></param> /// <returns></returns> public bool AdvancingDamagedReadiness(LuaTable GroupMember, int DetectionStatus) { using (Bitmap bmp = new Bitmap(this.GetGameBitmap)) { if (!(Judge(new DataJudge("49,78 @ 24292C|FFF6F2|FFF6F2|FFF6F2|24292C", "成果2"), bmp) && Judge(new DataJudge("762,443 @ CDDADB", "出击成果可点"), bmp, 80))) { throw new Exceptions.TimeOutException("进击检测破损页面判定异常错误!!"); } var 进击大破1 = new DataJudge(new List <DataJudge>() { new DataJudge("312,208 @ 99403B|8D3834", "大破1"), new DataJudge("312,208 @ A94530|A14029", "黄脸大破1"), new DataJudge("312,208 @ A93430|A12D29", "红脸大破1"), }); var 进击大破2 = new DataJudge(new List <DataJudge>() { new DataJudge("317,194 @ A94B46", "大破2"), new DataJudge("317,194 @ BD5034", "黄脸大破2"), new DataJudge("317,194 @ BD3734", "红脸大破2"), }); var 进击中破1 = new DataJudge(new List <DataJudge>() { new DataJudge("312,202 @ FDBA5C|FDBA5C", "中破1"), new DataJudge("312,202 @ FBA94B|FBA84A", "黄脸中破1"), new DataJudge("312,202 @ FB984B|FB954A", "红脸中破1"), }); var 进击中破2 = new DataJudge(new List <DataJudge>() { new DataJudge("315,192 @ FFBC5D|FDBA5C", "中破2"), new DataJudge("315,192 @ FDA848|FBA446", "黄脸中破2"), new DataJudge("315,192 @ FD9248|F98C45", "红脸中破2"), }); var 进击小破1 = new DataJudge(new List <DataJudge>() { new DataJudge("318,197 @ F7E25A|F6E159", "小破1"), new DataJudge("318,197 @ F7BF42|F6BD3F", "黄脸小破1"), new DataJudge("318,197 @ F7A542|F6A13F", "红脸小破1"), }); var 进击小破2 = new DataJudge(new List <DataJudge>() { new DataJudge("320,212 @ ECD856", "小破2"), new DataJudge("320,212 @ EFB43C", "黄脸小破2"), new DataJudge("320,212 @ EF973C", "红脸小破2"), }); for (int j = 0; j < GroupMember.Keys.Count; j++) { if ((bool)GroupMember[j + 1]) { if (DetectionStatus <= 3) { for (int k = 0; k < 3; k++) { if (Judge(进击大破1[k], bmp, 0, 0, 45 * j) && Judge(进击大破2[k], bmp, 0, 0, 45 * j)) { return(false); } } } if (DetectionStatus <= 2) { for (int k = 0; k < 3; k++) { if (Judge(进击中破1[k], bmp, 0, 0, 45 * j) && Judge(进击中破2[k], bmp, 0, 0, 45 * j)) { return(false); } } } if (DetectionStatus <= 1) { for (int k = 0; k < 3; k++) { if (Judge(进击小破1[k], bmp, 0, 0, 45 * j) && Judge(进击小破2[k], bmp, 0, 0, 45 * j)) { return(false); } } } } } } return(true); }