예제 #1
0
    private GameObject GenerateRoom()
    {
        int objectPerLevel = roomSizeX + roomSizeY / 4;
        RandomModelVectors        randomObjectVectors = GenerateVectorsForRandomObjects(objectPerLevel, difficulty);
        List <Vector2>            vectors             = new List <Vector2>();
        Dictionary <string, bool> setConstantObjects  = new Dictionary <string, bool>();
        var staticGameObjects = new List <GameObject>();
        var enemyGameObjects  = new List <GameObject>();

        GameObject tempRoom           = new GameObject("Room " + floorNumber);
        var        vectorsAroundSpawn = new List <Vector2>();

        foreach (var resource in Resources.LoadAll <GameObject>("Objects").Cast <GameObject>())
        {
            staticGameObjects.Add(resource);
        }
        foreach (var resource in Resources.LoadAll <GameObject>("Enemies").Cast <GameObject>())
        {
            enemyGameObjects.Add(resource);
        }

        #region tileGeneration

        for (int i = 0; i < 9; i++)
        {
            GameObject tile = new GameObject();
            tiles.Add(tile);
        }

        #endregion tileGeneration

        // Loop through the X and Y parameters and generate walls and floor.
        for (int row = 0; row < roomSizeX + 1; row++)
        {
            for (int col = 0; col < roomSizeY + 1; col++)
            {
                int posX = col * tileSize;
                int posY = row * -tileSize;
                vectorsAroundSpawn.AddRange(ObjectGenerators.GenerateDoors(tiles, tileSize, col, row, roomSizeY, roomSizeX, posX, posY, setConstantObjects, staticGameObjects, vectors, tempRoom, "S", floorNumber, roomCount));
                vectorsAroundSpawn.AddRange(ObjectGenerators.GenerateDoors(tiles, tileSize, col, row, roomSizeY, roomSizeX, posX, posY, setConstantObjects, staticGameObjects, vectors, tempRoom, "N", floorNumber, roomCount));
                vectorsAroundSpawn.AddRange(ObjectGenerators.GenerateDoors(tiles, tileSize, col, row, roomSizeY, roomSizeX, posX, posY, setConstantObjects, staticGameObjects, vectors, tempRoom, "L", floorNumber, roomCount));

                ObjectGenerators.GenerateCorners(tiles, col, row, roomSizeY, roomSizeX, posX, posY, setConstantObjects, staticGameObjects, vectors, tempRoom);
                ObjectGenerators.GenerateWalls(tiles, col, row, roomSizeY, roomSizeX, posX, posY, staticGameObjects, vectors, tempRoom);
                ObjectGenerators.GenerateFloors(tiles, posX, posY, staticGameObjects, vectors, tempRoom);
            }
        }

        //fill unfilled floorpieces, which the earlier for-loop leaves.
        for (int row = 0; row < roomSizeX + 1; row++)
        {
            for (int col = 0; col < roomSizeY + 1; col++)
            {
                float posX = col * tileSize;
                float posY = row * -tileSize;

                if (!vectors.Contains(new Vector2(posX, posY)))
                {
                    tiles[1] = Instantiate(staticGameObjects.FirstOrDefault(s => s.name.StartsWith("Floor2")), tempRoom.transform);
                    tiles[1].transform.localPosition = new Vector2(posX, posY);
                    vectors.Add(new Vector2(posX, posY));
                }

                if (tiles[1] != null)
                {
                    tiles[1].transform.parent = tempRoom.transform;
                }
            }
        }

        #region SmallObjects

        var meleeEnemyCount = 0;
        var rangeEnemyCount = 0;
        var superEnemyCount = 0;
        // TODO create more generic way of creating objects. ForEach loop for every item is not very efficient.
        var random = Random.Range(0, 3);
        foreach (var vector in randomObjectVectors.LakeVectors)
        {
            switch (random)
            {
            case 1:
                ObjectGenerators.GenerateLake1(vector, tiles, staticGameObjects, tempRoom, setConstantObjects);
                break;

            case 2:
                ObjectGenerators.GenerateLake2(vector, tiles, staticGameObjects, tempRoom, setConstantObjects);
                break;

            case 3:
                ObjectGenerators.GenerateLake3(vector, tiles, staticGameObjects, tempRoom, setConstantObjects);
                break;

            default:
                ObjectGenerators.GenerateLake3(vector, tiles, staticGameObjects, tempRoom, setConstantObjects);
                break;
            }
        }

        foreach (var vector in randomObjectVectors.SmallRock1Vectors)
        {
            ObjectGenerators.GenerateSmallRock1(vector, tiles, staticGameObjects, tempRoom, vectorsAroundSpawn);
        }
        foreach (var vector in randomObjectVectors.SmallRock2Vectors)
        {
            ObjectGenerators.GenerateSmallRock2(vector, tiles, staticGameObjects, tempRoom, vectorsAroundSpawn);
        }
        foreach (var vector in randomObjectVectors.BigRockVectors)
        {
            ObjectGenerators.GenerateBigRock(vector, tiles, staticGameObjects, tempRoom, vectorsAroundSpawn);
        }

        foreach (var vector in randomObjectVectors.EnemyMeleeVectors)
        {
            if (difficulty > meleeEnemyCount * 1.5)
            {
                ObjectGenerators.GenerateMeleeEnemy(tempRoom, tiles, enemyGameObjects, difficulty, vector);
                meleeEnemyCount++;
            }
        }
        foreach (var vector in randomObjectVectors.EnemyRangedVectors)
        {
            if (difficulty > rangeEnemyCount * 1.5)
            {
                ObjectGenerators.GenerateRangedEnemy(tempRoom, tiles, enemyGameObjects, difficulty, vector);
                rangeEnemyCount++;
            }
        }
        foreach (var vector in randomObjectVectors.EnemySuperVectors)
        {
            if (difficulty > superEnemyCount * 2.5)
            {
                ObjectGenerators.GenerateSuperEnemy(tempRoom, tiles, enemyGameObjects, difficulty, vector);
                superEnemyCount++;
            }
        }

        #endregion SmallObjects

        tempRoom.transform.position = new Vector3 {
            x = 0, y = 0, z = 0
        };
        return(tempRoom);
    }
예제 #2
0
    private RandomModelVectors GenerateVectorsForRandomObjects(int randomObjectsPerLevel, int diffuculty)
    {
        var tempVectors         = new List <Vector2>();
        var randomObjectVectors = new RandomModelVectors();

        for (int i = 0; i < randomObjectsPerLevel; i++)
        {
            while (tempVectors.Count < randomObjectsPerLevel)
            {
                var randomX1 = Random.Range(0, roomSizeX * tileSize - 1);
                var randomY1 = Random.Range(0, roomSizeY * -tileSize);

                if (!tempVectors.Contains(new Vector2(randomX1, randomY1)) && !tempVectors.Contains(new Vector2(randomX1 + 1f, randomY1)) && !tempVectors.Contains(new Vector2(randomX1, randomY1 - 1f)) && !tempVectors.Contains(new Vector2(randomX1 + 1f, randomY1 - 1f)))
                {
                    randomObjectVectors.BigRockVectors.Add(new Vector2(randomX1, randomY1));
                    tempVectors.Add(new Vector2(randomX1, randomY1));
                    tempVectors.Add(new Vector2(randomX1 + 1f, randomY1));
                    tempVectors.Add(new Vector2(randomX1, randomY1 + 1f));
                    tempVectors.Add(new Vector2(randomX1 + 1f, randomY1 - 1f));
                }

                var randomX2 = Random.Range(0, roomSizeX * tileSize - 1);
                var randomY2 = Random.Range(0, roomSizeY * -tileSize);
                if (!tempVectors.Contains(new Vector2(randomX2, randomY2)))
                {
                    randomObjectVectors.SmallRock1Vectors.Add(new Vector2(randomX2, randomY2));
                    tempVectors.Add(new Vector2(randomX2, randomY2));
                }

                var randomX3 = Random.Range(0, roomSizeX * tileSize - 1);
                var randomY3 = Random.Range(0, roomSizeY * -tileSize);
                if (!tempVectors.Contains(new Vector2(randomX3, randomY3)))
                {
                    randomObjectVectors.SmallRock2Vectors.Add(new Vector2(randomX3, randomY3));
                    tempVectors.Add(new Vector2(randomX3, randomY3));
                }

                var randomX4 = Random.Range(0, roomSizeX * tileSize - 1);
                var randomY4 = Random.Range(0, roomSizeY * -tileSize);
                if (!tempVectors.Contains(new Vector2(randomX4, randomY4)))
                {
                    randomObjectVectors.EnemyMeleeVectors.Add(new Vector2(randomX4, randomY4));
                    tempVectors.Add(new Vector2(randomX4, randomY4));
                }

                var randomX5 = Random.Range(0, roomSizeX * tileSize - 1);
                var randomY5 = Random.Range(0, roomSizeY * -tileSize);
                if (!tempVectors.Contains(new Vector2(randomX5, randomY5)))
                {
                    randomObjectVectors.EnemyRangedVectors.Add(new Vector2(randomX5, randomY5));
                    tempVectors.Add(new Vector2(randomX5, randomY5));
                }

                var randomX6 = Random.Range(0, roomSizeX * tileSize - 1);
                var randomY6 = Random.Range(0, roomSizeY * -tileSize);
                if (!tempVectors.Contains(new Vector2(randomX6, randomY6)))
                {
                    randomObjectVectors.EnemySuperVectors.Add(new Vector2(randomX6, randomY6));
                    tempVectors.Add(new Vector2(randomX6, randomY6));
                }

                var randomX7 = Random.Range(0, roomSizeX * tileSize - 1);
                var randomY7 = Random.Range(0, roomSizeY * -tileSize);

                randomObjectVectors.LakeVectors.Add(new Vector2(randomX7, randomY7));
                tempVectors.Add(new Vector2(randomX7, randomY7));
            }
        }
        return(randomObjectVectors);
    }