//----------------------------------------------------------------------------
        //              Constructor
        //----------------------------------------------------------------------------

        public PathValue(int score_g, int heuristic, Vector3 centre, IHexagon hex, PathValue previous)
        {
            Score_g   = score_g;
            Heuristic = heuristic;
            Centre    = centre;
            Hex       = hex;
            Previous  = previous;
        }
示例#2
0
        //----------------------------------------------------------------------------
        //              Get Path Value
        //----------------------------------------------------------------------------

        /// <summary>
        /// GetPathValue checks if a hex has been visited before. <para/>
        /// If it has, return the original PathValue <para/>
        /// Otherwise, construct a new PathValue
        ///
        /// </summary>
        public IPathValue GetPathValue(IHexagon hex)
        {
            if (PathValueDict.ContainsKey(hex))
            {
                return(PathValueDict[hex]);
            }
            else
            {
                Vector3    centre = (Destination.HexTransform.position + Start.HexTransform.position) / 2;
                IPathValue myPath = new PathValue(400000, HexMath.FindDistance(hex, Destination), centre, hex, null);
                PathValueDict.Add(hex, myPath);
                return(myPath);
            }
        }
        /// <summary>
        /// The path values have the path stored as a reverse linked list <para />
        /// This reverses it, and constructs a MapPath <para />
        /// MapPath is currently unimportant, but will hopefully allow ai to make good decisions with movement
        /// </summary>
        public MapPath ReconstructPath()
        {
            MapPath myMapPath = new MapPath();

            myMapPath.cost = Score_g;

            PathValue currentPath = this;

            while (currentPath != null)
            {
                myMapPath.PathStack.Push(currentPath.Hex);
                currentPath = currentPath.Previous;
            }

            return(myMapPath);
        }
        //----------------------------------------------------------------------------
        //              IComparable
        //----------------------------------------------------------------------------

        #region IComparable
        public int CompareTo(object obj)
        {
            if (obj == null)
            {
                return(1);
            }

            PathValue otherPathValue = (PathValue)obj;

            if (otherPathValue != null)
            {
                return(PathCompare(this, otherPathValue));
            }
            else
            {
                throw new ArgumentException("Object is not a PathValue");
            }
        }
 private int PathCompare(PathValue a, PathValue b)
 {
     if (a.Score_f < b.Score_f)
     {
         return(-1);
     }
     else if (a.Score_f > b.Score_f)
     {
         return(1);
     }
     //here's where the euclidean distance comparison kicks in
     else if (Vector3.Distance(a.Hex.HexTransform.position, Centre) < Vector3.Distance(b.Hex.HexTransform.position, Centre))
     {
         return(-1);
     }
     else if (Vector3.Distance(a.Hex.HexTransform.position, Centre) > Vector3.Distance(b.Hex.HexTransform.position, Centre))
     {
         return(1);
     }
     else
     {
         return(Vec3IntExt.Vec3IntCompare(a.Hex.MyHexMap.CoOrds, b.Hex.MyHexMap.CoOrds));
     }
 }
 /// <summary>
 /// If a shorter path to a hex is found <para/>
 /// You should update the path to it (previous), and the new cost to this node (score_g)
 /// </summary>
 /// <param name="score_g"></param>
 /// <param name="previous"></param>
 public void UpdateValues(int score_g, IPathValue previous)
 {
     Score_g  = score_g;
     Previous = (PathValue)previous;
 }