private Room CreateFirstRoom(RoomCoordinates coordinates) { Room previousRoom; if (FirstRoom != null) { previousRoom = (Room)Instantiate(FirstRoom); _floorGrid.AddRoom(coordinates.X, coordinates.Y, previousRoom); } else { previousRoom = (Room)Instantiate(RoomPrefabs.First()); _floorGrid.AddRoom(coordinates.X, coordinates.Y, previousRoom); } return(previousRoom); }
private Room CreateRoom(Room previousRoom, RoomDirection direction, RoomType roomType = RoomType.NormalRoom) { Room prefab; switch (roomType) { case RoomType.StartRoom: prefab = FirstRoom; break; case RoomType.NormalRoom: prefab = RoomPrefabs.First(); break; case RoomType.BossRoom: prefab = BossRoom; break; case RoomType.TreasureRoom: prefab = TreasureRoom; break; case RoomType.SecretRoom: prefab = RoomPrefabs.First(); break; default: throw new ArgumentOutOfRangeException("roomType"); } var room = (Room)Instantiate(prefab); if (previousRoom != null) { var position = previousRoom.transform.position; switch (direction) { case RoomDirection.North: position.y += VerticalDelta; break; case RoomDirection.East: position.x += HorizontalDelta; break; case RoomDirection.South: position.y -= VerticalDelta; break; case RoomDirection.West: position.x -= HorizontalDelta; break; } room.transform.position = position; } if (roomType == RoomType.BossRoom) { var enemyLayouts = room.GetComponent <EnemyLayout>().EnemyLayouts; var enemyLayout = (GameObject)Instantiate(enemyLayouts.ElementAt(Random.Range(0, enemyLayouts.Count))); //enemyLayout.transform.localPosition = Vector3.zero; enemyLayout.transform.parent = room.transform; var enemies = enemyLayout.GetComponentsInChildren <Enemy>().ToList(); enemies.ForEach(e => room.AddEnemy(e, e.transform.position)); } if (roomType == RoomType.NormalRoom) { var obstacleLayout = (GameObject)Instantiate(_obstacleLayouts.ElementAt(Random.Range(0, _obstacleLayouts.Count))); obstacleLayout.transform.parent = room.transform; obstacleLayout.transform.localPosition = Vector3.zero; var enemyLayouts = obstacleLayout.GetComponent <EnemyLayout>().EnemyLayouts; var enemyLayout = (GameObject)Instantiate(enemyLayouts.ElementAt(Random.Range(0, enemyLayouts.Count))); //enemyLayout.transform.localPosition = Vector3.zero; enemyLayout.transform.parent = room.transform; var enemies = enemyLayout.GetComponentsInChildren <Enemy>().ToList(); enemies.ForEach(e => room.AddEnemy(e, e.transform.position)); } return(room); }
void placeObject(RoomPrefabs room, int i, int j, int num) { if (num == 4 && room.twobytwo.Length == 0) { num = 3; } if (num == 3 && room.onebytwo.Length == 0) { num = 1; } if (num == 2 && room.onebytwo.Length == 0) { num = 1; } if (num == 1 && room.twobyone.Length == 0) { num = 0; } if (num == 4) { GameObject g = Instantiate(room.twobytwo[Random.Range(0, room.twobytwo.Length)]); g.transform.parent = Tiles[i][j].Tile.transform; Tiles[i][j].IsOccupied = true; Tiles[i + 1][j].IsOccupied = true; Tiles[i][j + 1].IsOccupied = true; Tiles[i + 1][j + 1].IsOccupied = true; g.transform.localPosition = new Vector3(.5f, .5f, 0); g.transform.rotation = new Quaternion(0, 0, 0, 0); if (room == RoomPrefabs[0] || room == RoomPrefabs[1] || room == RoomPrefabs[2]) { Interactables.Add(g); } } else { int n = 0; if (num == 3) { n = Random.Range(0, 100); if (n > 55) { n = 2; } else if (n > 10) { n = 1; } else { n = 0; } } else if (num == 2) { n = Random.Range(0, 100); if (n > 10) { n = 2; } else { n = 0; } } else if (num == 1) { n = Random.Range(0, 100); if (n > 20) { n = 1; } else { n = 0; } } if (n == 0) { GameObject g = Instantiate(room.onebyone[Random.Range(0, room.onebyone.Length)]); g.transform.parent = Tiles[i][j].Tile.transform; Tiles[i][j].IsOccupied = true; g.transform.localPosition = new Vector3(0, 0, 0); g.transform.rotation = new Quaternion(0, 0, 0, 0); if (room == RoomPrefabs[0] || room == RoomPrefabs[1] || room == RoomPrefabs[2]) { Interactables.Add(g); } } else if (n == 1) { GameObject g = Instantiate(room.twobyone[Random.Range(0, room.twobyone.Length)]); g.transform.parent = Tiles[i][j].Tile.transform; Tiles[i][j].IsOccupied = true; Tiles[i][j + 1].IsOccupied = true; g.transform.localPosition = new Vector3(.5f, 0, 0); g.transform.rotation = new Quaternion(0, 0, 0, 0); if (room == RoomPrefabs[0] || room == RoomPrefabs[1] || room == RoomPrefabs[2]) { Interactables.Add(g); } } else if (n == 2) { GameObject g = Instantiate(room.onebytwo[Random.Range(0, room.onebytwo.Length)]); g.transform.parent = Tiles[i][j].Tile.transform; Tiles[i][j].IsOccupied = true; Tiles[i + 1][j].IsOccupied = true; g.transform.localPosition = new Vector3(0, .5f, 0); g.transform.rotation = new Quaternion(0, 0, 0, 0); if (room == RoomPrefabs[0] || room == RoomPrefabs[1] || room == RoomPrefabs[2]) { Interactables.Add(g); } } } }
void InstantiateRoom(int x, int y, bool start, bool end, RoomPrefabs prefabs, AdjacencyList graph) { GameObject prefab = null; Quaternion q = Quaternion.identity; Vector2Int v = new Vector2Int(x, y); bool spawn_enemies = false; switch (graph[v].Count) { case 1: prefab = prefabs.OneDoor[Random.Range(0, prefabs.OneDoor.Length)]; q = Quaternion.AngleAxis(Vector2.SignedAngle(graph[v][0] - v, Vector2.up), Vector3.up); break; case 2: if (Mathf.Approximately(Vector2.Dot(graph[v][0] - v, graph[v][1] - v), 0)) { prefab = prefabs.TwoDoorL[Random.Range(0, prefabs.TwoDoorL.Length)]; Vector2Int u = (Vector2.SignedAngle(graph[v][0] - v, graph[v][1] - v) < 0f) ? graph[v][0] : graph[v][1]; q = Quaternion.AngleAxis(Vector2.SignedAngle(u - v, Vector2.up), Vector3.up); } else { prefab = prefabs.TwoDoorStraight[Random.Range(0, prefabs.TwoDoorStraight.Length)]; q = Quaternion.AngleAxis(Vector2.Angle(graph[v][0] - v, Vector2.up), Vector3.up); } spawn_enemies = (Random.Range(0, 4) == 0) ? false : true; break; case 3: prefab = prefabs.ThreeDoor[Random.Range(0, prefabs.ThreeDoor.Length)]; Vector2Int w = (Mathf.Approximately(Vector2.Dot(graph[v][0] - v, graph[v][1] - v), -1f)) ? graph[v][2] : (Mathf.Approximately(Vector2.Dot(graph[v][0] - v, graph[v][2] - v), -1f) ? graph[v][1] : graph[v][0] ); q = Quaternion.AngleAxis(Vector2.SignedAngle(w - v, Vector2.up), Vector3.up); spawn_enemies = (Random.Range(0, 4) == 0) ? false : true; break; default: prefab = prefabs.FourDoor[Random.Range(0, prefabs.FourDoor.Length)]; break; } if (start) { prefab = prefabs.OneDoor[0]; } if (end) { prefab = prefabs.OneDoor[0]; } Vector3 pos = (Vector3.right * x * (room_size + margin)) + (Vector3.forward * y * (room_size + margin)); GameObject room = Instantiate(prefab, pos, q); if (spawn_enemies) { int num_enemies = Random.Range(1, 4); Quaternion offset = Quaternion.AngleAxis(Random.Range(0f, 360f), Vector3.up); for (int i = 0; i < num_enemies; i++) { Instantiate(enemy_prefab, pos + (Quaternion.AngleAxis((float)(360 * (i + 1) / num_enemies), Vector3.up) * offset * (Vector3.forward * room_size / 3)), Quaternion.AngleAxis(Random.Range(0f, 360f), Vector3.up)); } } if (start) { player.transform.position = room.transform.position + Vector3.up; } if (end) { level_transition.transform.position = room.transform.position; } }