asmrobot
2024-12-31 a8536c3c73a4445b1f1252a1d3271e0c73b35613
src/RichCreator/Jobs/DNFJob.cs
@@ -17,38 +17,31 @@
using System.Threading.Tasks;
using ZTImage.Configuration;
using RichCreator.StateMachines;
using RichCreator.Utility.Maps;
using RichCreator.Maps.Kalete;
using RichCreator.Maps.Lindong;
using RichCreator.Maps.SkillSetting;
using RichCreator.Maps.Test;
using RichCreator.Dnf;
namespace RichCreator.Jobs
{
    public class DNFJob<T> : JobBase where T:MapInfo,new()
    public class DNFJob : JobBase
    {
        public DNFJob(RichCreatorConfig config) : base(config)
        { }
        /// <summary>
        /// 选角色时的角色选择偏移
        /// </summary>
        private static Utility.Structs.ZTPoint[] RoleOffset = new Utility.Structs.ZTPoint[] {
            new Utility.Structs.ZTPoint (154,225),
            new Utility.Structs.ZTPoint (300,225),
            new Utility.Structs.ZTPoint (443,225),
            new Utility.Structs.ZTPoint (593,225),
            new Utility.Structs.ZTPoint (726,225),
            new Utility.Structs.ZTPoint (883,225),
            new Utility.Structs.ZTPoint (154,455),
            new Utility.Structs.ZTPoint (300,455),
            new Utility.Structs.ZTPoint (443,455),
            new Utility.Structs.ZTPoint (593,455),
            new Utility.Structs.ZTPoint (726,455),
            new Utility.Structs.ZTPoint (883,455)
        };
        public DNFJob(MapType mapType,RichCreatorConfig config) : base(config)
        {
            this.MapType = mapType;
        }
        /// <summary>
        /// 游戏窗口
        /// </summary>
        private ZTRectangle GameRect;
        public ZTRectangle GameRect;
        /// <summary>
        /// 地图类型
        /// </summary>
        public MapType MapType { get; private set; }
        private Int32 runningStep = 0;
@@ -83,22 +76,24 @@
            for (; roleIndex < config.RoleCount; roleIndex++)
            {
                RunningModel.UpdateRoleIndex(roleIndex+1);
                if (cancellationToken.IsCancellationRequested)
                {
                    return ZTResult.Cancel;
                }
                DateTime playOneRoleStartTime = DateTime.Now;
                DateTime startRoleTime = DateTime.Now;
                G.Instance.InfoWriter($"Play Role:{roleIndex+1}");
                playResult = PlayRole(cancellationToken, roleIndex, startGameButtonRect);
                StateProvider.Instance.PreRoleTime = (Int32)(DateTime.Now - startRoleTime).TotalSeconds;
                StateProvider.Instance.RoleTimePassed = 0;
                if (playResult != ZTResult.Success)
                {
                    G.Instance.InfoWriter($"角色刷图失败,第{roleIndex+1}个角色");
                    return playResult;
                }
                Int32 playOneRoleTotalSecond = (Int32)(DateTime.Now - playOneRoleStartTime).TotalSeconds;
                G.Instance.InfoWriter($"角色刷图完成,用时:{(playOneRoleTotalSecond / 60)}分{(playOneRoleTotalSecond % 60)}秒");
                G.Instance.InfoWriter($"角色刷图完成");
            }
            
            RunningModel.UpdateRoleIndex(1);
@@ -161,8 +156,8 @@
            if (pilaozhi > 0)
            {
                //刷图,并保持在可按esc退出的状态
                MapInfo map = new T();
                mapResult = map.Start(this.GameRect, cancellationToken,this.runningStep);
                MapInfo map = CreateMap( cancellationToken);
                mapResult = map.Start(this.runningStep);
            }
            runningStep = RunningStep.None;
@@ -194,12 +189,16 @@
                () =>
                {
                    WindowUtils.SetDnfToTop();
                    //选角色
                    G.Instance.InputControl.MoveToAndClick(this.GameRect.Start.Add(RoleOffset[roleIndex]));
                    Thread.Sleep(500);
                    //点进入游戏
                    G.Instance.InputControl.MoveToAndClick(startGameButtonRect.GetCenterPoint());
                    if (SelectRoleIndex(roleIndex))
                    {
                        //点进入游戏
                        G.Instance.InputControl.MoveToAndClick(startGameButtonRect.GetCenterPoint());
                        return true;
                    }
                    Thread.Sleep(1000);
                    return false;
                },
                () =>
                {
@@ -215,38 +214,176 @@
                        return true;
                    }
                    return false;
                });
                },3);
            return result;
        }
        /// <summary>
        /// 关闭所有弹出窗
        /// </summary>
        /// <param name="cancelToken"></param>
        /// <param name="gameRect"></param>
        /// <returns></returns>
        private bool CloseAllAlertWindow(CancellationToken cancelToken, ZTRectangle gameRect)
        {
            while (!cancelToken.IsCancellationRequested)
            {
                G.Instance.InputControl.MoveTo(0, 0, false, false, false);
                Thread.Sleep(10);
                //截图
                System.Drawing.Bitmap bitmap = ScreenCapture.Instance.CaptureScreen();
                Image<Rgb, byte> image = new Image<Rgb, byte>(bitmap);
                ZTRectangle closeButtonRect = ZTRectangle.Empty;
                if (!DnfCVHelper.GetAlertWindow(out closeButtonRect, image, gameRect))
        /// <summary>
        /// 选角色时的角色选择偏移
        /// </summary>
        private static ZTPoint[] RoleOffset = new Utility.Structs.ZTPoint[] {
            new ZTPoint (133,191),
            new ZTPoint (249,191),
            new ZTPoint (371,191),
            new ZTPoint (499,191),
            new ZTPoint (133,398),
            new ZTPoint (249,398),
            new ZTPoint (371,398),
            new ZTPoint (499,398),
            new ZTPoint (133,398),
            new ZTPoint (249,398)
        };
        /// <summary>
        /// 选择角色
        /// </summary>
        /// <param name="roleIndex"></param>
        /// <returns></returns>
        private bool SelectRoleIndex(Int32 roleIndex)
        {
            if (roleIndex < 8)
            {
                //移到顶端
                if (!ScrollMoveToTop())
                {
                    return false;
                }
            }
            else
            {
                //移到顶端,向下一格
                if (!ScrollMoveToDownOne())
                {
                    return false;
                }
            }
            Thread.Sleep(1000);
            //选角色
            G.Instance.InputControl.MoveToAndClick(this.GameRect.Start.Add(RoleOffset[roleIndex]));
            Thread.Sleep(500);
            return true;
        }
        /// <summary>
        /// 滚动条移动到顶端
        /// </summary>
        /// <returns></returns>
        private bool ScrollMoveToTop()
        {
            ZTRectangle upButton = ZTRectangle.Empty;
            ZTRectangle downButton = ZTRectangle.Empty;
            ZTRectangle scrollButton = ZTRectangle.Empty;
            //查找滚动条位置
            if (DnfCVHelper.FindSelectRoleScroll(out upButton, out downButton, out scrollButton, this.GameRect))
            {
                //是在顶部
                if (Math.Abs(upButton.End.Y - scrollButton.Start.Y) < 3)
                {
                    return true;
                }
            }
            Int32 counter = 4;
            while(counter>0)
            {
                counter--;
                //查找滚动条位置
                if (!DnfCVHelper.FindSelectRoleScroll(out upButton, out downButton, out scrollButton, this.GameRect))
                {
                    continue;
                }
                //是在顶部
                if (Math.Abs(upButton.End.Y - scrollButton.Start.Y) < 3)
                {
                    return true;
                }
                G.Instance.InputControl.MoveToAndClick(closeButtonRect.GetCenterPoint());
                Thread.Sleep(500);
                ZTPoint targetPoint = scrollButton.GetCenterPoint();
                G.Instance.InputControl.MoveTo(targetPoint.X, targetPoint.Y, false, false, false);
                G.Instance.InputControl.Move(0, 0, true, false, false);
                targetPoint = upButton.GetCenterPoint();
                G.Instance.InputControl.MoveTo(targetPoint.X, targetPoint.Y, true, false, false);
                G.Instance.InputControl.Move(0, 0, false, false, false);
                Thread.Sleep(RandomUtils.KeyPressDuration);
                G.Instance.InputControl.MoveTo(this.GameRect.End.X, this.GameRect.Start.Y, false, false, false);
                Thread.Sleep(RandomUtils.KeyPressDuration);
            }
            return false;
        }
        /// <summary>
        /// 滚动条移动到下一格
        /// </summary>
        /// <returns></returns>
        private bool ScrollMoveToDownOne()
        {
            ZTRectangle upButton = ZTRectangle.Empty;
            ZTRectangle downButton = ZTRectangle.Empty;
            ZTRectangle scrollButton = ZTRectangle.Empty;
            //查找滚动条位置
            if (DnfCVHelper.FindSelectRoleScroll(out upButton, out downButton, out scrollButton, this.GameRect))
            {
                //是在下一格
                if (Math.Abs(upButton.End.Y - scrollButton.Start.Y) > 3&& Math.Abs(upButton.End.Y - scrollButton.Start.Y)<30)
                {
                    return true;
                }
            }
            Int32 counter = 4;
            while (counter > 0)
            {
                counter--;
                //查找滚动条位置
                if (!DnfCVHelper.FindSelectRoleScroll(out upButton, out downButton, out scrollButton, this.GameRect))
                {
                    continue;
                }
                //是在第一格
                if (Math.Abs(upButton.End.Y - scrollButton.Start.Y) > 3 && Math.Abs(upButton.End.Y - scrollButton.Start.Y) < 30)
                {
                    return true;
                }
                ZTPoint targetPoint = scrollButton.GetCenterPoint();
                G.Instance.InputControl.MoveTo(targetPoint.X, targetPoint.Y, false, false, false);
                G.Instance.InputControl.Move(0, 0, true, false, false);
                targetPoint = upButton.GetCenterPoint();
                G.Instance.InputControl.MoveTo(targetPoint.X, targetPoint.Y, true, false, false);
                G.Instance.InputControl.Move(0, 0, false, false, false);
                Thread.Sleep(RandomUtils.KeyPressDuration);
                G.Instance.InputControl.MoveToAndClick(downButton.GetCenterPoint());
                Thread.Sleep(RandomUtils.KeyPressDuration);
                G.Instance.InputControl.MoveTo(this.GameRect.End.X, this.GameRect.Start.Y, false, false, false);
                Thread.Sleep(RandomUtils.KeyPressDuration);
            }
            return false;
        }
        /// <summary>
        /// 返回选择角色界面
@@ -278,12 +415,33 @@
            if (result)
            {
                //点击切换角色按钮624,502
                G.Instance.InputControl.MoveToAndClick(new Utility.Structs.ZTPoint(this.GameRect.Start.X + 624, this.GameRect.Start.Y + 502));
                //点击切换角色按钮388,445
                G.Instance.InputControl.MoveToAndClick(new Utility.Structs.ZTPoint(this.GameRect.Start.X + 388, this.GameRect.Start.Y + 445));
                return true;
            }
            G.Instance.InfoWriter("退回选择角色界面失败");
            return false;
        }
        /// <summary>
        /// 根据当前选择的地图实例化DNF地图
        /// </summary>
        /// <param name="config"></param>
        /// <returns></returns>
        private MapInfo CreateMap(CancellationToken cancelToken)
        {
            switch (this.MapType)
            {
                case MapType.Lingdong:
                    return new LindongMap(this.GameRect,cancelToken);
                case MapType.Kalete:
                    return new KaleteMap(this.GameRect, cancelToken);
                case MapType.SkillSetting:
                    return new SkillSettingMap(this.GameRect, cancelToken);
                case MapType.Test:
                    return new TestMap(this.GameRect, cancelToken);
            }
            throw new Exception("this task index is error");
        }
    }
}