Esempio n. 1
0
        /// <summary>
        /// Maze to save the maze on a file
        /// </summary>
        /// <param name="mazeData"></param>
        public static void SaveMazeOnFile(MazeJSONData mazeData)
        {
            string jsonString = LitJson.JsonMapper.ToJson(mazeData);

            string root = Application.dataPath + PATHJSONFILES;

            if (!Directory.Exists(root))
            {
                Directory.CreateDirectory(root);
            }

            // Check path
            string path = root + mazeData.Name + ".json";

            if (File.Exists(path))
            {
                File.Delete(path);
            }

            using (FileStream fs = File.Create(path))
            {
                byte[] info = new System.Text.UTF8Encoding(true).GetBytes(jsonString);
                fs.Write(info, 0, info.Length);
                fs.Close();
            }
        }
Esempio n. 2
0
        public static bool LoadMazeJSON(string nameMaze, out MazeJSONData mazeData)
        {
            mazeData = null;
            // Load data from resources
            string pathFile = "MazeDataGenerated/" + nameMaze;

            TextAsset text_asset = (TextAsset)Resources.Load(pathFile, typeof(TextAsset));

            if (text_asset == null)
            {
                Debug.Log("ERROR: Could not find file: Assets/Resources/" + pathFile);
                return(false);
            }

            string json_string = text_asset.ToString();

            if (!string.IsNullOrEmpty(json_string))
            {
                mazeData = JsonMapper.ToObject <MazeJSONData>(json_string);
                return(true);
            }

            return(false);
        }
Esempio n. 3
0
        public void GenerateRandomDataMaze(string nameMaze, int numberColumns, int numberRows)
        {
            // Initialize grid and list active tiles
            TileData[,]  grid = new TileData[numberColumns, numberRows];

            // Generate a temporary list of tiles
            List <TileData> lActiveTiles = new List <TileData>();

            int numberRoom = 0;

            // Gets first tile in random coord
            IVector2 firstCoord = new IVector2(Random.Range(0, numberColumns), Random.Range(0, numberRows));
            TileData firstTile  = new TileData(firstCoord);

            //firstTile.Room = numberRoom;

            grid[firstCoord.Column, firstCoord.Row] = firstTile;
            lActiveTiles.Add(firstTile);

            // Generate the rest of the tiles until the list is empty
            while (lActiveTiles.Count > 0)
            {
                // Gets random index to select next tile
                int      cIndex = Random.Range(0, lActiveTiles.Count - 1);
                TileData cTile  = lActiveTiles[cIndex];

                // Check if the current tile doesn't have all of the edges already defined (it already has boxed by 4 edges)
                if (!cTile.IsBoxed())
                {
                    // Get a random direction from the current tile
                    MazeDirection randomDir = cTile.GetRandomUnboxedDirection();
                    // Gets the coords for the random direction + current tile (this way we can get the new tile)
                    IVector2 newCoords = cTile.Coords + randomDir.ToIntVector2();

                    // Check if these coords are within the maze boundaries
                    bool coordsInBoundaries = ((newCoords.Column >= 0) && (newCoords.Column < numberColumns) &&
                                               (newCoords.Row >= 0) && (newCoords.Row < numberRows));
                    if (coordsInBoundaries)
                    {
                        // Gets the tile for this coords
                        TileData nextTile = grid[newCoords.Column, newCoords.Row];
                        // This tile doesn't exist yet, create the cell and a passage between the current tile and this new one
                        if (nextTile == null)
                        {
                            nextTile = new TileData(newCoords);

                            // Add tile to the grid
                            grid[newCoords.Column, newCoords.Row] = nextTile;


                            // Add passage
                            // Sets a passage for the random edge for the current tile
                            cTile.SetEdge(randomDir, MazeCellEdge.TypeEdgeEnum.PASSAGE);

                            // Sets the opposite for this random direction or edge for the next tile as a Door
                            // For instance> if random dir for current tile was right, next tile has left as edge
                            nextTile.SetEdge(randomDir.GetOpposite(), MazeCellEdge.TypeEdgeEnum.PASSAGE);
                            // Both tiles are in the same room
                            //nextTile.Room = numberRoom;

                            // Add this nextTile to active tiles
                            lActiveTiles.Add(nextTile);
                        }
                        else
                        {
                            // Tile exits create a wall
                            // Sets a wall for the random edge for the current tile
                            cTile.SetEdge(randomDir, MazeCellEdge.TypeEdgeEnum.WALL);
                        }
                    }
                    else
                    {
                        // coords not in boundary, create a wall for the current cell
                        // Sets a wall for the random edge for the current tile
                        cTile.SetEdge(randomDir, MazeCellEdge.TypeEdgeEnum.WALL);
                    }
                }
                else
                {
                    // Remove the tile from the active tiles
                    lActiveTiles.RemoveAt(cIndex);
                }
            }

            // Save in JSON
            Debug.Log("[MazeGenerator] Saving in JSON file ");

            MazeJSONData mazeData = new MazeJSONData();

            mazeData.Columns     = numberColumns;
            mazeData.Rows        = numberRows;
            mazeData.NumberRooms = numberRoom + 1;
            mazeData.Name        = nameMaze;
            //mazeData.StartLocation = new IVector2();
            //mazeData.EndLocation = new IVector2();

            for (int iCol = 0; iCol < numberColumns; ++iCol)
            {
                for (int iRow = 0; iRow < numberRows; ++iRow)
                {
                    mazeData.AddTileData(grid[iCol, iRow]);

                    /*Debug.Log("Tile(" + iCol + "x" + iRow + ") - Coord ( " + grid[iCol, iRow].Coords.Column + "," + grid[iCol, iRow].Coords.Row + ")");
                     * for (int iEdge = 0; iEdge < grid[iCol, iRow].Edges.Length; iEdge++)
                     * {
                     *  Debug.Log("Edge " + ((MazeDirection)iEdge).ToString() + ":" + grid[iCol, iRow].Edges[iEdge].ToString());
                     * }*/
                }
            }

            Debug.Log("Saving " + mazeData.Name + " to JSON...");

            MazeJSONTool.SaveMazeOnFile(mazeData);

            if (OnEndGenerateJSONMaze != null)
            {
                OnEndGenerateJSONMaze("");
            }
        }
Esempio n. 4
0
        public void GenerateDataMazeByPath(string nameMaze, int numberColumns, int numberRows, List <IVector2> PathCoords)
        {
            // Initialize grid and list active tiles
            TileData[,] grid = new TileData[numberColumns, numberRows];

            // Set all tiles to invisible
            for (int iCol = 0; iCol < numberColumns; ++iCol)
            {
                for (int iRow = 0; iRow < numberRows; ++iRow)
                {
                    IVector2 currentCoords = new IVector2(iCol, iRow);
                    TileData cTile         = new TileData(currentCoords);
                    cTile.TileType = MazeCell.ETypeCell.INVISIBLE;

                    // Check if this tile is in coords
                    for (int iTile = 0; iTile < PathCoords.Count; iTile++)
                    {
                        if (currentCoords == PathCoords[iTile])
                        {
                            cTile.TileType = MazeCell.ETypeCell.NONE;
                            // Add walls
                            for (int iEdge = 0; iEdge < MazeDirections.NumberDirections; iEdge++)
                            {
                                cTile.SetEdge((MazeDirection)iEdge, MazeCellEdge.TypeEdgeEnum.WALL);
                            }

                            break;
                        }
                    }
                    //Add tile
                    grid[iCol, iRow] = cTile;
                }
            }


            // Convertion between direction and a 2D Vector
            IVector2[] m_directions =
            {
                // UP
                new IVector2(0,   1),
                // RIGHT
                new IVector2(1,   0),
                // DOWN
                new IVector2(0,  -1),
                // LEFT
                new IVector2(-1, 0)
            };

            // Follow the path and open walls
            // Check if this tile is in coords
            for (int iTile = 0; iTile < (PathCoords.Count - 1); iTile++)
            {
                IVector2 currentCoords = PathCoords[iTile];

                // Next tile
                int nextTile = iTile + 1;

                // Check if next tile is the last one, then next tile would be the first one
                if (nextTile >= PathCoords.Count)
                {
                    break;
                    //nextTile = 0;
                }

                IVector2 nextCoords = PathCoords[nextTile];


                // Check coords
                // Same column (move up or down)
                MazeDirection moveDirection = MazeDirection.UP;
                bool          findDir       = false;
                if (currentCoords.Column == nextCoords.Column)
                {
                    // Check if up or down
                    if (currentCoords.Row < nextCoords.Row)
                    {
                        moveDirection = MazeDirection.UP;
                        findDir       = true;
                    }
                    else
                    {
                        moveDirection = MazeDirection.DOWN;
                        findDir       = true;
                    }
                }
                else if (currentCoords.Row == nextCoords.Row)  // Same row, move left or right
                {
                    if (currentCoords.Column < nextCoords.Column)
                    {
                        moveDirection = MazeDirection.RIGHT;
                        findDir       = true;
                    }
                    else
                    {
                        moveDirection = MazeDirection.LEFT;
                        findDir       = true;
                    }
                }

                if (findDir)
                {
                    // Set new edge
                    TileData cTile = grid[currentCoords.Column, currentCoords.Row];
                    cTile.SetEdge(moveDirection, MazeCellEdge.TypeEdgeEnum.PASSAGE);
                    grid[currentCoords.Column, currentCoords.Row] = cTile;


                    // Set next tile
                    TileData nTile = grid[nextCoords.Column, nextCoords.Row];
                    nTile.SetEdge(moveDirection.GetOpposite(), MazeCellEdge.TypeEdgeEnum.PASSAGE);
                    grid[nextCoords.Column, nextCoords.Row] = nTile;
                }
            }

            for (int iCol = 0; iCol < numberColumns; ++iCol)
            {
                for (int iRow = 0; iRow < numberRows; ++iRow)
                {
                    Debug.LogFormat("Tile {0}x{1}", iCol, iRow);
                    // Add walls
                    for (int iEdge = 0; iEdge < MazeDirections.NumberDirections; iEdge++)
                    {
                        Debug.LogFormat("Edge {0} : {1}", (MazeDirection)iEdge, grid[iCol, iRow].Edges[iEdge].ToString());
                    }
                }
            }

            // Save in JSON
            Debug.Log("[MazeGenerator] Saving in JSON file ");

            MazeJSONData mazeData = new MazeJSONData();

            mazeData.Columns     = numberColumns;
            mazeData.Rows        = numberRows;
            mazeData.NumberRooms = 0;
            mazeData.Name        = nameMaze;
            //mazeData.StartLocation = new IVector2();
            //mazeData.EndLocation = new IVector2();

            for (int iCol = 0; iCol < numberColumns; ++iCol)
            {
                for (int iRow = 0; iRow < numberRows; ++iRow)
                {
                    mazeData.AddTileData(grid[iCol, iRow]);

                    /*Debug.Log("Tile(" + iCol + "x" + iRow + ") - Coord ( " + grid[iCol, iRow].Coords.Column + "," + grid[iCol, iRow].Coords.Row + ")");
                     * for (int iEdge = 0; iEdge < grid[iCol, iRow].Edges.Length; iEdge++)
                     * {
                     *  Debug.Log("Edge " + ((MazeDirection)iEdge).ToString() + ":" + grid[iCol, iRow].Edges[iEdge].ToString());
                     * }*/
                }
            }

            Debug.Log("Saving " + mazeData.Name + " to JSON...");

            MazeJSONTool.SaveMazeOnFile(mazeData);

            if (OnEndGenerateJSONMaze != null)
            {
                OnEndGenerateJSONMaze("");
            }
        }