asmrobot
2019-11-21 589ed88a5924a7494e21b95b6bbff5e46ff49ddd
src/RichCreator/Maps/Kalete/KaleteMap.cs
@@ -9,6 +9,7 @@
using RichCreator.Utility.Maps;
using RichCreator.Utility.Structs;
using RichCreator.Utility.Utilitys;
using RichCreator.Utilitys;
using System;
using System.Collections.Generic;
using System.Threading;
@@ -18,12 +19,11 @@
    /// <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>
@@ -32,36 +32,28 @@
        /// 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;
        /// <summary>
@@ -184,70 +176,49 @@
            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>
        /// 刷房间
        /// </summary>
@@ -261,7 +232,7 @@
                G.Instance.InfoWriter("未找到进入凛冬");
                return ZTResult.Failed;
            }
            G.Instance.InfoWriter("进入凛冬");
            G.Instance.InfoWriter("进入卡勒特");
            Int32 preHouseIndex = -1;
            Int32 houseIndex = -1;
@@ -287,8 +258,8 @@
                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) + "秒");
@@ -310,113 +281,7 @@
                }
            }
        }
        /// <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>
@@ -424,7 +289,7 @@
        private bool IntoHouse()
        {
            bool result = false;
            //选择凛冬
            //选择卡勒特之初
            G.Instance.InfoWriter("开始选择卡勒特之初");
            Int32 nandu = 0;
@@ -456,32 +321,6 @@
        }
        /// <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>
@@ -494,7 +333,7 @@
                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))
@@ -542,75 +381,5 @@
            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;
        }
    }
}