// Use this for initialization
    void Awake()
    {
        if (instance == null)
        {
            instance = this;
            tilePool = GameObject.FindGameObjectWithTag("EventSystem").GetComponent <TilePool>();

            GenerationMap = this.gameObject.AddComponent <GameMap>();
            GenerationMap.AttachMapGameObject();

            forestGenerator = this.gameObject.GetComponent <ForestGenerator>();
            GenerationMap.AttachForestGenerator(forestGenerator);

            GenerationMap.AttachTiles();

            CreatePaths.AttachMap(GenerationMap);
            CreatePaths.AttachTiles(GetCurrentBiomeTileSet().Road, GetCurrentBiomeTileSet().Shallows, GetCurrentBiomeTileSet().Water);

            displaySelected = canvas.GetComponent <DisplaySelected>();
        }
        else
        {
            instance.tilePool = this.gameObject.GetComponent <TilePool>();
            instance.canvas   = GameObject.FindGameObjectWithTag("Canvas").GetComponent <Canvas>();
            Destroy(this);
        }


        gamePlayCam         = cam1.GetComponent <Camera>();
        gamePlayCam.enabled = true;
        topDownCam          = cam2.GetComponent <Camera>();
        topDownCam.enabled  = false;

        testingPhaseCanvas.enabled = false;
    }
    public void StartGenerationProcess()
    {
        if (Height <= 0 || Width <= 0)
        {
            //EditorUtility.DisplayDialog("Empty Map", "The height and/or width = 0", "Coolio");
            return;
        }
        GenerationMap.AttachTiles();
        CreatePaths.AttachTiles(GetCurrentBiomeTileSet().Road, GetCurrentBiomeTileSet().Shallows, GetCurrentBiomeTileSet().Water);

        //Reset map
        GenerationMap.CreateEmptyMap(Width);
        forestGenerator.ResetTrees();

        switch (SelectedMapTypeX)
        {
        case MapTypeX.Plains:
            GeneratePlains();
            break;

        case MapTypeX.Costal:
            GenerateCostal();
            break;

        case MapTypeX.Islands:
            GenerateIslands();
            break;

        default:
            GeneratePlains();
            break;
        }



        //RandomTilesMap rtm = new RandomTilesMap();
        //rtm.GenerateRandomTileMap(GenerationMap, tilePool.GetTileSetFromBiomeType(SelectedMapType));

        //CreateNoiseBlob.CreateBlobAtPosition(GenerationMap, new MapPoint(30, 30),2, tilePool.GetWaterTile());

        //forestGenerator.AddTreeToMap(new MapPoint(10, 10));
        //forestGenerator.CreateTreeBlobAtPosition(GenerationMap, new MapPoint(24, 24), 2);

        GenerationMap.ApplySandNextToWater();
        GenerationMap.GenerateMap();

        MoveGamePlayCam();
    }
    private void GeneratePaths()
    {
        int numPaths = UnityEngine.Random.Range(1, 3);
        int p        = 0;

        while (p < numPaths)
        {
            bool newStartAndEnd = true;

            int minLength = 0;
            switch (Width)
            {
            case 72:
                minLength = 1296;
                break;

            case 96:
                minLength = 2304;
                break;

            case 120:
                minLength = 3600;
                break;

            case 144:
                minLength = 5184;
                break;

            case 200:
                minLength = 10000;
                break;

            //case 255:
            //    DifferentSizeIslands.GenerateGiganticIslands(GenerationMap, tilePool.GetTileSetFromBiomeType(SelectedMapBiome)[0]);
            //    break;
            default:
                break;
            }

            int startX = 0, startY = 0, endX = 0, endY = 0;

            while (newStartAndEnd)
            {
                int startAxis = UnityEngine.Random.Range(0, 4);
                int pathStart = UnityEngine.Random.Range(0, Width);

                switch (startAxis)
                {
                case 0:
                    startX = 0;
                    startY = UnityEngine.Random.Range(0, Height - 1);
                    break;

                case 1:
                    startX = UnityEngine.Random.Range(0, Width - 1);
                    startY = 0;
                    break;

                case 2:
                    startX = Width - 1;
                    startY = UnityEngine.Random.Range(0, Height - 1);
                    break;

                case 3:
                    startX = UnityEngine.Random.Range(0, Width - 1);
                    startY = Height - 1;
                    break;
                }

                endX = UnityEngine.Random.Range(0, Width - 1);
                endY = UnityEngine.Random.Range(0, Height - 1);

                int distX = Math.Abs(startX - endX);
                int distY = Math.Abs(startY - endY);

                if ((distX * distX) + (distY * distY) > minLength)
                {
                    if (GenerationMap.GetTileAtPos(new MapPoint(startX, startY)) != GetCurrentBiomeTileSet().Water&& GenerationMap.GetTileAtPos(new MapPoint(endX, endY)) != GetCurrentBiomeTileSet().Water)
                    {
                        newStartAndEnd = false;
                    }
                }
            }

            int previousTurnX = startX;
            int previousTurnY = startY;

            int numTurns = UnityEngine.Random.Range(1, 4);
            int t        = 0;

            while (t < numTurns)
            {
                int randTurnX = 0;
                int randTurnY = 0;

                if (previousTurnX > endX)
                {
                    randTurnX = UnityEngine.Random.Range(previousTurnX, endX);
                }
                else if (previousTurnX == endX)
                {
                    randTurnX = endX;
                }
                else if (previousTurnX < endX)
                {
                    randTurnX = UnityEngine.Random.Range(endX, previousTurnX);
                }

                if (previousTurnY > endY)
                {
                    randTurnY = UnityEngine.Random.Range(previousTurnY, endY);
                }
                else if (previousTurnY == endY)
                {
                    randTurnY = endY;
                }
                else if (previousTurnY < endY)
                {
                    randTurnY = UnityEngine.Random.Range(endY, previousTurnY);
                }

                CreatePaths.CreatePathBetween2Points(new MapPoint(previousTurnX, previousTurnY), new MapPoint(randTurnX, randTurnY));

                previousTurnX = randTurnX;
                previousTurnY = randTurnY;
                t++;
            }

            CreatePaths.CreatePathBetween2Points(new MapPoint(previousTurnX, previousTurnY), new MapPoint(endX, endY));


            //CreatePaths.CreatePathBetween2Points(new MapPoint(startX, startY), new MapPoint(endX, endY));
            Debug.Log("Start: " + startX + "," + startY + "  || End: " + endX + "," + endY);

            //CreatePaths.CreatePathBetween2Points(new MapPoint(10, 5), new MapPoint(20, 30));
            //CreatePaths.CreatePathBetween2Points(new MapPoint(20, 30), new MapPoint(40, 35));
            p++;
        }
    }