/// <summary> /// Generate a random room based on {rooms} at a given position /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> private RoomSpawn GenerateRoom(int x, int y) { RoomSpawn roomSpawn = new RoomSpawn(); int roomPick = Random.Range(0, rooms.Count); GameObject roomObj = InstantiateRoom(roomPick); RoomDescriber describer = roomObj.GetComponent <RoomDescriber>(); roomSpawn.type = roomPick; roomSpawn.roomSize = describer.roomSize; roomSpawn.location = new Vector2(x, y); roomSpawn.obj = roomObj; //add each doorway List <DoorDescriber> doors = new List <DoorDescriber>(); for (int i = 0; i < describer.doorways.Count; i++) { doors.Add(describer.doorways[i].GetComponent <DoorDescriber>()); doors[i].location = new Vector2( describer.doorways[i].transform.position.x, describer.doorways[i].transform.position.y); doors[i].doorOpen = true; doors[i].elevatorDoor = false; } roomSpawn.doors = doors; return(roomSpawn); }
/// <summary> /// Spawns in elevators to then pass to wave generation /// </summary> /// <param name="roomSpawns"></param> /// <returns></returns> private List <GameObject> SpawnElevators(List <RoomSpawn> roomSpawns) { List <GameObject> elevators = new List <GameObject>(); foreach (RoomSpawn roomSpawn in roomSpawns) { for (int i = 0; i < roomSpawn.doors.Count; i++) { if (roomSpawn.doors[i].doorOpen) { Vector2 doorPositionAdjust = GetDoorAdjust(roomSpawn.doors[i]); GameObject elevator = Instantiate(elevatorPrefab, mapTransform); elevator.transform.position = roomSpawn.location; RoomDescriber roomDescriber = elevator.GetComponent <RoomDescriber>(); List <DoorDescriber> doors = new List <DoorDescriber>(); //setup doors foreach (GameObject door in roomDescriber.doorways) { doors.Add(door.GetComponent <DoorDescriber>()); doors[doors.Count - 1].location = door.transform.position; } //do thing for (int j = 0; j < doors.Count; j++) { Vector2 elevatorAdjust = GetDoorAdjust(doors[j]); if (IsDoorInverse(doorPositionAdjust, elevatorAdjust)) { Vector2 roomMove = MatchDoorRoomAdjust(roomSpawn.location, doors[j].location, roomSpawn.location, roomSpawn.doors[i].location, doorPositionAdjust); //Debug.Log($"doorPosAdjust: {doorPositionAdjust}, roomPos: {roomSpawn.location}, roomDoor {i} location: {roomSpawn.doors[i].location}, elevator position: {elevator.transform.position}, elevator door pos: {doors[j].location}"); elevator.transform.position += new Vector3(roomMove.x + roomSpawn.location.x, roomMove.y + roomSpawn.location.y, 0); RoomSpawn elevatorRoom = new RoomSpawn(); elevatorRoom.obj = elevator; elevatorRoom.roomSize = elevator.GetComponent <RoomDescriber>().roomSize; elevatorRoom.location = elevator.transform.position; bool intersecting = CheckRoomIntersections(roomSpawns, elevatorRoom); if (intersecting) { Destroy(elevator); break; } elevators.Add(elevator); roomSpawn.doors[i].elevatorDoor = true; } else { GameObject doorObj = doors[j].gameObject; Instantiate(elevatorWallPrefab, doorObj.transform.position, doorObj.transform.rotation, doorObj.transform.parent); Destroy(doorObj); } } } } } return(elevators); }
private List <RoomSpawn> SpawnBossRoom(List <RoomSpawn> roomSpawns, int floor) { //pick random boss from floor list BossRoom bossRoom = floorBosses[floor].bossRooms[Random.Range(0, floorBosses[floor].bossRooms.Count - 1)]; //setup RoomSpawn for boss room RoomSpawn bossRoomSpawn = new RoomSpawn(); RoomDescriber bossRoomDescriber = bossRoom.bossRoom.GetComponent <RoomDescriber>(); //add doors List <DoorDescriber> doors = new List <DoorDescriber>(); for (int i = 0; i < bossRoomDescriber.doorways.Count; i++) { doors.Add(bossRoomDescriber.doorways[i].GetComponent <DoorDescriber>()); doors[i].location = new Vector2( bossRoomDescriber.doorways[i].transform.position.x, bossRoomDescriber.doorways[i].transform.position.y); doors[i].doorOpen = true; doors[i].elevatorDoor = false; } bossRoomSpawn.roomSize = bossRoomDescriber.roomSize; bossRoomSpawn.doors = doors; List <Vector2> bossRoomDoorAdjusts = new List <Vector2>(); foreach (DoorDescriber door in bossRoomSpawn.doors) { bossRoomDoorAdjusts.Add(GetDoorAdjust(door)); } List <RoomSpawn> validRooms = new List <RoomSpawn>(); //find all VALID rooms for this particular boss room foreach (RoomSpawn room in roomSpawns) { foreach (DoorDescriber door in room.doors) { bool found = false; foreach (Vector2 bossRoomAdjust in bossRoomDoorAdjusts) { if (IsDoorInverse(GetDoorAdjust(door), bossRoomAdjust)) { validRooms.Add(room); break; } } if (found) { break; } } } bool finished = false; int maxLoops = Constants.LEVELGEN_BOSS_ROOM_MAX_LOOPS; List <int> usableRooms = new List <int>(); for (int i = 0; i < validRooms.Count; i++) { usableRooms.Add(i); } do { //pick random valid room, then pick random valid door int randomPick = Random.Range(0, usableRooms.Count - 1); usableRooms.RemoveAt(randomPick); if (usableRooms.Count == 0) { Debug.LogError("Ran out of usable rooms to spawn boss room: Regenerating level"); GenerateLevel(floor); return(null); } int randomRoom = usableRooms[randomPick]; int bossDoorPick = -1; int roomDoorPick = -1; for (int i = 0; i < validRooms[randomRoom].doors.Count; i++) { for (int j = 0; j < bossRoomDoorAdjusts.Count; j++) { if (IsDoorInverse(GetDoorAdjust(validRooms[randomRoom].doors[i]), bossRoomDoorAdjusts[j])) { bossDoorPick = j; roomDoorPick = i; } } } //spawn boss room Vector2 roomMove = MatchDoorRoomAdjust( bossRoomSpawn.location, bossRoomSpawn.doors[bossDoorPick].location, validRooms[randomRoom].location, validRooms[randomRoom].doors[roomDoorPick].location, GetDoorAdjust(validRooms[randomRoom].doors[roomDoorPick])); bossRoomSpawn.location += roomMove; if (!CheckRoomIntersections(roomSpawns, bossRoomSpawn)) { GameObject bossRoomObj = Instantiate(bossRoom.bossRoom, mapTransform); bossRoomObj.transform.position = bossRoomSpawn.location; bossRoomSpawn.obj = bossRoomObj; bossRoomSpawn.doors[bossDoorPick].doorOpen = false; validRooms[randomRoom].doors[roomDoorPick].doorOpen = false; bossRoomPick = bossRoomSpawn; bossPick = bossRoom.boss; roomSpawns.Add(bossRoomSpawn); graph.AddNodes(bossRoomSpawn.obj.GetComponent <RoomDescriber>().enemyPathPoints, 0); finished = true; } maxLoops--; } while (maxLoops > 0 && !finished && usableRooms.Count > 0); if (maxLoops == 0) { Debug.LogError("Boss room failed to spawn, max iterations passed"); } else if (usableRooms.Count == 0) { Debug.LogError("Boss room failed to spawn, ran out of rooms to search through"); } Debug.Log($"Generating boss room took {Constants.LEVELGEN_BOSS_ROOM_MAX_LOOPS - maxLoops} iterations"); return(roomSpawns); }