/// <summary> /// Clears a previous dungeon and removes all tiles and objects. /// </summary> /// <returns></returns> public IEnumerator ClearPreviousDungeon() { timer = new DungeonTimer(false); timer.Start(); yield return(DestroyPreviousGameObjects()); yield return(ClearPreviousTiles()); dungeon = DungeonDict.Instance.dungeon = null; }
/// <summary> /// Creates the dungeon in an async way. /// </summary> /// <param name="seed">The random seed for the dungeon.</param> /// <param name="levelNumber">The current level number.</param> /// <param name="config">The config to load and use during generation.</param> /// <param name="tileset">The tileset to use for the tilemap generation.</param> public IEnumerator CreateDungeon(int seed, int levelNumber, DungeonConfig config, Tileset tileset, Dungeon dungeonToLoad = null) { timer = new DungeonTimer(); timer.Start(); yield return(DestroyPreviousGameObjects()); dungeon = dungeonToLoad; if (dungeon == null) { Debug.Log("Creating dungeon with seed: " + seed); // Load all room types List <Fast2DArray <int> > roomLayouts = new List <Fast2DArray <int> >(); List <List <TiledImporter.PrefabLocations> > roomGameObjects = new List <List <TiledImporter.PrefabLocations> >(); List <RoomType> roomTypes = new List <RoomType>(); yield return(LoadRoomTypes(roomLayouts, roomGameObjects, roomTypes)); //seed = -1304249244; seed = "I wanna go home".GetHashCode(); dungeon = new Dungeon(roomLayouts.ToArray(), roomGameObjects.ToArray(), roomTypes.ToArray(), seed, config); } DungeonDict.Instance.dungeon = dungeon; AdjustMask(); yield return(ClearPreviousTiles()); yield return(SetTiles(tileset)); yield return(SetBorderTiles(tileset)); yield return(roomCreator.CreateRooms(dungeon, levelNumber, config, timer)); MiniMapManager.Instance.OnNewLevelGenerated(); SetLoadStatus(1.0f); position = transform.position; if (Player.LocalPlayer) // check to allow for debugging if a localplayer is not scene { Player.LocalPlayer.StateCommunicator.LevelSetLoaded(true); } }
/// <summary> /// Create and place and DungeonRooms and Corridors from the generated dungeons. /// </summary> /// <param name="dungeon">The dungeon that was just generated.</param> /// <param name="levelNumber">The number of the level.</param> /// <param name="timer">The current used DungeonTimer.</param> /// <returns></returns> public IEnumerator CreateRooms(Dungeon dungeon, int levelNumber, DungeonConfig config, DungeonTimer timer) { List <DungeonRoom> dungeonRooms = new List <DungeonRoom>(); DungeonDict.Instance.ResetRooms(dungeon.Rooms.Length + dungeon.Corridors.Length); GameObject prefabDoorLR = RegionDict.Instance.PrefabDoorLR; GameObject prefabDoorUD = RegionDict.Instance.PrefabDoorUD; // Create DungeonRooms for (int i = 0; i < dungeon.Rooms.Length; i++) { GameObject dungeonRoomObject = Instantiate(DungeonCreator.Instance.PrefabDungeonRoom); dungeonRoomObject.transform.parent = DungeonCreator.Instance.RoomsContainer; DungeonRoom dungeonRoom = SetRoomType(dungeon.Rooms[i], dungeonRoomObject, levelNumber, config); // set room id dungeonRoom.id = i; DungeonDict.Instance.Register(dungeonRoom); SetRoomBorder(dungeon, i, dungeonRoom); SetRoomObjects(dungeon.Rooms[i], dungeonRoomObject, dungeonRoom); SetDoors(dungeon, prefabDoorLR, prefabDoorUD, i, dungeonRoomObject, dungeonRoom); dungeonRooms.Add(dungeonRoom); dungeonRoom.OnFullyCreated(); if (timer.ShouldWait()) { yield return(timer.Wait(0.9f + ((i * 1.0f / dungeon.Rooms.Length) * 0.05f))); } } // Create corridors. for (int i = 0; i < dungeon.Corridors.Length; i++) { Corridor corridor = dungeon.Corridors[i]; GameObject corridorObject = new GameObject("Corridor_" + i); corridorObject.transform.parent = DungeonCreator.Instance.CorridorContainer; CorridorRoom corridorRoom = corridorObject.AddComponent <CorridorRoom>(); corridorRoom.id = dungeon.Rooms.Length + i; corridorRoom.walkableTiles = corridor.GetWalkableTiles(); corridorRoom.direction = corridor.Size.y == 3; SetCorridorBorder(corridor, corridorRoom); DungeonDict.Instance.Register(corridorRoom); } }