internal void GenerateEnvorionment(
        ushort[,] map,
        MeshGenerator.SquareGrid squareGrid,
        ICollection <MapGenerator.Room> rooms,
        ICollection <MapGenerator.Passage> passages)
    {
        Init();

        PrepareMainRoom(rooms);

        foreach (MapGenerator.Passage passage in passages)
        {
            foreach (MapGenerator.Coord coord in passage.passageCoords)
            {
                MeshGenerator.ControlNode stoneNode = squareGrid.controlNodes[coord.tileX, coord.tileY];
                Vector3 stonePosition = stoneNode.position;

                GameObject stoneObject = Instantiate(stonePrefab, stonePosition + stonePrefab.transform.position, stonePrefab.transform.rotation);
                stoneObject.transform.parent = environment.transform;
                stoneObject.layer            = environment.layer;
                stoneObject.isStatic         = environment.isStatic;

                map[stoneNode.mapCoords.tileX, stoneNode.mapCoords.tileY] = (ushort)EnvironmentObjectType.Stone;
            }
        }

        PreparePlayerStartPosition(map, squareGrid);
    }
    private void PreparePlayerStartPosition(ushort[,] map, MeshGenerator.SquareGrid squareGrid)
    {
        if (mainRoom == null)
        {
            return;
        }

        int  tries = 0;
        bool valid = false;

        do
        {
            MapGenerator.Coord playerStartCoord = mainRoom.tiles[UnityEngine.Random.Range(0, mainRoom.tiles.Count - 1)];
            playerStartNode = squareGrid.controlNodes[playerStartCoord.tileX, playerStartCoord.tileY];

            valid = playerStartNode != null &&
                    !playerStartNode.active && // active means wall
                    map[playerStartNode.mapCoords.tileX, playerStartNode.mapCoords.tileY] == (ushort)EnvironmentObjectType.Void;
        } while (!valid && tries++ <= mainRoom.tiles.Count);

        if (playerStartNode == null || playerStartNode.active)
        {
            Debug.Log("Can't find player start node");
        }
        else
        {
            map[playerStartNode.mapCoords.tileX, playerStartNode.mapCoords.tileY] = (ushort)EnvironmentObjectType.PlayerStart;
        }
    }
Exemple #3
0
    internal void InitSpawn(
        ushort[,] map,
        MeshGenerator.SquareGrid squareGrid,
        List <MapGenerator.Room> rooms,
        HashSet <MapGenerator.Passage> passages)
    {
        foreach (MapGenerator.Room room in rooms)
        {
            MapGenerator.Coord enemySpawnCoord = default(MapGenerator.Coord);

            int  tries = 0;
            bool match = false;

            do
            {
                MapGenerator.Coord curCoord = room.tiles[UnityEngine.Random.Range(0, room.tiles.Count)];

                if (map[curCoord.tileX, curCoord.tileY] == (ushort)EnvironmentObjectType.Void)
                {
                    enemySpawnCoord = curCoord;
                    match           = true;
                    break;
                }
            } while (tries++ <= 5);

            if (!match)
            {
                continue;
            }

            Vector3 enemyPosition = squareGrid.controlNodes[enemySpawnCoord.tileX, enemySpawnCoord.tileY].position;

            GameObject enemyObject = Instantiate(enemyPrefab, enemyPosition + enemyPrefab.transform.position, enemyPrefab.transform.rotation);
            enemyObject.transform.parent = enemiesHolder.transform;
            enemyObject.layer            = enemiesHolder.layer;
        }
    }