/// <summary>
    /// Editor method. Add a new preset.
    /// </summary>
    static void AddNewPreset(TileWorldConfiguration _config)
    {
        //blocks.Add(new TileSets());
        _config.presets.Add(new TileWorldConfiguration.PresetsConfiguration());

        ResizeStringArray(false, _config.presets.Count - 1, _config);
    }
    /// <summary>
    /// Editor method. Duplicate a preset
    /// </summary>
    /// <param name="_index"></param>
    static void DuplicatePreset(int _index, TileWorldConfiguration _config)
    {
        AddNewPreset(_config);

        if (_config.presets[_index].tiles.Count > 1)
        {
            for (int t1 = 0; t1 < _config.presets[_index].tiles.Count - 1; t1++)
            {
                _config.presets[_config.presets.Count - 1].tiles.Add(new TileWorldConfiguration.TileSets());
            }
        }


        for (int t2 = 0; t2 < _config.presets[_index].tiles.Count; t2++)
        {
            _config.presets[_config.presets.Count - 1].tiles[t2].tileI  = _config.presets[_index].tiles[t2].tileI;
            _config.presets[_config.presets.Count - 1].tiles[t2].tileC  = _config.presets[_index].tiles[t2].tileC;
            _config.presets[_config.presets.Count - 1].tiles[t2].tileCi = _config.presets[_index].tiles[t2].tileCi;
            _config.presets[_config.presets.Count - 1].tiles[t2].tileB  = _config.presets[_index].tiles[t2].tileB;
            _config.presets[_config.presets.Count - 1].tiles[t2].tileF  = _config.presets[_index].tiles[t2].tileF;

            _config.presets[_config.presets.Count - 1].tiles[t2].floorOffset = _config.presets[_index].tiles[t2].floorOffset;
            _config.presets[_config.presets.Count - 1].tiles[t2].blockOffset = _config.presets[_index].tiles[t2].blockOffset;

            _config.presets[_config.presets.Count - 1].tiles[t2].yRotationOffset = new float[_config.presets[_index].tiles[t2].yRotationOffset.Length];

            for (int f = 0; f < _config.presets[_index].tiles[t2].yRotationOffset.Length; f++)
            {
                _config.presets[_config.presets.Count - 1].tiles[t2].yRotationOffset[f] = _config.presets[_index].tiles[t2].yRotationOffset[f];
            }
        }
    }
    public bool[,] Generate(TileWorldConfiguration _config, out Vector3 _startPosition, out Vector3 _endPosition)
    {
        // Assign properties from config
        width  = _config.global.width;
        height = _config.global.height;

        linear            = _config.mazeAlgorithm.linear;
        useRandomStartPos = _config.mazeAlgorithm.useRandomStartPos;

        if (!_config.mazeAlgorithm.useRandomStartPos)
        {
            startPosition = new Vector3(_config.mazeAlgorithm.startPos.x, 0, _config.mazeAlgorithm.startPos.y);
        }

        mazeMap = new bool[width, height];
        mazeMap = GenerateMaze(height, width);

        _startPosition = startPosition;

        // Find end position after generation
        var _pos = FindEndPosition(mazeMap);

        _endPosition = new Vector3(_pos.x, 0, _pos.y);

        return(mazeMap);
    }
    // Implemented interface
    public bool[,] Generate(TileWorldConfiguration _config, out Vector3 _startPosition, out Vector3 _endPosition)
    {
        // Assign properties from config
        width  = _config.global.width;
        height = _config.global.height;

        createCircleRooms   = _config.simpleDungeonAlgorithm.createCircleRooms;
        minCircleRoomRadius = _config.simpleDungeonAlgorithm.minCircleRoomRadius;
        maxCircleRoomRadius = _config.simpleDungeonAlgorithm.maxCircleRoomRadius;

        roomCount              = _config.simpleDungeonAlgorithm.roomCount;
        minRoomSizeHeight      = _config.simpleDungeonAlgorithm.minRoomSizeHeight;
        minRoomSizeWidth       = _config.simpleDungeonAlgorithm.minRoomSizeWidth;
        maxRoomSizeHeight      = _config.simpleDungeonAlgorithm.maxRoomSizeHeight;
        maxRoomSizeWidth       = _config.simpleDungeonAlgorithm.maxRoomSizeWidth;
        allowRoomIntersections = _config.simpleDungeonAlgorithm.allowRoomIntersections;
        corridorWidth          = _config.simpleDungeonAlgorithm.minCorridorWidth;


        GenerateDungeonMap();

        _startPosition = startPosition;
        _endPosition   = endPosition;

        // return map
        return(dungeonMap);
    }
    static void ResizeStringArray(bool _remove, int _index, TileWorldConfiguration _config)
    {
        List <string> _tmpString = new List <string>();

        for (int i = 0; i < _config.ui.availablePresets.Length; i++)
        {
            _tmpString.Add(_config.ui.availablePresets[i]);
        }

        if (_remove)
        {
            _tmpString.RemoveAt(_index);

            _config.ui.availablePresets = new string[_tmpString.Count];

            for (int m = 0; m < _config.ui.availablePresets.Length; m++)
            {
                _config.ui.availablePresets[m] = _tmpString[m];
            }
        }
        else
        {
            _tmpString.Add("Preset: " + _config.ui.availablePresets.Length.ToString());


            _config.ui.availablePresets = new string[_tmpString.Count];
            for (int a = 0; a < _tmpString.Count; a++)
            {
                _config.ui.availablePresets[a] = "Preset: " + a;
            }
        }
    }
 /// <summary>
 /// Editor method. Delete preset
 /// </summary>
 /// <param name="_inx"></param>
 static void DeletePreset(int _inx, TileWorldConfiguration _config)
 {
     if (_inx != 0)
     {
         _config.presets.RemoveAt(_inx);
         ResizeStringArray(true, _inx, _config);
     }
 }
    public void OnEnable()
    {
        config = target as TileWorldConfiguration;

        //get all available algorithms by name
        TileWorldAlgorithmLookup.GetAlgorithmNames(out algorithmNames);

        LoadResources();
    }
    //Do Simulation steps
    //-------------------
    bool[,] DoSimulationStep(bool[,] oldMap, TileWorldConfiguration _config)
    {
        bool[,] newMap = new bool[_config.global.width, _config.global.height];

        //Loop over each row and column of the map
        for (int x = 0; x < oldMap.GetLength(0); x++)
        {
            for (int y = 0; y < oldMap.GetLength(1); y++)
            {
                int nbs = TileWorldNeighbourCounter.CountAllNeighbours(oldMap, x, y, 1, true);
                //The new value is based on our simulation rules
                //First, if a cell is alive but has too few neighbours, kill it.
                if (oldMap[x, y])
                {
                    if (nbs < _config.cellularAlgorithm.deathLimit)
                    {
                        newMap[x, y] = false;
                    }
                    else
                    {
                        newMap[x, y] = true;
                    }
                    //make sure the cavern is always closed on the border edges
                    if (_config.global.invert)
                    {
                        if (x < 1 || x >= _config.global.width - 1 || y >= _config.global.height - 1 || y < 1)
                        {
                            newMap[x, y] = true;
                        }
                    }
                }
                //Otherwise, if the cell is dead now, check if it has the right number of neighbours to be 'born'
                else
                {
                    if (nbs > _config.cellularAlgorithm.birthLimit)
                    {
                        newMap[x, y] = true;
                    }
                    else
                    {
                        newMap[x, y] = false;
                    }
                    //make sure the cavern is always closed on the border edges
                    if (_config.global.invert)
                    {
                        if (x < 1 || x >= _config.global.width - 1 || y >= _config.global.height - 1 || y < 1)
                        {
                            newMap[x, y] = true;
                        }
                    }
                }
            }
        }

        return(newMap);
    }
Esempio n. 9
0
    public bool[,] ApplyMask(bool[,] _map, TileWorldCreator _creator, TileWorldConfiguration _config)
    {
        //create a new temp map
        bool[,] _tmpMap = new bool[_map.GetLength(0), _map.GetLength(1)];
        //set the circle radius
        float _radius = 5;

        //loop through the maps x and y length
        for (int x = 0; x < _config.global.width; x++)
        {
            for (int y = 0; y < _config.global.height; y++)
            {
                //get center point of the map
                Vector2 _center = new Vector2(_config.global.width / 2, _config.global.height / 2);
                //current tile position
                Vector2 _currPos = new Vector2(x, y);
                //get distance from its current cell position to the center of the map
                float _dist = Vector2.Distance(_center, _currPos);

                //check if the current distance is not to far away from its radius
                //and set the appropriate values depending of if invert is set to false or true
                if (_dist <= _radius)
                {
                    if (!_config.global.invert)
                    {
                        _tmpMap[x, y] = false;
                    }
                    else
                    {
                        _tmpMap[x, y] = true;
                    }
                }
                else
                {
                    if (!_config.global.invert)
                    {
                        _tmpMap[x, y] = true;
                    }
                    else
                    {
                        _tmpMap[x, y] = false;
                    }
                }
            }
        }

        //return the map
        return(_tmpMap);
    }
Esempio n. 10
0
    public bool[,] ApplyMask(bool[,] _map, TileWorldCreator _creator, TileWorldConfiguration _config)
    {
        //create a temp map
        bool[,] _tmpMap = new bool[_map.GetLength(0), _map.GetLength(1)];

        //loop through the maps x and y length
        for (int y = 0; y < _map.GetLength(1); y++)
        {
            for (int x = 0; x < _map.GetLength(0); x++)
            {
                //here we are using the TileWorldNeighbourCounter to count
                //the neighbour cells of the current cell from the map.
                int _c = 0;
                _c = TileWorldNeighbourCounter.CountInnerTerrainBlocks(_map, x, y, 1, _config.global.invert);

                //if invert is set to false in the settings of TileWorldCreator
                if (!_config.global.invert)
                {
                    //if the current cell has got 8 neighbours
                    //then the cell is not located on the border of the island
                    if (_c == 8 || _map[x, y])
                    {
                        _tmpMap[x, y] = true;
                    }
                    //else we can be sure that the current cell is a border cell
                    else
                    {
                        _tmpMap[x, y] = false;
                    }
                }
                else
                {
                    //inverted tmpMap values when invert is set to true.
                    if (_c == 8)
                    {
                        _tmpMap[x, y] = false;
                    }
                    else
                    {
                        _tmpMap[x, y] = true;
                    }
                }
            }
        }

        //return the modified map
        return(_tmpMap);
    }
    public static void ShowConfigurationEditor(TileWorldConfiguration _config)
    {
        if (_config == null)
        {
            EditorGUILayout.HelpBox("Please create or load a configuration file.", MessageType.Info);
            return;
        }


        //Show global settings foldout
        ShowGlobalSettingsFoldout(_config);
        //Show preset settings foldout
        ShowPresetSettingsFoldout(_config);

        EditorUtility.SetDirty(_config);
    }
    static void ShowPresetSettingsFoldout(TileWorldConfiguration _config)
    {
        // Show preset settings
        GUI.color = colorGUIFoldout2;
        EditorGUILayout.BeginVertical("Box");
        GUI.color = Color.white;
        GUILayout.BeginHorizontal("Box");
        _config.ui.showPresetSettings = GUILayout.Toggle(_config.ui.showPresetSettings, ("Presets"), GUI.skin.GetStyle("foldout"), GUILayout.ExpandWidth(true), GUILayout.Height(18));

        if (GUILayout.Button(iconUndockWindow, "ToolbarButton", GUILayout.Width(25)))
        {
            TileWorldCreator _c = GameObject.FindObjectOfType <TileWorldCreator>();
            TileWorldCreatorEditorPresetsWindow.InitWindow(_c.gameObject);
        }

        GUILayout.EndHorizontal();

        if (_config.ui.showPresetSettings)
        {
            ShowPresetSettings(_config);
        }
        EditorGUILayout.EndVertical();
    }
    public static void ShowPresetSettings(TileWorldConfiguration _config)
    {
        GUILayout.BeginVertical("Box", GUILayout.ExpandWidth(false));


        if (GUILayout.Button("Add new preset"))
        {
            AddNewPreset(_config);
        }

        EditorGUILayout.BeginVertical("TextArea");


        for (int i = 0; i < _config.presets.Count; i++)
        //for (int i = 0; i < creator.blocks.Count; i ++)
        {
            GUI.color = guiBlue;
            GUILayout.BeginVertical("Box");
            GUI.color = Color.white;

            GUILayout.BeginHorizontal();

            _config.presets[i].showPresetEditor = GUILayout.Toggle(_config.presets[i].showPresetEditor, ("Preset: " + i), GUI.skin.GetStyle("foldout"), GUILayout.ExpandWidth(true), GUILayout.Height(18));

            //duplicate current preset
            if (GUILayout.Button(iconDuplicate, "ToolbarButton", GUILayout.Height(18), GUILayout.Width(25)))
            {
                DuplicatePreset(i, _config);
            }

            //delete current preset
            GUI.color = guiRed;
            if (i > 0)
            {
                if (GUILayout.Button("x", "ToolbarButton", GUILayout.Height(18), GUILayout.Width(25)))
                {
                    DeletePreset(i, _config);
                }
            }
            GUI.color = Color.white;

            GUILayout.EndHorizontal();

            if (i < _config.presets.Count)
            {
                if (_config.presets[i].showPresetEditor)
                {
                    GUILayout.BeginHorizontal();
                    //GUILayout.Label("");

                    if (GUILayout.Button("+ random tileset", GUILayout.Height(18), GUILayout.Width(120)))
                    {
                        AddNewTileSet(i, _config);
                    }

                    GUILayout.EndHorizontal();

                    //TILE SETS
                    //---------

                    for (int t = 0; t < _config.presets[i].tiles.Count; t++)
                    {
                        GUILayout.BeginVertical("TextArea");

                        //------------------------------------
                        GUILayout.BeginHorizontal("Box");

                        // Duplicate random tileset
                        if (GUILayout.Button(iconDuplicate, "MiniButton", GUILayout.Height(18), GUILayout.Width(20)))
                        {
                            DuplicateTileSet(i, t, _config);
                        }

                        GUI.color = guiRed;
                        if (t > 0)
                        {
                            if (GUILayout.Button("x", "MiniButton", GUILayout.Height(18), GUILayout.Width(20)))
                            {
                                DeleteTileSet(i, t, _config);
                            }
                        }
                        GUI.color = Color.white;

                        GUILayout.Label("Tileset: " + t);

                        GUILayout.EndHorizontal();
                        //--------------------------------------


                        DragDropArea(i, t, _config);


                        if (t < _config.presets[i].tiles.Count)
                        {
                            GUILayout.BeginHorizontal();
                            GUILayout.BeginVertical();
                            GUILayout.Label(guiPresetImage1, GUILayout.MaxWidth(50), GUILayout.MaxHeight(50));
                            _config.presets[i].tiles[t].tileI = EditorGUILayout.ObjectField(_config.presets[i].tiles[t].tileI, typeof(GameObject), false, GUILayout.MaxWidth(50)) as GameObject;
                            GUILayout.Label("yRotOff:");
                            _config.presets[i].tiles[t].yRotationOffset[0] = EditorGUILayout.FloatField("", _config.presets[i].tiles[t].yRotationOffset[0], GUILayout.Width(50));
                            GUILayout.EndVertical();
                            GUILayout.FlexibleSpace();
                            GUILayout.BeginVertical();
                            GUILayout.Label(guiPresetImage2, GUILayout.MaxWidth(50), GUILayout.MaxHeight(50));
                            _config.presets[i].tiles[t].tileC = EditorGUILayout.ObjectField(_config.presets[i].tiles[t].tileC, typeof(GameObject), false, GUILayout.MaxWidth(50)) as GameObject;
                            GUILayout.Label("yRotOff:");
                            _config.presets[i].tiles[t].yRotationOffset[1] = EditorGUILayout.FloatField("", _config.presets[i].tiles[t].yRotationOffset[1], GUILayout.Width(50));
                            GUILayout.EndVertical();
                            GUILayout.FlexibleSpace();
                            GUILayout.BeginVertical();
                            GUILayout.Label(guiPresetImage3, GUILayout.MaxWidth(50), GUILayout.MaxHeight(50));
                            _config.presets[i].tiles[t].tileCi = EditorGUILayout.ObjectField(_config.presets[i].tiles[t].tileCi, typeof(GameObject), false, GUILayout.MaxWidth(50)) as GameObject;
                            GUILayout.Label("yRotOff:");
                            _config.presets[i].tiles[t].yRotationOffset[2] = EditorGUILayout.FloatField("", _config.presets[i].tiles[t].yRotationOffset[2], GUILayout.Width(50));
                            GUILayout.EndVertical();
                            GUILayout.FlexibleSpace();
                            GUILayout.BeginVertical();
                            GUILayout.Label(guiPresetImage4, GUILayout.MaxWidth(50), GUILayout.MaxHeight(50));
                            _config.presets[i].tiles[t].tileB = EditorGUILayout.ObjectField(_config.presets[i].tiles[t].tileB, typeof(GameObject), false, GUILayout.MaxWidth(50)) as GameObject;
                            GUILayout.Label("yRotOff:");
                            _config.presets[i].tiles[t].yRotationOffset[3] = EditorGUILayout.FloatField("", _config.presets[i].tiles[t].yRotationOffset[3], GUILayout.Width(50));
                            GUILayout.EndVertical();
                            GUILayout.FlexibleSpace();
                            GUILayout.BeginVertical();
                            GUILayout.Label(guiPresetImage5, GUILayout.MaxWidth(50), GUILayout.MaxHeight(50));
                            _config.presets[i].tiles[t].tileF = EditorGUILayout.ObjectField(_config.presets[i].tiles[t].tileF, typeof(GameObject), false, GUILayout.MaxWidth(50)) as GameObject;
                            GUILayout.Label("yRotOff:");
                            _config.presets[i].tiles[t].yRotationOffset[4] = EditorGUILayout.FloatField("", _config.presets[i].tiles[t].yRotationOffset[4], GUILayout.Width(50));
                            GUILayout.EndVertical();
                            GUILayout.EndHorizontal();

                            GUILayout.Space(20);
                            _config.presets[i].tiles[t].blockOffset = EditorGUILayout.Vector3Field("block offset: ", _config.presets[i].tiles[t].blockOffset);
                            _config.presets[i].tiles[t].floorOffset = EditorGUILayout.Vector3Field("ground offset: ", _config.presets[i].tiles[t].floorOffset);
                        }

                        GUILayout.EndVertical();
                    }
                }
            }

            GUILayout.EndVertical();
        }
        GUILayout.EndVertical();


        GUILayout.EndVertical();
    }
    /// <summary>
    /// Implemented interface IAlgorithms
    /// </summary>
    public bool[,] Generate(TileWorldConfiguration _config, out Vector3 _startPosition, out Vector3 _endPosition)
    {
        //we do not set any start or end position for cellular map
        _startPosition = new Vector2(0, 0);
        _endPosition   = new Vector2(0, 0);

        //assign properties from config
        width              = _config.global.width;
        height             = _config.global.height;
        invert             = _config.global.invert;
        chanceToStartAlive = _config.cellularAlgorithm.chanceToStartAlive;

        cellularMap = new bool[width, height];

        cellularMap = initialiseMap(cellularMap);


        //run simulation step for number of steps
        //more steps results in smoother worlds
        for (int i = 0; i < _config.cellularAlgorithm.numberOfSteps; i++)
        {
            cellularMap = DoSimulationStep(cellularMap, _config);
        }

        // flood all smaller islands
        if (_config.cellularAlgorithm.floodUnjoined && (_config.global.width <= 150 || _config.global.height <= 150))
        {
            //count how many caverns our world has
            CountCaverns(cellularMap);

            cellularMap = FloodFill(cellularMap);
        }

        //flood holes floods all smaller holes inside of a map
        //Debug.Log(_config.cellularAlgorithm.floodHoles);
        if (_config.cellularAlgorithm.floodHoles && (_config.global.width <= 150 || _config.global.height <= 150))
        {
            CountWater(cellularMap);

            cellularMap = FloodFillWater(cellularMap);
        }


        // REMOVED DUE TO STACK OVERFLOW ISSUES
        //check if biggest island is big enough.
        //if not, regenerate map
        //bool _mapSizeOK = false;
        ////if (_config.global.randomSeed < 0)
        ////{
        //    if (islands.Count > 0)
        //    {
        //        for (int i = 0; i < islands.Count; i++)
        //        {
        //            if (islands[i].cellCount >= _config.cellularAlgorithm.minCellCount)
        //            {
        //                _mapSizeOK = true;
        //            }
        //        }
        //    }
        ////}

        //if (!_mapSizeOK)
        //{
        //    //Debug.Log("size to small");
        //    Generate(_config, out _startPosition, out _endPosition);
        //}

        return(cellularMap);
    }
Esempio n. 15
0
    public bool[,] Generate(TileWorldConfiguration _config, out Vector3 _startPosition, out Vector3 _endPosition)
    {
        _splitH = false;

        // assign values from config
        mapWidth    = _config.global.width;
        mapHeight   = _config.global.height;
        minHeight   = _config.bspDungeonAlgorithm.minBSPLeafHeight;
        minWidth    = _config.bspDungeonAlgorithm.minBSPLeafWidth;
        columnWidth = _config.bspDungeonAlgorithm.corridorWidth;

        dungeonMap = new bool[_config.global.width, _config.global.height];

        // Generate the BSP tree
        GenerateBSPTree();

        // assign rooms to map
        for (int r = 0; r < rooms.Count; r++)
        {
            for (int x = rooms[r].x; x < rooms[r].x + rooms[r].width; x++)
            {
                for (int y = rooms[r].y; y < rooms[r].y + rooms[r].height; y++)
                {
                    dungeonMap[x, y] = true;
                }
            }
        }

        // assign hallways to map
        for (int h = 0; h < hallways.Count; h++)
        {
            for (int x = hallways[h].x; x < hallways[h].x + hallways[h].width; x++)
            {
                for (int y = hallways[h].y; y < hallways[h].y + hallways[h].height; y++)
                {
                    dungeonMap[x, y] = true;
                }
            }
        }

        // clean up borders
        for (int x = 0; x < mapWidth; x++)
        {
            for (int y = 0; y < mapHeight; y++)
            {
                if (x == 0 || x == 1 || x == mapWidth - 1 || x == mapWidth - 2 || y == 0 || y == 1 || y == mapHeight - 1 || y == mapHeight - 2)
                {
                    dungeonMap[x, y] = false;
                }
            }
        }

        // assign start and end position
        // get random room as start position

        // use random start position
        //--------------------------------
        //var _rndStart = Random.Range(0, rooms.Count - 1);
        //_startPosition = new Vector3((rooms[_rndStart].width / 2) + rooms[_rndStart].x, 0, (rooms[_rndStart].height / 2) + rooms[_rndStart].y);
        //--------------------------------

        //use smallest room as start position
        //--------------------------------
        var _lastSquareSize = rooms[0].width * rooms[0].height;

        for (int r = 0; r < rooms.Count; r++)
        {
            var _squareSize = rooms[r].width * rooms[r].height;
            if (_squareSize < _lastSquareSize)
            {
                startPosition   = new Vector3((rooms[r].width / 2) + rooms[r].x, 0, (rooms[r].height / 2) + rooms[r].y);
                _lastSquareSize = _squareSize;
            }
        }
        //---------------------------------

        _startPosition = startPosition;

        // end position
        // instead of assigning the last room we will
        // get the room which is furthest away from the start position
        var _lastDistance = 0f;

        for (int r = 0; r < rooms.Count; r++)
        {
            var   _roomCenter = new Vector3((rooms[r].width / 2) + rooms[r].x, 0, (rooms[r].height / 2) + rooms[r].y);
            float _dist       = Vector3.Distance(_startPosition, _roomCenter);
            if (_dist > _lastDistance)
            {
                endPosition   = _roomCenter;
                _lastDistance = _dist;
            }
        }

        _endPosition = endPosition;

        return(dungeonMap);
    }
 /// <summary>
 /// Editor method. Duplicate tileset
 /// </summary>
 /// <param name="_presetIndex"></param>
 /// <param name="_tileIndex"></param>
 /// <param name="_config"></param>
 static void DuplicateTileSet(int _presetIndex, int _tileIndex, TileWorldConfiguration _config)
 {
     _config.presets[_presetIndex].tiles.Add(new TileWorldConfiguration.TileSets(_config.presets[_presetIndex].tiles[_tileIndex]));
 }
 /// <summary>
 /// Editor method. Delete tileset
 /// </summary>
 /// <param name="_presetIndex"></param>
 /// <param name="_tileIndex"></param>
 static void DeleteTileSet(int _presetIndex, int _tileIndex, TileWorldConfiguration _config)
 {
     _config.presets[_presetIndex].tiles.RemoveAt(_tileIndex);
 }
 /// <summary>
 /// Editor method. Add a new tileset to the given preset index
 /// </summary>
 /// <param name="_index"></param>
 static void AddNewTileSet(int _index, TileWorldConfiguration _config)
 {
     _config.presets[_index].tiles.Add(new TileWorldConfiguration.TileSets());
 }
    public bool[,] ApplyMask(bool[,] _map, TileWorldCreator _creator, TileWorldConfiguration _config)
    {
        bool[,] _tmpMap = new bool[_map.GetLength(0), _map.GetLength(1)];

        //get inner terrain cells
        for (int y = 0; y < _map.GetLength(1); y++)
        {
            for (int x = 0; x < _map.GetLength(0); x++)
            {
                int _c = 0;
                _c = TileWorldNeighbourCounter.CountInnerTerrainBlocks(_map, x, y, 1, _config.global.invert);

                if (!_config.global.invert)
                {
                    if (_c == 8)
                    {
                        _tmpMap[x, y] = false;
                    }
                    else
                    {
                        _tmpMap[x, y] = true;
                    }
                }
                else
                {
                    if (_c == 8)
                    {
                        _tmpMap[x, y] = true;
                    }
                    else
                    {
                        _tmpMap[x, y] = false;
                    }
                }
            }
        }

        //get random cells from inner terrain map
        bool[,] _newMap = new bool[_config.global.width, _config.global.height];
        for (int y = 0; y < _map.GetLength(1); y++)
        {
            for (int x = 0; x < _map.GetLength(0); x++)
            {
                float _rnd = Random.Range(0f, 1f);

                if (!_config.global.invert)
                {
                    //invert map if invert ist set to false
                    _newMap[x, y] = true;
                }


                if (_rnd < 0.3f)
                {
                    if (_config.global.invert)
                    {
                        if (_tmpMap[x, y])
                        {
                            _newMap[x, y] = true;
                        }
                    }
                    else
                    {
                        if (!_tmpMap[x, y])
                        {
                            _newMap[x, y] = false;
                        }
                    }
                }
            }
        }

        return(_newMap);
    }
    static void DragDropArea(int _i, int _t, TileWorldConfiguration _config)
    {
        Event evt       = Event.current;
        Rect  drop_area = GUILayoutUtility.GetRect(0.0f, 50.0f, GUILayout.ExpandWidth(true));

        GUI.Box(drop_area, "Drag and drop tile prefabs here for automatic assignment" + "\n (alphabetical order = tile assignment from left to right)");

        switch (evt.type)
        {
        case EventType.DragUpdated:
        case EventType.DragPerform:
            if (!drop_area.Contains(evt.mousePosition))
            {
                return;
            }

            DragAndDrop.visualMode = DragAndDropVisualMode.Copy;

            if (evt.type == EventType.DragPerform)
            {
                DragAndDrop.AcceptDrag();

                var           a        = 0;
                Object[]      _obj     = DragAndDrop.objectReferences;
                List <Object> _objList = new List <Object>();
                for (int o = 0; o < _obj.Length; o++)
                {
                    _objList.Add(_obj[o]);
                }

                _objList.Sort(CompareByName);

                for (int i = 0; i < _objList.Count; i++)
                {
                    if (a == 0)
                    {
                        _config.presets[_i].tiles[_t].tileI = _objList[i] as GameObject;
                    }
                    else if (a == 1)
                    {
                        _config.presets[_i].tiles[_t].tileC = _objList[i] as GameObject;
                    }
                    else if (a == 2)
                    {
                        _config.presets[_i].tiles[_t].tileCi = _objList[i] as GameObject;
                    }
                    else if (a == 3)
                    {
                        _config.presets[_i].tiles[_t].tileB = _objList[i] as GameObject;
                    }
                    else if (a >= 4)
                    {
                        _config.presets[_i].tiles[_t].tileF = _objList[i] as GameObject;
                    }

                    a++;
                }
            }
            break;
        }
    }
    public static void ShowGlobalSettings(TileWorldConfiguration _config)
    {
        var _editor = Editor.CreateEditor(_config);

        GUILayout.BeginVertical("Box");
        _config.global.worldName = EditorGUILayout.TextField("Name:", _config.global.worldName);
        _config.global.invert    = EditorGUILayout.Toggle("Invert:", _config.global.invert);
        //_config.global.floodUnjoined = EditorGUILayout.Toggle("Flood unjoined:", _config.global.floodUnjoined);
        //_config.global.floodHoles = EditorGUILayout.Toggle("Flood holes:", _config.global.floodHoles);
        _config.global.buildGroundTiles = EditorGUILayout.Toggle("Build ground tiles:", _config.global.buildGroundTiles);
        _config.global.mapOrientation   = (TileWorldConfiguration.GlobalConfiguration.MapOrientations)EditorGUILayout.EnumPopup("Map orientation: ", _config.global.mapOrientation);
        GUILayout.EndVertical();


        GUILayout.BeginVertical("Box");
        _config.global.layerCount = EditorGUILayout.IntField("Number of layers:", _config.global.layerCount);
        _config.global.layerInset = EditorGUILayout.IntField("Layer inset:", _config.global.layerInset);

        if (_config.global.layerCount > 1)
        {
            _config.global.buildOverlappingTiles = EditorGUILayout.Toggle("Build overlapping tiles", _config.global.buildOverlappingTiles);
        }
        GUILayout.EndVertical();


        GUILayout.BeginVertical("Box");
        _config.global.width       = EditorGUILayout.IntField("Grid width:", _config.global.width);
        _config.global.height      = EditorGUILayout.IntField("Grid height:", _config.global.height);
        _config.global.globalScale = EditorGUILayout.Slider("Scale:", _config.global.globalScale, 1, 100);
        _config.global.scaleTiles  = EditorGUILayout.Toggle("Scale tiles:", _config.global.scaleTiles);
        GUILayout.EndVertical();

        //SELECT MAP ALGORITHM
        GUILayout.BeginVertical("Box");

        GUILayout.BeginHorizontal();
        GUILayout.Label("Selected algorithm: ");
        _config.global.selectedAlgorithm = EditorGUILayout.Popup(_config.global.selectedAlgorithm, algorithmNames);

        // change properties based on algorithms to make sure the algorithm works properly
        if (algorithmNames[_config.global.selectedAlgorithm] == "MazeAlgorithm")
        {
            _config.global.invert = false;
        }

        GUILayout.EndHorizontal();

        if (algorithmNames[_config.global.selectedAlgorithm] == "CellularAlgorithm")
        {
            if (_config.cellularAlgorithm.minCellCount >= (_config.global.width * _config.global.height) * 0.5f)
            {
                EditorGUILayout.HelpBox("Minimum cell count size can only be max 50% of the width * height size of the map." + "\n" +
                                        "Try to set a lower minimum cell count", MessageType.Warning);
                _config.cellularAlgorithm.minCellCount = (_config.global.width * _config.global.height) / 2;
            }
        }

        //draw default algorithm attributes
        EditorGUI.indentLevel = 1;
        _editor.DrawDefaultInspector();
        EditorGUI.indentLevel = 0;

        EditorGUILayout.BeginVertical("Box");
        _config.global.randomSeed = EditorGUILayout.IntField("Random seed:", _config.global.randomSeed);


        //_config.global.minSize = EditorGUILayout.IntField("Minimum size:", _config.global.minSize);



        EditorGUILayout.EndVertical();

        GUILayout.EndVertical();


        GUILayout.BeginVertical("Box");
        GUILayout.Label("Merge settings:");

        EditorGUILayout.HelpBox("Cluster size defines the square size in tiles of a cluster." + "\n" +
                                "Please note that when merging the map, TileWorldCreator tries to merge all tiles inside of each cluster. If the result exceeds the max allowed vertex count an error occurs - Try the Automatic setting instead.", MessageType.Info);

        EditorGUILayout.BeginVertical("Box");
        EditorGUILayout.LabelField("Cluster Size:");

        _config.global.automaticClustersize = EditorGUILayout.Toggle("Automatic:", _config.global.automaticClustersize);

        GUI.enabled = !_config.global.automaticClustersize;
        _config.global.clusterSize = EditorGUILayout.IntField("Size:", _config.global.clusterSize);
        GUI.enabled = true;

        EditorGUILayout.EndVertical();
        _config.global.createMultiMaterialMesh = EditorGUILayout.Toggle("Multi material mesh: ", _config.global.createMultiMaterialMesh);
        _config.global.addMeshCollider         = EditorGUILayout.Toggle("Add mesh collider: ", _config.global.addMeshCollider);
        GUILayout.EndVertical();
    }