void Start()
    {
        if (mapData != null && grid != null)
        {
            int[,] mapDesign = mapData.MakeMap();
            grid.CreateGrid(mapDesign);

            gridVisualisation = grid.gameObject.GetComponent <GridVisualisation>();

            if (gridVisualisation != null)
            {
                gridVisualisation.CreateGridVisualisation(grid);
            }

            //if our goal is not in the map range it will throw.
            if (grid.IsWithinBounds(xGoal, yGoal) && grid.IsWithinBounds(xStart, yStart))
            {
                startNode       = gridVisualisation.nodesVisualisationData[xStart, yStart];
                goalNode        = gridVisualisation.nodesVisualisationData[xGoal, yGoal];
                xGoalInput.text = xGoal.ToString();
                yGoalInput.text = yGoal.ToString();
                xUnitInput.text = xStart.ToString();
                yUnitInput.text = yStart.ToString();
                InstantiateUnit(startNode);
            }
        }
    }
 void ChangeTileTerrain(NodeVisualisation node, NodeType nodeType, bool wallStatus)
 {
     node.gridNode.nodeType = nodeType;
     node.EnableObject(node.wall, wallStatus);
     node.EnableObject(node.arrow, PathfindingVisualisationAid);
     gridVisualisation.ResetGridVisualisation();
 }
    void Start()
    {
        if (mapData != null && grid != null)
        {
            int[,] mapinstance = mapData.MakeMap();
            grid.CreateGrid(mapinstance);

            gridVisualisation = grid.gameObject.GetComponent <GridVisualisation>();

            if (gridVisualisation != null)
            {
                gridVisualisation.CreateGridVisualisation(grid);
            }

            //if our goal is not in the map range it will throw.
            if (grid.IsWithinBounds(xGoal, yGoal) && grid.IsWithinBounds(xStart, yStart))
            {
                startNode = gridVisualisation.nodesVisualisationData[xStart, yStart];
                goalNode  = gridVisualisation.nodesVisualisationData[xGoal, yGoal];

                xGoalInput.text = xGoal.ToString();
                yGoalInput.text = yGoal.ToString();
                xUnitInput.text = xStart.ToString();
                yUnitInput.text = yStart.ToString();
                ChangeTileToGoalNode(goalNode);
                InstantiateUnit(startNode);
            }

            flowfieldPathfinding.CreatePathfinding(grid, gridVisualisation);
            flowfieldPathfinding.FlowfieldPath(goalNode.transform.position, PathfindingVisualisationAid, heuristicIndex);
        }
    }
    public void ChangeGoalPositionOnButtonClick()
    {
        //If the text box is not blank then crack on otherwise throw debug message.
        if (xGoalInput.text != "" && yGoalInput.text != "")
        {
            xGoalInputValue = int.Parse(xGoalInput.text);
            yGoalInputValue = int.Parse(yGoalInput.text);

            if (grid.IsWithinBounds(xGoalInputValue, yGoalInputValue))
            {
                NodeVisualisation node = gridVisualisation.nodesVisualisationData[xGoalInputValue, yGoalInputValue];
                if (node.gridNode.nodeType != NodeType.Blocked)
                {
                    ChangeTileToGoalNode(node);
                    RecalculateUnitPath();
                }
                else
                {
                    Debug.Log("Can't place goal on a blocked node please input a valid walkable node");
                }
            }
            else
            {
                Debug.Log("Number Inputted is out of bounds. Please put a number that corresponds to the size of the map");
            }
        }
        else
        {
            Debug.Log("A value must be given");
        }
    }
    public void ChangeUnitPositionOnButtonClick()
    {
        if (xUnitInput.text != "" && yUnitInput.text != "")
        {
            xUnitInputValue = int.Parse(xUnitInput.text);
            yUnitInputValue = int.Parse(yUnitInput.text);

            if (grid.IsWithinBounds(xUnitInputValue, yUnitInputValue))
            {
                NodeVisualisation node = gridVisualisation.nodesVisualisationData[xUnitInputValue, yUnitInputValue];
                if (node.gridNode.nodeType != NodeType.Blocked)
                {
                    unitData[0].ChangeUnitPositionWithoutUsingSpawnPosition(node.gridNode.xIndexPosition, node.gridNode.yIndexPosition);
                    unitData[0].ClearList();
                    gridVisualisation.ResetGridVisualisation();
                    gridVisualisation.ChangeToGoalNodeColourOnly(goalNode);
                }
                else
                {
                    Debug.Log("Can't place unit on a blocked node please input a valid walkable node");
                }
            }
            else
            {
                Debug.Log("Number Inputted is out of bounds. Please put a number that corresponds to the size of the map");
            }
        }
        else
        {
            Debug.Log("A value must be given for the unit");
        }
    }
 void ChangeTileToGoalNode(NodeVisualisation node)
 {
     gridVisualisation.ResetGridVisualisation();
     gridVisualisation.ChangeToFloorNode(goalNode);
     gridVisualisation.ChangeToGoalNode(node);
     goalNode = node;
 }
    void InstantiateUnit(NodeVisualisation node)
    {
        FlowfieldUnit unit = Instantiate(unitPrefab, node.transform.position + unitPrefab.transform.position, Quaternion.identity);

        unit.InstaniateUnit(node.gridNode.xIndexPosition, node.gridNode.yIndexPosition, grid, unitData.Count);
        unitData.Add(unit);
    }
    //When you left click the mouse button, it will
    void LeftMouseClickToAlterNodeTerrain()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log(hit.collider.gameObject.tag);
                if (hit.collider.gameObject.tag == "Node")
                {
                    NodeVisualisation nodeVisualisation = hit.collider.gameObject.GetComponentInParent <NodeVisualisation>();
                    if (nodeVisualisation != goalNode)
                    {
                        switch (terrainIndex)
                        {
                        case 0:
                            if (nodeVisualisation.gridNode.nodeType != NodeType.Open)
                            {
                                ChangeTileTerrain(nodeVisualisation, NodeType.Open, false);
                                UpdateMap();
                            }
                            break;

                        case 1:
                            if (nodeVisualisation.gridNode.nodeType != NodeType.Blocked)
                            {
                                ChangeTileTerrain(nodeVisualisation, NodeType.Blocked, true);
                                UpdateMap();
                            }
                            break;

                        case 2:
                            if (nodeVisualisation.gridNode.nodeType != NodeType.Grass)
                            {
                                ChangeTileTerrain(nodeVisualisation, NodeType.Grass, false);
                                UpdateMap();
                            }
                            break;

                        case 3:
                            if (nodeVisualisation.gridNode.nodeType != NodeType.Water)
                            {
                                ChangeTileTerrain(nodeVisualisation, NodeType.Water, false);
                                UpdateMap();
                            }
                            break;
                        }
                    }
                }
            }
        }
    }
    public void ColorNodes(List <Node> nodelist, Color color)
    {
        foreach (Node node in nodelist)
        {
            if (node != null)
            {
                NodeVisualisation nodeVisualisation = nodesVisualisationData[node.xIndexPosition, node.yIndexPosition];

                if (nodeVisualisation != null)
                {
                    nodeVisualisation.ColorNode(color);
                }
            }
        }
    }
 void MiddleMouseClickToSpawnUnit()
 {
     if (Input.GetMouseButtonDown(2))
     {
         if (Physics.Raycast(ray, out hit))
         {
             Debug.Log(hit.collider.gameObject.tag);
             //added mesh chollider to tile to make sure we are able to hit the tile plane.
             if (hit.collider.gameObject.tag == "Node")
             {
                 NodeVisualisation nodeVisualisation = hit.collider.gameObject.GetComponentInParent <NodeVisualisation>();
                 if (nodeVisualisation.gridNode.nodeType != NodeType.Blocked && nodeVisualisation.gridNode.nodeType != NodeType.GoalNode)
                 {
                     InstantiateUnit(nodeVisualisation);
                 }
             }
         }
     }
 }
    public void CreateGridVisualisation(GridManager grid)
    {
        if (grid == null)
        {
            Debug.LogWarning("GridManager has returned as null");
            return;
        }

        nodesVisualisationData = new NodeVisualisation[grid.GetGridWidth, grid.GetGridHeight];

        foreach (Node node in grid.gridNodes)
        {
            GameObject        instance          = Instantiate(nodeVisualisationPrefab, Vector3.zero, Quaternion.identity);
            NodeVisualisation nodeVisualisation = instance.GetComponent <NodeVisualisation>();

            if (nodeVisualisation != null)
            {
                nodeVisualisation.CreateNodeVisualisation(node);
                nodesVisualisationData[node.xIndexPosition, node.yIndexPosition] = nodeVisualisation;
                if (nodeVisualisation.gridNode.nodeType == NodeType.Blocked)
                {
                    nodeVisualisation.ColorNode(wallColor);
                }
                else if (nodeVisualisation.gridNode.nodeType == NodeType.Open)
                {
                    nodeVisualisation.ColorNode(baseColor);
                }
                else if (nodeVisualisation.gridNode.nodeType == NodeType.GoalNode)
                {
                    nodeVisualisation.ColorNode(goalColor);
                }
                else if (nodeVisualisation.gridNode.nodeType == NodeType.Grass)
                {
                    nodeVisualisation.ColorNode(grassColor);
                }
                else if (nodeVisualisation.gridNode.nodeType == NodeType.Water)
                {
                    nodeVisualisation.ColorNode(waterColor);
                }
            }
        }
    }
    //When you left click the mouse button, it will
    void LeftMouseClickToAlterNodeTerrain()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log(hit.collider.gameObject.tag);
                if (hit.collider.gameObject.tag == "Node")
                {
                    NodeVisualisation nodeVisualisation = hit.collider.gameObject.GetComponentInParent <NodeVisualisation>();
                    if (nodeVisualisation != goalNode)
                    {
                        switch (terrainIndex)
                        {
                        case 0:
                            ChangeTileTerrain(nodeVisualisation, NodeType.Open, false);
                            RecalculateUnitPath();
                            break;

                        case 1:
                            ChangeTileTerrain(nodeVisualisation, NodeType.Blocked, true);
                            SearchUnitPathRecalculate(nodeVisualisation);
                            break;

                        case 2:
                            ChangeTileTerrain(nodeVisualisation, NodeType.Grass, false);
                            RecalculateUnitPath();
                            break;

                        case 3:
                            ChangeTileTerrain(nodeVisualisation, NodeType.Water, false);
                            RecalculateUnitPath();
                            break;

                        default:
                            break;
                        }
                    }
                }
            }
        }
    }
    void InstantiateUnit(NodeVisualisation node)
    {
        Unit unit = Instantiate(unitPrefab, node.transform.position + unitPrefab.transform.position, Quaternion.identity);

        unit.SetUnitPositionInGrid(node.gridNode.xIndexPosition, node.gridNode.yIndexPosition);
        unit.InitiatePathfinding(grid, gridVisualisation);
        unitData.Add(unit);
        unit.UnitFindPath(goalNode.transform, algorithmIndex, heuristicIndex);
        AddMessageToTextBox(unit.ReturnUnitMessage(), unitData.Count - 1);
        UpdateScrollBarToBottom();
        if (PathfindingVisualisationAid)
        {
            if (!(unitData.Count > 1))
            {
                unit.UnitSearchVisualisation();
            }
            unit.UnitPathVisualisation();
            gridVisualisation.ChangeToGoalNodeColourOnly(goalNode);
        }
    }
 void RightMouseClickToChangeGoalNodePositon()
 {
     //Right click
     if (Input.GetMouseButtonDown(1))
     {
         if (Physics.Raycast(ray, out hit))
         {
             Debug.Log(hit.collider.gameObject.tag);
             //added mesh chollider to tile to make sure we are able to hit the tile plane.
             if (hit.collider.gameObject.tag == "Node")
             {
                 NodeVisualisation nodeVisualisation = hit.collider.gameObject.GetComponentInParent <NodeVisualisation>();
                 if (nodeVisualisation.gridNode.nodeType != NodeType.Blocked)
                 {
                     ChangeTileToGoalNode(nodeVisualisation);
                     RecalculateUnitPath();
                 }
             }
         }
     }
 }
 void SearchUnitPathRecalculate(NodeVisualisation node)
 {
     ClearTextFromDisplay();
     for (int i = 0; i < unitData.Count; i++)
     {
         if (unitData[i].SearchPathChangedNode(node.gridNode))
         {
             unitData[i].UnitFindPath(goalNode.transform, algorithmIndex, heuristicIndex);
         }
         AddMessageToTextBox(unitData[i].ReturnUnitMessage(), i);
         if (PathfindingVisualisationAid)
         {
             if (!(unitData.Count > 1))
             {
                 unitData[i].UnitSearchVisualisation();
             }
             unitData[i].UnitPathVisualisation();
             gridVisualisation.ChangeToGoalNodeColourOnly(goalNode);
         }
     }
     UpdateScrollBarToBottom();
 }
 public void ChangeToFloorNode(NodeVisualisation nodevisualisation)
 {
     nodevisualisation.gridNode.nodeType = NodeType.Open;
     nodevisualisation.ColorNode(baseColor);
 }
 public void ChangeToGrassNode(NodeVisualisation nodevisualisation)
 {
     nodevisualisation.gridNode.nodeType = NodeType.Grass;
     nodevisualisation.ColorNode(grassColor);
 }
 public void ChangeToWaterNode(NodeVisualisation nodevisualisation)
 {
     nodevisualisation.gridNode.nodeType = NodeType.Water;
     nodevisualisation.ColorNode(waterColor);
 }
 public void ChangeToGoalNode(NodeVisualisation nodevisualisation)
 {
     nodevisualisation.gridNode.nodeType = NodeType.GoalNode;
     nodevisualisation.ColorNode(goalColor);
 }
 public void ChangeToGoalNodeColourOnly(NodeVisualisation nodevisualisation)
 {
     nodevisualisation.ColorNode(goalColor);
 }
    public void ChangeToGoalNodeColourOnly(Node node)
    {
        NodeVisualisation visualNode = nodesVisualisationData[node.xIndexPosition, node.yIndexPosition];

        visualNode.ColorNode(goalColor);
    }