Example #1
0
            public void SpawnRooms(MapGenerator.Node[,,] level, MapGenerator.Node entrance, MapGenerator.Node exit, List <TagManager.TagType> tags)
            {
                if (densityInteriorMax < densityInteriorMin)
                {
                    Debug.Log("The max Interior density is lower than it's minimal counterpart!");
                    return;
                }
                if (densityEnemyMax < densityEnemyMin)
                {
                    Debug.Log("The max enemy density is lower than it's minimal counterpart!");
                    return;
                }

                StartCoroutine(_SpawnRooms(level, entrance, exit, tags));
            }
Example #2
0
            private IEnumerator _SpawnRooms(MapGenerator.Node[,,] level, MapGenerator.Node entrance, MapGenerator.Node exit, List <TagManager.TagType> tags)
            {
                //for loop length
                int sizeX = level.GetLength(0);
                int sizeY = level.GetLength(1);
                int sizeZ = level.GetLength(2);

                float        minX = -(float)sizeX / 2 * roomWidth;
                float        minY = -(float)sizeY / 2 * roomHeight;
                float        minZ = -(float)sizeZ / 2 * roomWidth;
                MapGenerator mG   = GetComponent <MapGenerator>();

                for (int x = 0; x < sizeX; x++)
                {
                    for (int y = 0; y < sizeY; y++)
                    {
                        for (int z = 0; z < sizeZ; z++)
                        {
                            //spawn room
                            MapGenerator.Node n = level[x, y, z];

                            //check if room is require
                            if (!n.initialized)
                            {
                                continue;
                            }

                            Vector3 pos = new Vector3();
                            pos.x = minX + roomWidth * x + roomWidth / 2;
                            pos.y = minY + roomHeight * y + roomHeight / 2;
                            pos.z = minZ + roomWidth * z + roomWidth / 2;
                            GameObject room = Instantiate(n.room.room, pos, Quaternion.identity);
                            room.transform.eulerAngles = new Vector3(0, (float)n.room.rotation, 0);

                            spawnedRooms.Add(room);

                            //set interior
                            RoomInterior rI = room.GetComponent <RoomInterior>();
                            if (!(rI != null))
                            {
                                Debug.Log("There isnt a script on this room. Location: " + x + " " + y + " " + z + " Name: " + n.room.room.name);
                                continue;
                            }

                            int points  = mG.random.Next(densityInteriorMin, densityInteriorMax);
                            int _points = 0;

                            //if the amount is more than this room is able to give
                            foreach (RoomInterior.InteriorItem item in rI.objectsInRoom)
                            {
                                _points += item.cost;
                            }
                            if (points > _points)
                            {
                                points = _points;
                            }
                            List <RoomInterior.InteriorItem> interior = rI.objectsInRoom;
                            bool stillFit = true;
                            while (points > 0 && interior.Count > 0 && stillFit)
                            {
                                //check if hasItemWithFitTag
                                stillFit = false;
                                foreach (RoomInterior.InteriorItem _iI in interior)
                                {
                                    if (tags.Contains(_iI.obj.GetComponent <TagManager>()._tag))
                                    {
                                        stillFit = true;
                                        break;
                                    }
                                }

                                //enable another interior item
                                RoomInterior.InteriorItem iI = interior[mG.random.Next(0, interior.Count)]; //also remove
                                TagManager t = iI.obj.GetComponent <TagManager>();
                                if (!tags.Contains(t._tag))
                                {
                                    continue;
                                }

                                interior.Remove(iI);
                                points -= iI.cost;
                                iI.obj.SetActive(true);
                            }

                            //spawn player
                            if (n == entrance)
                            {
                                if (rI.spawnPositions.Count == 0)
                                {
                                    Debug.Log("No spawn point for player, smartass");
                                    yield break;
                                }

                                int       p = mG.random.Next(0, rI.spawnPositions.Count - 1);
                                Transform t = rI.spawnPositions[p];
                                //GameObject pl = Instantiate(player, t.position, t.rotation);
                                //PathFinding.self.center = pl.transform;
                                yield return(null);

                                continue;
                            }

                            //spawn enemies
                            if (enemies.Count == 0)
                            {
                                Debug.Log("There are no enemies to be spawned!");
                                continue;
                            }

                            List <Enemy> fitEnemies = new List <Enemy>();
                            foreach (Enemy en in enemies)
                            {
                                if (tags.Contains(en.obj.GetComponent <TagManager>()._tag))
                                {
                                    //check if right difficulty
                                    if (en.difficulty < difficulty - difficultyBuffer ||
                                        en.difficulty > difficulty + difficultyBuffer)
                                    {
                                        continue;
                                    }
                                    fitEnemies.Add(en);
                                    break;
                                }
                            }

                            if (fitEnemies.Count == 0)
                            {
                                Debug.Log("There are no normal enemies! / the difficulty doesn't match the available enemies!");
                                continue;
                            }

                            if (rI.spawnPositions.Count == 0)
                            {
                                Debug.Log("There are no spawn positions in this room");
                                yield break;
                            }

                            int        e         = mG.random.Next(densityEnemyMin, densityEnemyMax);
                            int        _e        = 0;
                            List <int> positions = new List <int>();
                            int        i         = n == entrance ? 1 : 0;
                            while (_e < e)
                            {
                                int   newEnemy = mG.random.Next(0, fitEnemies.Count - 1);
                                Enemy enemy    = fitEnemies[newEnemy];
                                _e += enemy.cost;
                                int  enemySpawnpos = 0;
                                bool fit           = false;
                                while (!fit)
                                {
                                    enemySpawnpos = mG.random.Next(0, rI.spawnPositions.Count - i);
                                    if (!positions.Contains(enemySpawnpos))
                                    {
                                        fit = true;
                                    }
                                    if (positions.Count >= rI.spawnPositions.Count)
                                    {
                                        break;
                                    }
                                }

                                if (!fit)
                                {
                                    break;
                                }

                                //spawn enemy
                                Transform  t     = rI.spawnPositions[enemySpawnpos];
                                GameObject enObj = Instantiate(enemy.obj, t.position, t.rotation);
                                enemyValue += enemy.cost;
                                positions.Add(enemySpawnpos);

                                //add to list of enemies
                                Enemy en = new Enemy();
                                en.cost       = enemy.cost;
                                en.difficulty = enemy.difficulty;
                                en.obj        = enObj;
                                spawnedEnemies.Add(en);
                            }

                            yield return(null);
                        }
                    }
                }

                enemyValueOriginal = enemyValue;

                loader.SetProgress(MapLoader.Progress.Placing_Rooms);
                //CustomOcclusion.self.Occlude();
                PathFinding.self.SetupBakeable();
            }