private LinkedList <GraphNode> FindPath()
        {
            GraphNode start = GetNearestHideSpot();
            GraphNode end   = GetFurthestHideSpot();

            Debug.Print(start.name + " " + end.name);

            LinkedList <GraphNode> path = Pathfinder.AStarSearch(pathGraph, start, end);

            return(path);
        }
        public void Update(IKeyboard keyboard, float time, Action <SceneType> sceneChangeAction)
        {
            if (keyboard.IsButtonPressed(MouseButton.Left))
            {
                StartPosition = keyboard.MousePosition;

                foreach (IGameObject e in Entities.OfType <IGameObject>())
                {
                    if ((keyboard.MousePosition - e.Position).Length < e.Radius)
                    {
                        if (e.Selected == true)
                        {
                            e.Selected = false;
                        }
                        else
                        {
                            e.Selected = true;
                        }
                    }
                    else
                    {
                        e.Selected = false;
                    }
                }
            }

            if (keyboard.IsButtonDown(MouseButton.Left) && StartPosition.HasValue && (StartPosition.Value - keyboard.MousePosition).Length > 0.05f)
            {
                float aMinX;
                float aMaxX;
                float aMinY;
                float aMaxY;

                foreach (IArmy a in Entities.OfType <IArmy>())
                {
                    if (a.Owner == PlayerType.Enemy)
                    {
                        continue;
                    }

                    a.Selected = true;

                    if (StartPosition.Value.X < keyboard.MousePosition.X)
                    {
                        aMinX = StartPosition.Value.X;
                        aMaxX = keyboard.MousePosition.X;
                    }
                    else
                    {
                        aMinX = keyboard.MousePosition.X;
                        aMaxX = StartPosition.Value.X;
                    }

                    if (StartPosition.Value.Y < keyboard.MousePosition.Y)
                    {
                        aMinY = StartPosition.Value.Y;
                        aMaxY = keyboard.MousePosition.Y;
                    }
                    else
                    {
                        aMinY = keyboard.MousePosition.Y;
                        aMaxY = StartPosition.Value.Y;
                    }

                    if ((aMinX > (a.Position.X + a.Radius) || (a.Position.X - a.Radius) > aMaxX) || ((aMinY > a.Position.Y + a.Radius) || (a.Position.Y - a.Radius) > aMaxY))
                    {
                        a.Selected = false;
                    }
                }
            }

            if (keyboard.IsButtonReleased(MouseButton.Left))
            {
                StartPosition = null;
            }

            if (keyboard.IsButtonPressed(MouseButton.Right))
            {
                foreach (IEntity next in Entities)
                {
                    if (next is IArmy tmp)
                    {
                        if (tmp.Selected)
                        {
                            int node1 = gameMap.GetNodeWithPoint(next.Position);
                            int node2 = gameMap.GetNodeWithPoint(keyboard.MousePosition);

                            if (node1 == -1 || node2 == -1)
                            {
                                break;
                            }

                            tmp.Path = Pathfinder.RefinePath(gameMap, Pathfinder.AStarSearch(gameMap, node1, node2), keyboard.MousePosition);
                        }
                    }
                }
            }

            foreach (IEntity entity in Entities.ToList())
            {
                if (entity is Projectile projectile)
                {
                    if (!projectile.UpdatePosition())
                    {
                        Entities.Remove(projectile);
                    }
                }

                IGameObject gameObj = entity as IGameObject;
                if (gameObj == null)
                {
                    continue;
                }

                if (gameObj is IArmy tmp)
                {
                    tmp.UpdatePosition();
                }

                List <IEntity> newEntities = gameObj.UpdateAttack(time, Entities.FindAll(e => e is IGameObject).Cast <IGameObject>().ToList());
                if (newEntities != null)
                {
                    newEntities.ForEach(e => Entities.Add(e));
                }

                foreach (IEntity entity2 in Entities)
                {
                    if (gameObj is Tower tow)
                    {
                        List <IEntity> newEntities2 = gameObj.UpdateHealing(time, Entities.FindAll(e => e is IGameObject).Cast <IGameObject>().ToList());
                        if (newEntities2 != null)
                        {
                            newEntities2.ForEach(e => Entities.Add(e));
                        }
                    }
                }

                gameObj.Update(time);
            }
        }