Example #1
0
    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);
    }
Example #2
0
    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);
    }
Example #3
0
    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);
                }
            }
        }
    }
Example #4
0
    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;
        }
    }