Exemple #1
0
    private void GenerateExits(RoomClass.ExitClass requiredExit, int numOfExits, List <int> availableSegments, List <int> availableExits, RoomClass newRoom)
    {
        var exitIds = new List <int>();

        if (requiredExit != null)
        {
            newRoom.Exits.Add(requiredExit);

            availableExits.Remove(requiredExit.Id);
            exitIds.Add(requiredExit.Id);
        }

        for (int i = 0; i < numOfExits; i++)
        {
            var exitId = availableExits[Random.Range(0, availableExits.Count)];
            availableExits.Remove(exitId);
            exitIds.Add(exitId);
        }

        foreach (var exitId in exitIds)
        {
            if (requiredExit != null &&
                requiredExit.Id == exitId)
            {
                continue;
            }

            newRoom.Exits.Add(new RoomClass.ExitClass()
            {
                Id     = exitId,
                Target = new RoomClass.ExitClass.TargetClass()
                {
                    ExitId = GetRandomOppositeExit(exitId),
                    RoomId = CreateRoom().Id
                }
            });
        }

        while (exitIds.Count > 0)
        {
            var exitId = exitIds[0];
            exitIds.Remove(exitId);

            var exitPair  = exitPairs[exitId];
            var segmentId = exitToSegment[exitId];

            availableSegments.Remove(segmentId);

            var variationIndexSelector = 0;
            if (exitIds.Any(x => x == exitPair))
            {
                exitIds.Remove(exitPair);
                variationIndexSelector = 1;
            }

            newRoom.VariationIndex[segmentId] = exitToVariationIndex[exitId, variationIndexSelector];
        }
    }
Exemple #2
0
    public void GenerateRoom(RoomClass roomToGenerate, RoomClass.ExitClass requiredExit)
    {
        if (roomToGenerate == null)
        {
            roomToGenerate = CreateRoom();
        }

        if (roomToGenerate.Generated)
        {
            return;
        }

        List <int> availableSegments = Enumerable.Range(0, 6).ToList();
        List <int> availableExits    = Enumerable.Range(0, 10).ToList();

        if (requiredExit != null)
        {
            availableExits.Remove(requiredExit.Id);
            availableSegments.Remove(exitToSegment[requiredExit.Id]);
        }

        GenerateAltarSegment(availableSegments, availableExits, roomToGenerate);

        var numExits = Mathf.Min(Random.Range(1, 4), availableSymbols.Count);

        GenerateExits(requiredExit, numExits, availableSegments, availableExits, roomToGenerate);

        GenerateNoExits(availableSegments, roomToGenerate);

        roomToGenerate.Generated = true;

        foreach (var exit in roomToGenerate.Exits)
        {
            var newRoom = Rooms.Find(x => x.Id == exit.Target.RoomId);
            GenerateRoom(newRoom, new RoomClass.ExitClass()
            {
                Id     = exit.Target.ExitId,
                Target = new RoomClass.ExitClass.TargetClass()
                {
                    ExitId = exit.Id,
                    RoomId = roomToGenerate.Id
                }
            });
        }
    }