From 589ed88a5924a7494e21b95b6bbff5e46ff49ddd Mon Sep 17 00:00:00 2001
From: asmrobot <asmrobot@hotmail.com>
Date: Thu, 21 Nov 2019 01:08:42 +0000
Subject: [PATCH] kalete map

---
 src/RichCreator/Dnf/DnfRole.cs |  437 ++++++++++++++++++++++++------------------------------
 1 files changed, 196 insertions(+), 241 deletions(-)

diff --git a/src/RichCreator/Dnf/DnfRole.cs b/src/RichCreator/Dnf/DnfRole.cs
index 3d2f097..399fae1 100644
--- a/src/RichCreator/Dnf/DnfRole.cs
+++ b/src/RichCreator/Dnf/DnfRole.cs
@@ -2,8 +2,11 @@
 using RichCreator.Utility.Dnf;
 using RichCreator.Utility.InputControl;
 using RichCreator.Utility.Maps;
+using RichCreator.Utility.Skills;
 using RichCreator.Utility.Structs;
+using RichCreator.Utility.Utilitys;
 using System;
+using System.Collections.Generic;
 using System.Threading;
 
 
@@ -14,37 +17,61 @@
     /// </summary>
     public class DnfRole
     {
-
-        private SpeedProvider speed;//速度
-
         private const Int32 PaddingLeft = 140;//左边框内边距
         private const Int32 PaddingRight = 140;//右边框内边距
+
+        /// <summary>
+        /// 角色脚部距色块中央的偏移
+        /// </summary>
+        public static readonly ZTPoint RoleFootOffset = new ZTPoint(0, 143);
+        
+        /// <summary>
+        /// 角色身体中间距色块中央的偏移
+        /// </summary>
+        public static readonly ZTPoint RoleHalfOffset = new ZTPoint(0, 88);
+
+
 
         public DnfRole(ZTRectangle gameRect)
         {
             this.gameRect = gameRect;
             speed = SpeedProvider.Define;
-            
+            moveCancelToken = new CancellationTokenSource();            
+        }
+        
+        private SpeedProvider speed;//速度
+        private HouseInfo house;//所在房间
+        private ZTRectangle gameRect = ZTRectangle.Empty;        
+        private MoveIntent movingIntent = MoveIntent.AttackMove;//移动意图
+        private CancellationTokenSource moveCancelToken;//移动取消令牌
+
+        /// <summary>
+        /// 角色色块位置
+        /// </summary>
+        public ZTPoint RoleCBPosition { get; private set; }
+
+        /// <summary>
+        /// 角色脚部位置
+        /// </summary>
+        public ZTPoint Position
+        {
+            get
+            {
+                return CBToFootPosition(RoleCBPosition);
+            }
         }
 
-
+        /// <summary>
+        /// 身体中间位置
+        /// </summary>
+        public ZTPoint HalfPosition
+        {
+            get
+            {
+                return CBToHalfPosition(RoleCBPosition);
+            }
+        }
         
-        
-        private Int32 minCenterLineY;
-        private Int32 maxCenterLineY;
-        private Int32 centerLineErrorRange = 35;//中间性可允许的误差
-
-        private HouseInfo house;
-        private ZTRectangle gameRect = ZTRectangle.Empty;
-
-        
-        private MoveIntent movingIntent = MoveIntent.AttackMove;//移动意图
-        private MoveMethod movingMethod = MoveMethod.Vertical;//移动方式,默认垂直移动
-        private ZTSize movingDistance;//移动距离
-
-
-        public ZTPoint Position { get; private set; }//角色位置
-
         /// <summary>
         /// 按下的键,0:横向,1:纵向
         /// </summary>
@@ -58,8 +85,6 @@
         public void SetHouse(HouseInfo house)
         {
             this.house = house;
-            minCenterLineY = this.gameRect.End.Y + this.house.HouseCenterMoveLine - centerLineErrorRange;
-            maxCenterLineY = this.gameRect.End.Y + this.house.HouseCenterMoveLine + centerLineErrorRange;
         }
 
         /// <summary>
@@ -74,10 +99,10 @@
         /// <summary>
         /// 更新位置
         /// </summary>
-        /// <param name="position"></param>
-        public void UpdatePosition(ZTPoint position)
+        /// <param name="roleCBPosition"></param>
+        public void UpdatePosition(ZTPoint roleCBPosition)
         {
-            this.Position = position;
+            this.RoleCBPosition = roleCBPosition;
         }
 
 
@@ -113,14 +138,56 @@
         /// <param name="moveDistance"></param>
         public void AttackMove(ZTSize moveDistance)
         {
-            PutKey(moveDistance);
+            PutDirectionKey(moveDistance);
             movingIntent = MoveIntent.AttackMove;
+        }
+
+        /// <summary>
+        /// 攻击移动至
+        /// </summary>
+        /// <param name="skillReleasePoint"></param>
+        public void AttackMoveTo(ZTPoint skillReleasePoint,ParametersPoint locationPoint)
+        {
+            //屏幕坐标转地图坐标
+            ZTPoint start= this.house.ScreenToMapCoordinate(this.Position, locationPoint);
+            ZTPoint end = this.house.ScreenToMapCoordinate(DnfRole.HalfToFootPosition(skillReleasePoint), locationPoint);
+            List<ZTPoint> paths = this.house.FindPath(start, end);
+            MovePaths(start, paths);
+        }
+
+        /// <summary>
+        /// 移动到指定地图点
+        /// </summary>
+        public void MoveToMapPoint(ZTPoint start,ZTPoint end)
+        {
+            List<ZTPoint> paths = this.house.FindPath(start, end);
+            MovePaths(start, paths);
+        }
+
+        /// <summary>
+        /// 移动指定路径
+        /// </summary>
+        /// <param name="start"></param>
+        /// <param name="paths"></param>
+        public void MovePaths(ZTPoint start, List<ZTPoint> paths)
+        {
+            ZTPoint lastPoint = start;
+            if (paths != null && paths.Count > 0)
+            {
+                for (int i = 0; i < paths.Count; i++)
+                {
+                    ZTPoint distance = paths[i].Sub(lastPoint);
+                    this.SyncMove(distance);
+                    lastPoint = paths[i];
+                }
+            }
         }
 
         private Int32 findRoleDir = 0;//寻找角色行走的方向
         private DateTime findRoleMoveTimeout = DateTime.MinValue;//方向移动过期时间
 
         private static HIDCode[][] dir = new HIDCode[][] { new HIDCode[] { HIDCode.LeftArrow ,HIDCode.NoEvent}, new HIDCode[] { HIDCode.NoEvent, HIDCode.UpArrow }, new HIDCode[] { HIDCode.RightArrow, HIDCode.NoEvent }, new HIDCode[] { HIDCode.NoEvent, HIDCode.DownArrow } };
+        
         
 
         /// <summary>
@@ -140,23 +207,48 @@
                 findRoleDir++;
                 HIDCode[]  tempKeys = dir[findRoleDir % 4];
                 Int32 stepms = 0, runms = 0;
-                PutKey(out stepms, out runms, tempKeys[0], tempKeys[1], true);
+                PutDirectionKey(out stepms, out runms, tempKeys[0], tempKeys[1], true);
                 findRoleMoveTimeout = DateTime.Now.AddMilliseconds(speed.RandomMoveMillSecond);
             }
-
-            //if (!IsMoving || (IsMoving && KeyIsChange(tempKeys)))
-            //{
-            //    //Int32 stepms = 0, runms = 0;
-            //    //PutKey(out stepms, out runms, tempKeys[0], tempKeys[1], true);
-            //}
+            
             movingIntent = MoveIntent.FindRoleMove;
         }
+
+        public void EntryDoorMove()
+        {
+            if (IsMoving && !IsMoveIntent(MoveIntent.EntryDoor))
+            {
+                StopMove();
+            }
+        }
+
+        public void ToLoopMove()
+        {
+            if (IsMoving && !IsMoveIntent(MoveIntent.ToLoopPoint))
+            {
+                StopMove();
+            }
+        }
+
+        public void ToNextGateMove()
+        {
+            if (IsMoving && !IsMoveIntent(MoveIntent.ToNextGatePoint))
+            {
+                StopMove();
+            }
+        }
+
 
         /// <summary>
         /// 拾起物品移动
         /// </summary>
         public void PickupMove(ZTPoint rolePosition, ZTPoint thingItemPosition)
         {
+            if (IsMoving && !IsMoveIntent(MoveIntent.PickupMove))
+            {
+                StopMove();
+            }
+
             ZTSize moveDistance = new ZTSize(thingItemPosition.X - rolePosition.X, thingItemPosition.Y - rolePosition.Y - 97);
             if (Math.Abs(moveDistance.Width) < 100 && Math.Abs(moveDistance.Height) < 100)
             {
@@ -168,39 +260,10 @@
             }
 
             //G.Instance.DebugWriter("pickup distance:" + moveDistance.ToString());
-            PutKey(moveDistance);
+            PutDirectionKey(moveDistance);
             movingIntent = MoveIntent.PickupMove;
         }
-
-        /// <summary>
-        /// 找门移动
-        /// </summary>
-        /// <param name="rolePosition"></param>
-        public void FindDoorMove(ZTPoint rolePosition)
-        {
-            ComputeMoveInfo(rolePosition);
-
-            HIDCode dirKey = HIDCode.NoEvent;
-            switch (movingMethod)
-            {
-                case MoveMethod.ToLeft:
-                    dirKey = HIDCode.LeftArrow;
-                    break;
-                case MoveMethod.ToRight:
-                    dirKey = HIDCode.RightArrow;
-                    break;
-                case MoveMethod.Vertical:
-                    dirKey = movingDistance.Height > 0 ? HIDCode.DownArrow : HIDCode.UpArrow;
-                    break;
-                case MoveMethod.Fixed:
-                    SyncMove(new ZTPoint(movingDistance.Width,movingDistance.Height));
-                    StopMove();
-                    return;
-            }
-
-            PutKey(movingDistance);
-            movingIntent = MoveIntent.FindDoorMove;
-        }
+        
         
         /// <summary>
         /// 同步移动指定距离
@@ -241,7 +304,7 @@
                 horizontal = HIDCode.LeftArrow;
             }
 
-            PutKey(out stepms, out runms, horizontal, vertical, isRun);
+            PutDirectionKey(out stepms, out runms, horizontal, vertical, isRun);
             if (stepms > 0)
             {
                 Int32 mdistance = (Int32)(stepms * speed.StepX);
@@ -258,9 +321,7 @@
             {
                 xtime = (Int32)(Math.Abs(distance.Width) / speed.RunX);
             }
-
-
-
+            
             Int32 mintime = Math.Min(xtime, ytime);
             if (xtime <= 0)
             {
@@ -276,15 +337,20 @@
             ytime -= mintime;
             if (xtime > 0)
             {
-                PutKey(out stepms, out runms, horizontal, HIDCode.NoEvent, isRun);
+                PutDirectionKey(out stepms, out runms, horizontal, HIDCode.NoEvent, isRun);
                 Thread.Sleep(xtime);
             }
             if (ytime > 0)
             {
-                PutKey(out stepms, out runms, HIDCode.NoEvent, vertical, false);
+                PutDirectionKey(out stepms, out runms, HIDCode.NoEvent, vertical, false);
                 Thread.Sleep(ytime);
             }
-            StopMove();
+            //StopMove();
+
+            G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false);
+            pressKeys[0] = HIDCode.NoEvent;
+            pressKeys[1] = HIDCode.NoEvent;
+            isRun = false;
         }
         
         /// <summary>
@@ -294,6 +360,9 @@
         {
             if (IsMoving)
             {
+                this.moveCancelToken.Cancel();
+                this.moveCancelToken = new CancellationTokenSource();
+
                 //停止
                 G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false);
                 pressKeys[0] = HIDCode.NoEvent;
@@ -310,181 +379,23 @@
         {
             Thread.Sleep(millSecond);
         }
-
+        
         /// <summary>
         /// 释放技能
         /// </summary>
+        /// <param name="key"></param>
         public void ReleaseSkill(HIDCode key)
-        {
-            ReleaseSkill(key, 0);
-        }
-
-
-        public void ReleaseSkill(HIDCode key, Int32 skillTimeout)
         {
             Int32 dur = RandomUtils.KeyPressDuration;
             G.Instance.InputControl.PressKey(dur,key);
-            Int32 subTime = skillTimeout - dur;
-            if (subTime > 0)
+            SkillInfo skill=SkillInfo.GetSkillInfo(key);
+            if (skill != null)
             {
-                Thread.Sleep(subTime);
-            }
-        }
-
-        private ZTPoint roleLastPosition = ZTPoint.Empty;
-        private bool StaticTimerIsStart = false;//静止计时是否开始
-        private Int32 StaticTimerCounter = 0;//静止计时计数器
-        private DateTime DetectLastNoMoveTime = DateTime.MaxValue;//最后没移动时间
-        private const Int32 NoMoveMaxMillSecond = 2000;//最大未移动容忍毫秒数
-
-        /// <summary>
-        /// 得到循环移动的距离
-        /// </summary>
-        /// <returns></returns>
-        private void ComputeMoveInfo(ZTPoint rolePosition)
-        {
-            ZTRectangle limitRect = ZTRectangle.Empty;
-
-            //达到未移动阀值,可能有障碍物,先攻击,如果攻击后还是无效则上下左右移
-            if (rolePosition.Equals(this.roleLastPosition))
-            {
-                if (StaticTimerIsStart)
+                Int32 subTime = (Int32)(skill.ReleaseWaitTime - dur);
+                if (subTime > 0)
                 {
-                    if ((DateTime.Now - DetectLastNoMoveTime).TotalMilliseconds > NoMoveMaxMillSecond)
-                    {
-                        G.Instance.DebugWriter($"find door not move,role position:{rolePosition.ToString()}");
-                        this.StopMove();
-                        if (StaticTimerCounter == 0)
-                        {
-                            //清除障碍物                            
-                            G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.X);
-                        }
-                        else
-                        {
-                            //无法清除障碍物,随机移动一下
-                            switch (StaticTimerCounter % 4)
-                            {
-                                case 0:
-                                    G.Instance.DebugWriter("random up");
-                                    //上
-                                    movingDistance = new ZTSize(0, -300);
-                                    break;
-                                case 1:
-                                    //右
-                                    movingDistance = new ZTSize(600, 0);
-
-                                    break;
-                                case 2:
-                                    //下
-                                    movingDistance = new ZTSize(0, 300);
-                                    break;
-                                case 3:
-                                    //左
-                                    movingDistance = new ZTSize(-600, 0);
-                                    break;
-                            }
-
-                            movingMethod = MoveMethod.Fixed;
-                        }
-                        StaticTimerCounter++;
-                        DetectLastNoMoveTime = DateTime.Now;
-                        if (StaticTimerCounter > 1)
-                        {
-                            return;
-                        }
-                    }
-
+                    Sleep(subTime);
                 }
-                else if (!StaticTimerIsStart)
-                {
-                    //没开始计时 则 开始计时
-                    StaticTimerIsStart = true;
-                    DetectLastNoMoveTime = DateTime.Now;
-                }
-            }
-            else
-            {
-                //移动了 取消计时
-                this.roleLastPosition = rolePosition;
-                StaticTimerIsStart = false;
-                StaticTimerCounter = 0;
-            }
-
-            if (!IsMoving)
-            {
-                //刚开始移动
-                movingMethod = MoveMethod.Vertical;
-            }
-
-            if (movingMethod == MoveMethod.Vertical && rolePosition.Y >= minCenterLineY && rolePosition.Y <= maxCenterLineY)
-            {
-                //不需要上下移动,计算左右
-                if (this.house.DoorDirection[0] == Direction.Left)
-                {
-                    movingMethod = MoveMethod.ToLeft;
-                }
-                else if (this.house.DoorDirection[0] == Direction.Right)
-                {
-                    movingMethod = MoveMethod.ToRight;
-                }
-                else
-                {
-                    //计算是向左还是右,哪边大往哪边
-                    if (rolePosition.X > (this.gameRect.Start.X + (this.gameRect.End.X - this.gameRect.Start.X) / 2))
-                    {
-                        //左边空间大
-                        movingMethod = MoveMethod.ToLeft;
-                    }
-                    else
-                    {
-                        movingMethod = MoveMethod.ToRight;
-                    }
-                }
-            }
-
-            if (movingMethod == MoveMethod.ToLeft)
-            {
-                //计算左边界范围 
-                limitRect = new ZTRectangle(gameRect.Start.X, gameRect.Start.Y, gameRect.Start.X + PaddingLeft, gameRect.End.Y);
-                //判断是否到左边界
-
-                if (RichCreator.Utilitys.Utils.IsInRect(rolePosition, limitRect))
-                {
-                    //到左边界就向右走
-                    movingMethod = MoveMethod.ToRight;
-                    movingDistance = new ZTSize(gameRect.End.X - rolePosition.X, 0);
-                }
-                else
-                {
-                    //没到继续向左走
-                    movingMethod = MoveMethod.ToLeft;
-                    movingDistance = new ZTSize(limitRect.Start.X - rolePosition.X, 0);
-                }
-            }
-            else if (movingMethod == MoveMethod.ToRight)
-            {
-                //计算右边界范围 
-                limitRect = new ZTRectangle(gameRect.End.X - PaddingRight, gameRect.Start.Y, gameRect.End.X, gameRect.End.Y);
-                //判断是否到右边界
-                if (Utilitys.Utils.IsInRect(rolePosition, limitRect))
-                {
-                    //到右边界就向左走
-                    G.Instance.InfoWriter($"in limit rect,role position:{rolePosition.ToString()},limit:{limitRect.ToString()}");
-                    movingMethod = MoveMethod.ToLeft;
-                    movingDistance = new ZTSize(gameRect.Start.X - rolePosition.X, 0);
-                }
-                else
-                {
-                    //没到继续向右走
-                    movingMethod = MoveMethod.ToRight;
-                    movingDistance = new ZTSize(gameRect.End.X - rolePosition.X, 0);
-                }
-            }
-            else
-            {
-                //向点移动
-                Int32 targetY = gameRect.End.Y + this.house.HouseCenterMoveLine;
-                movingDistance = new ZTSize(0, targetY - rolePosition.Y);
             }
         }
         
@@ -493,7 +404,7 @@
         /// 按下按键
         /// </summary>
         /// <param name="distance"></param>
-        private void PutKey(ZTSize distance)
+        private void PutDirectionKey(ZTSize distance)
         {
             HIDCode horizontal = HIDCode.NoEvent;
             HIDCode vertical = HIDCode.NoEvent;
@@ -523,7 +434,7 @@
             }
 
             Int32 stepms, runms;
-            PutKey(out stepms, out runms, horizontal, vertical, isRun);
+            PutDirectionKey(out stepms, out runms, horizontal, vertical, isRun);
         }
 
         /// <summary>
@@ -534,7 +445,7 @@
         /// <param name="horizontal">横向按键</param>
         /// <param name="vertical">纵向按键</param>
         /// <param name="isRun">是否奔跑</param>
-        private void PutKey(out Int32 stepMS, out Int32 runMS, HIDCode horizontal, HIDCode vertical, bool isRun)
+        private void PutDirectionKey(out Int32 stepMS, out Int32 runMS, HIDCode horizontal, HIDCode vertical, bool isRun)
         {
             stepMS = 0;
             runMS = 0;
@@ -617,7 +528,7 @@
         /// </summary>
         /// <param name="pressKey"></param>
         /// <returns></returns>
-        private bool KeyIsChange(HIDCode[] pressKey)
+        private bool IsChangeOfKey(HIDCode[] pressKey)
         {
             if (pressKey == null || pressKey.Length != 2)
             {
@@ -630,7 +541,51 @@
             }
             return true;
         }
+
+        #endregion
+
+
         
+        #region role position convert
+        /// <summary>
+        /// 色块中央位置转为脚部位置
+        /// </summary>
+        /// <param name="cbPosition"></param>
+        /// <returns></returns>
+        public static ZTPoint CBToFootPosition(ZTPoint cbPosition)
+        {
+            return cbPosition.Add(RoleFootOffset);
+        }
+
+        /// <summary>
+        /// 色块中央位置转为人物中间位置
+        /// </summary>
+        /// <param name="cbPosition"></param>
+        /// <returns></returns>
+        public static ZTPoint CBToHalfPosition(ZTPoint cbPosition)
+        {
+            return cbPosition.Add(RoleHalfOffset);
+        }
+
+        /// <summary>
+        /// 脚部坐标到身份中央坐标转换
+        /// </summary>
+        /// <param name="footPosition"></param>
+        /// <returns></returns>
+        public static ZTPoint FootToHalfPosition(ZTPoint footPosition)
+        {
+            return footPosition.Sub(RoleFootOffset).Add(RoleHalfOffset);
+        }
+
+        /// <summary>
+        /// 身体中央坐标到脚部坐标转换
+        /// </summary>
+        /// <param name="halfPosition"></param>
+        /// <returns></returns>
+        public static ZTPoint HalfToFootPosition(ZTPoint halfPosition)
+        {
+            return halfPosition.Sub(RoleHalfOffset).Add(RoleFootOffset);
+        }
         #endregion
 
 

--
Gitblit v1.9.3