| | |
| | | using RichCreator.Utility.Maps; |
| | | using RichCreator.Utility.Structs; |
| | | using RichCreator.Utility.Utilitys; |
| | | using RichCreator.Utilitys; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Threading; |
| | |
| | | /// <summary> |
| | | /// 卡勒特地图 |
| | | /// </summary> |
| | | public class KaleteMap : MapInfo |
| | | public class KaleteMap : ShikongzhimenMapBase |
| | | { |
| | | public KaleteMap(ZTRectangle gameRect, CancellationToken cancelToken) : base(MapType.Lingdong, gameRect, cancelToken) |
| | | { |
| | | this.MiniMap = new KaleteMiniMap(gameRect); |
| | | this.Role = new DnfRole(gameRect); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// NextIndex=-2,出错 |
| | | /// </summary> |
| | | private static readonly HouseInfo[] Houses = new HouseInfo[] { |
| | | new HouseInfo (0 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } }, |
| | | new HouseInfo (1 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } }, |
| | | new HouseInfo (2 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } }, |
| | | new HouseInfo (3 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } }, |
| | | new HouseInfo (4 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } }, |
| | | new HouseInfo (5 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } }, |
| | | new HouseInfo (6 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } }, |
| | | new HouseInfo (7 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } }, |
| | | new HouseInfo (8 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-148,DoorDirection=new[]{Direction.Bottom } }, |
| | | new HouseInfo (9 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-300,DoorDirection=new[]{Direction.Left} }, |
| | | new HouseInfo (10,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } }, |
| | | new HouseInfo (11,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } }, |
| | | new HouseInfo (12,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-220,DoorDirection=new[]{Direction.Bottom } }, |
| | | new HouseInfo (13,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-320,DoorDirection=new[]{Direction.Left } }, |
| | | new HouseInfo (14,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-320,DoorDirection=new[]{Direction.Right } }, |
| | | new HouseInfo (15,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } }, |
| | | new HouseInfo (16,MapType.Lingdong,true ,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Up } }, |
| | | new HouseInfo (17,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } }, |
| | | new HouseInfo (18,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Up } }, |
| | | new HouseInfo (19,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Up } } |
| | | new HouseInfo (0 ,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (1 ,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (2 ,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (3 ,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (4 ,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (5 ,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (6 ,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (7 ,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (8 ,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},new int[]{20,21,22,23 }), |
| | | new HouseInfo (9 ,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (10,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (11,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (12,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (13,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (14,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (15,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (16,MapType.Kalete,true ,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (17,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (18,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null), |
| | | new HouseInfo (19,MapType.Kalete,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X},null) |
| | | }; |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 角色 |
| | | /// </summary> |
| | | public DnfRole Role { get; set; } |
| | | |
| | | |
| | | private Int32 runningStep = RunningStep.None; |
| | | |
| | |
| | | switch (houseIndex) |
| | | { |
| | | case 0: |
| | | this.Role.SyncMove(new ZTPoint(550, 0)); |
| | | this.Role.ReleaseSkill(HIDCode.R, 1000); |
| | | this.Role.ReleaseSkill(HIDCode.E, 1000); |
| | | this.Role.SyncMove(new ZTPoint(297, 0)); |
| | | this.Role.ReleaseSkill(HIDCode.R); |
| | | this.Role.ReleaseSkill(HIDCode.E); |
| | | |
| | | break; |
| | | case 1: |
| | | this.Role.SyncMove(new ZTPoint(300, 0)); |
| | | this.Role.ReleaseSkill(HIDCode.Q, 1300); |
| | | this.Role.ReleaseSkill(HIDCode.W, 1000); |
| | | this.Role.SyncMove(new ZTPoint(241, 0)); |
| | | this.Role.ReleaseSkill(HIDCode.Q); |
| | | this.Role.ReleaseSkill(HIDCode.W); |
| | | break; |
| | | case 6: |
| | | this.Role.SyncMove(new ZTPoint(448, 94)); |
| | | this.Role.ReleaseSkill(HIDCode.G, 0); |
| | | this.Role.SyncMove(new ZTPoint(139, 90)); |
| | | this.Role.ReleaseSkill(HIDCode.G); |
| | | break; |
| | | case 7: |
| | | this.Role.SyncMove(new ZTPoint(530, 0)); |
| | | this.Role.ReleaseSkill(HIDCode.R, 0); |
| | | this.Role.SyncMove(new ZTPoint(330, 90)); |
| | | this.Role.ReleaseSkill(HIDCode.R); |
| | | break; |
| | | case 8: |
| | | this.Role.SyncMove(new ZTPoint(453, 0)); |
| | | this.Role.ReleaseSkill(HIDCode.H, 0); |
| | | this.Role.SyncMove(new ZTPoint(305, 0)); |
| | | this.Role.ReleaseSkill(HIDCode.H); |
| | | break; |
| | | case 13: |
| | | this.Role.SyncMove(new ZTPoint(-100, 203)); |
| | | this.Role.ReleaseSkill(HIDCode.Q, 1300); |
| | | this.Role.ReleaseSkill(HIDCode.E, 0); |
| | | this.Role.SyncMove(new ZTPoint(-104, 82)); |
| | | this.Role.ReleaseSkill(HIDCode.Q); |
| | | this.Role.ReleaseSkill(HIDCode.E); |
| | | break; |
| | | case 12: |
| | | this.Role.SyncMove(new ZTPoint(-851, 120)); |
| | | this.Role.ReleaseSkill(HIDCode.T, 0); |
| | | this.Role.SyncMove(new ZTPoint(-550, 90)); |
| | | this.Role.ReleaseSkill(HIDCode.T); |
| | | break; |
| | | case 17: |
| | | this.Role.SyncMove(new ZTPoint(-306, 130)); |
| | | this.Role.ReleaseSkill(HIDCode.Q, 1300); |
| | | this.Role.ReleaseSkill(HIDCode.F, 0);//用w代替 |
| | | this.Role.SyncMove(new ZTPoint(-200, 60)); |
| | | this.Role.ReleaseSkill(HIDCode.Q); |
| | | this.Role.ReleaseSkill(HIDCode.F);//用w代替 |
| | | break; |
| | | case 16: |
| | | this.Role.SyncMove(new ZTPoint(-385, 0)); |
| | | this.Role.ReleaseSkill(HIDCode.Y, 0); |
| | | this.Role.SyncMove(new ZTPoint(-174, 0)); |
| | | this.Role.ReleaseSkill(HIDCode.Y); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// esc退到城镇 |
| | | /// </summary> |
| | | private void ExitToTown() |
| | | { |
| | | G.Instance.DebugWriter("返回城镇"); |
| | | Utility.Structs.ZTPoint point = new Utility.Structs.ZTPoint(this.GameRect.End.X - 124, this.GameRect.Start.Y + 146); |
| | | G.Instance.InputControl.MoveToAndClick(point); |
| | | Thread.Sleep(5000); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 点击再次挑战 |
| | | /// </summary> |
| | | private void ReplayGame() |
| | | { |
| | | G.Instance.DebugWriter("重新挑战"); |
| | | Utility.Structs.ZTPoint point = new Utility.Structs.ZTPoint(this.GameRect.End.X - 132, this.GameRect.Start.Y + 90); |
| | | G.Instance.InputControl.MoveToAndClick(point); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 刷房间 |
| | |
| | | G.Instance.InfoWriter("未找到进入凛冬"); |
| | | return ZTResult.Failed; |
| | | } |
| | | G.Instance.InfoWriter("进入凛冬"); |
| | | G.Instance.InfoWriter("进入卡勒特"); |
| | | |
| | | Int32 preHouseIndex = -1; |
| | | Int32 houseIndex = -1; |
| | |
| | | HouseInfo houseInfo = Houses[houseIndex]; |
| | | this.Role.SetHouse(houseInfo); |
| | | DateTime startTime = DateTime.Now; |
| | | KillMonsterStateMachine kmsm = new KillMonsterStateMachine(this, houseInfo,this.Role, preHouseIndex, this.runningStep); |
| | | ZTResult smresult = kmsm.Work(5 * 60 * 1000); |
| | | KillMonsterStateMachine kmsm = new KillMonsterStateMachine(this, houseInfo,this.Role); |
| | | ZTResult smresult = kmsm.Work(2 * 60 * 1000,preHouseIndex,this.runningStep); |
| | | Int32 roomTotalSecond = (Int32)(DateTime.Now - startTime).TotalSeconds; |
| | | G.Instance.InfoWriter("房间刷完,用时:" + (roomTotalSecond / 60) + "分" + (roomTotalSecond % 60) + "秒"); |
| | | |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 步行到素喃 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | private bool MoveToSunan() |
| | | { |
| | | bool result = FuncUtils.NoChangeRetryCallWrap( |
| | | () => |
| | | { |
| | | WindowUtils.SetDnfToTop(); |
| | | CloseAllAlertWindow(this.CancelToken, this.GameRect); |
| | | //向下走出赛丽亚的房间 ,走向素喃 |
| | | G.Instance.InputControl.PressKey(2000, HIDCode.DownArrow); |
| | | }, |
| | | () => |
| | | { |
| | | G.Instance.InfoWriter("检测是否进入素喃"); |
| | | result = FuncUtils.TimeoutCancelableWrap(10000, this.CancelToken, () => |
| | | { |
| | | return LindongCVHelper.IsInSunan(this.GameRect); |
| | | }); |
| | | if (!result) |
| | | { |
| | | G.Instance.InfoWriter("进入素喃失败"); |
| | | return false; |
| | | } |
| | | |
| | | G.Instance.InfoWriter("进入素喃成功"); |
| | | return true; |
| | | }, |
| | | () => |
| | | { |
| | | return DnfCVHelper.IsInSaiLiYaHouse(this.GameRect); |
| | | }); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 步行至时空之门 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | private bool MoveToShikongzhimen() |
| | | { |
| | | bool result = FuncUtils.NoChangeRetryCallWrap(() => |
| | | { |
| | | //打开地图 |
| | | ZTPoint mapButtonPosition = new ZTPoint(this.GameRect.End.X - 14, this.GameRect.Start.Y + 16); |
| | | G.Instance.InputControl.MoveToAndClick(mapButtonPosition); |
| | | Thread.Sleep(1000); |
| | | |
| | | //点到副本之前的地图 |
| | | ZTPoint mapPrePosition = new ZTPoint(this.GameRect.Start.X + 382, this.GameRect.Start.Y + 252); |
| | | G.Instance.InputControl.MoveToAndClick(mapPrePosition); |
| | | |
| | | //关闭地图框 |
| | | CloseAllAlertWindow(this.CancelToken, this.GameRect); |
| | | }, |
| | | () => |
| | | { |
| | | //检测是否进入时空之门 |
| | | return FuncUtils.TimeoutCancelableWrap(15000, this.CancelToken, () => |
| | | { |
| | | CloseAllAlertWindow(this.CancelToken, this.GameRect); |
| | | return LindongCVHelper.IsInShikongzhimen(this.GameRect); |
| | | }); |
| | | }, |
| | | () => |
| | | { |
| | | //检测是否还在素喃 |
| | | return FuncUtils.TimeoutCancelableWrap(3000, this.CancelToken, () => |
| | | { |
| | | CloseAllAlertWindow(this.CancelToken, this.GameRect); |
| | | return LindongCVHelper.IsInSunan(this.GameRect); |
| | | }); |
| | | }); |
| | | |
| | | Thread.Sleep(5000); |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 步行到任务选择和正式开打页面 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | private bool MoveToChoiceTaskPage() |
| | | { |
| | | bool result = false; |
| | | //右走进选择副本界面 |
| | | G.Instance.InputControl.PressKey(1500, HIDCode.LeftArrow); |
| | | |
| | | |
| | | G.Instance.InfoWriter("检测是否打开选择副本界面"); |
| | | result = FuncUtils.TimeoutCancelableWrap(10000, this.CancelToken, () => |
| | | { |
| | | Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage(); |
| | | return LindongCVHelper.IsInChoiceTaskPage(image, this.GameRect); |
| | | }); |
| | | if (!result) |
| | | { |
| | | G.Instance.InfoWriter("进入打开选择副本界面失败"); |
| | | return false; |
| | | } |
| | | G.Instance.InfoWriter("打开选择副本界面成功"); |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 进入指定房间 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | private bool IntoHouse() |
| | | { |
| | | bool result = false; |
| | | //选择凛冬 |
| | | //选择卡勒特之初 |
| | | G.Instance.InfoWriter("开始选择卡勒特之初"); |
| | | |
| | | Int32 nandu = 0; |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 关闭所有弹出窗 |
| | | /// </summary> |
| | | /// <param name="cancelToken"></param> |
| | | /// <param name="gameRect"></param> |
| | | /// <returns></returns> |
| | | private void CloseAllAlertWindow(CancellationToken cancelToken, ZTRectangle gameRect) |
| | | { |
| | | while (!cancelToken.IsCancellationRequested) |
| | | { |
| | | //G.Instance.InputControl.MoveTo(gameRect.Start.X,gameRect.Start.Y, false, false, false); |
| | | //Thread.Sleep(10); |
| | | //截图 |
| | | Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage(); |
| | | |
| | | ZTRectangle closeButtonRect = ZTRectangle.Empty; |
| | | if (!DnfCVHelper.GetAlertWindow(out closeButtonRect, image, gameRect)) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | G.Instance.InputControl.MoveToAndClick(closeButtonRect.GetCenterPoint()); |
| | | Thread.Sleep(500); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 选择凛冬 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | |
| | | return true; |
| | | } |
| | | |
| | | G.Instance.InputControl.MoveToAndClick(new ZTPoint(this.GameRect.Start.X + 819, this.GameRect.Start.Y + 181)); |
| | | G.Instance.InputControl.MoveToAndClick(new ZTPoint(this.GameRect.Start.X + 568, this.GameRect.Start.Y + 141)); |
| | | Thread.Sleep(5000); |
| | | image = ScreenCapture.Instance.CaptureScreenReturnImage(); |
| | | if (KaleteCVHelper.GetChoiceKaleteNandu(out nandu, image, this.GameRect)) |
| | |
| | | return false; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 出售装备 |
| | | /// </summary> |
| | | /// <param name="saleButtonRect"></param> |
| | | private bool SaleEquipment() |
| | | { |
| | | //卖装备并关闭商店 |
| | | ZTRectangle closeButtonRect = ZTRectangle.Empty; |
| | | ZTRectangle saleButtonRect = ZTRectangle.Empty; |
| | | if (!DnfCVHelper.HasSaleButton(out saleButtonRect, out closeButtonRect, this.GameRect)) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | //卖装备 |
| | | G.Instance.InfoWriter("出售装备"); |
| | | G.Instance.InputControl.MoveToAndClick(saleButtonRect.GetCenterPoint()); |
| | | |
| | | //得到装备文字位置 |
| | | ZTRectangle equipmentTextRect = ZTRectangle.Empty; |
| | | bool result = FuncUtils.TimeoutCancelableWrap(5000, this.CancelToken, () => |
| | | { |
| | | Int32 status = 0; |
| | | if (DnfCVHelper.GetEquipmentSelectStatus(out equipmentTextRect, out status, this.GameRect)) |
| | | { |
| | | if (status == 1) |
| | | { |
| | | return true; |
| | | } |
| | | |
| | | G.Instance.InputControl.MoveToAndClick(equipmentTextRect.GetCenterPoint()); |
| | | } |
| | | return false; |
| | | }); |
| | | |
| | | if (!result) |
| | | { |
| | | G.Instance.InfoWriter("装备文字未取到"); |
| | | return false; |
| | | } |
| | | |
| | | |
| | | |
| | | //开始点,每格步进30 |
| | | ZTPoint startPoint = new Utility.Structs.ZTPoint(equipmentTextRect.End.X - 30, equipmentTextRect.End.Y + 9); |
| | | List<Int32> points = DnfCVHelper.GetEquipmentIndexs(startPoint); |
| | | |
| | | for (int i = 0; i < points.Count; i++) |
| | | { |
| | | Int32 index = points[i]; |
| | | |
| | | int row = index / 8; |
| | | int col = index % 8; |
| | | int x = col * 30 + 15; |
| | | int y = row * 30 + 15; |
| | | |
| | | //点窗格 |
| | | G.Instance.InputControl.MoveToAndClick(new Utility.Structs.ZTPoint(startPoint.X + x, startPoint.Y + y)); |
| | | Thread.Sleep(500); |
| | | //点确定 |
| | | G.Instance.InputControl.Move(0, 0, true, false, false); |
| | | Thread.Sleep(RandomUtils.MouseClickDuration); |
| | | G.Instance.InputControl.Move(0, 0, false, false, false); |
| | | Thread.Sleep(RandomUtils.MouseClickDuration); |
| | | } |
| | | G.Instance.DebugWriter("equipment:" + ZTImage.Utils.ConcatString(points.ToArray(), ",")); |
| | | Thread.Sleep(RandomUtils.KeyPressDuration); |
| | | G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Escape); |
| | | return true; |
| | | } |
| | | } |
| | | } |