protected override void Start()
    {
        preSetup();

        taken = new bool[w, h];

        marker     = GameObject.Find("DoorMarker").GetComponent <DungeonDoorMarker>();
        marker.pos = Vector2Int.FloorToInt(marker.transform.position);

        roomLoaders     = new List <DungeonRoomLoader>();
        corridorLoaders = new List <DungeonRoomLoader>();
        foreach (var item in roomPrefabs)
        {
            roomLoaders.Add(new DungeonRoomLoader(item.name + ".room", item));
            //corridorLoaders.Add(new DungeonRoomLoader(item.name + ".room", item));
        }
        foreach (var item in corridorPrefabs)
        {
            corridorLoaders.Add(new DungeonRoomLoader(item.name + ".corridor", item));
        }

        allRoom = new List <DungeonRoomLoader>();
        allRoom.AddRange(roomLoaders);
        allRoom.AddRange(corridorLoaders);

        createDungeon(marker);


        postSetup();
    }
    Tuple <List <DungeonDoorMarker>, bool> addRoom(List <DungeonDoorMarker> openDoors)
    {
        if (openDoors == null || openDoors.Count <= 0)
        {
            return(null);
        }


        bool okRoom = false;
        DungeonDoorMarker        okdoor = null;
        Vector2Int               pos    = Vector2Int.zero;
        BoundsInt                bounds = new BoundsInt();
        DungeonRoomLoader        loader = null;
        List <DungeonDoorMarker> doors  = null;
        DungeonDoorMarker        door   = null;
        int  i       = 0;
        bool wasRoom = false;

        while (!okRoom && i < 1000)
        {
            door = openDoors[Random.Range(0, openDoors.Count)];
            int x;
            if (i > 90000)
            {
                x = 2 + 1;
            }
            i++;
            do
            {
                if (Random.value < door.corridorChance)
                {
                    loader  = corridorLoaders[Random.Range(0, corridorLoaders.Count)];
                    wasRoom = false;
                }
                else
                {
                    loader  = roomLoaders[Random.Range(0, roomLoaders.Count)];
                    wasRoom = true;
                }
            } while (loader.rerollChance > Random.value);
            doors = loader.getDoors().Where(t => okDoor(t, door)).ToList();
            if (doors.Count > 0)
            {
                okdoor = doors[Random.Range(0, doors.Count)];
                pos    = loader.getGlobalPosByDoor(okdoor, door.pos);

                bounds = loader.getWorldBounds(pos);
                okRoom = isRoomOk(bounds);
            }
        }

        if (wasRoom)
        {
            loader.rerollChance += (1 - loader.rerollChance) / 2;
        }


        return(new Tuple <List <DungeonDoorMarker>, bool>(addRoom(loader, door, okdoor, pos, bounds), wasRoom));
    }
示例#3
0
    public Vector2Int getGlobalPosByDoor(DungeonDoorMarker myDoor, Vector2Int worldDoor)
    {
        var door = doors.FirstOrDefault(t => t.pos == myDoor.pos);

        if (door == null)
        {
            return(Vector2Int.zero);
        }
        else
        {
            return(worldDoor - door.pos);
        }
    }
    bool isAnyRoomOk(DungeonDoorMarker door)
    {
        foreach (var loader in allRoom)
        {
            var doors = loader.getDoors().Where(t => okDoor(t, door)).ToList();
            foreach (var item in doors)
            {
                var pos = loader.getGlobalPosByDoor(item, door.pos);

                var bounds = loader.getWorldBounds(pos);
                if (isRoomOk(bounds))
                {
                    return(true);
                }
            }
        }
        return(false);
    }
    void createDungeon(DungeonDoorMarker start)
    {
        var doors = new List <DungeonDoorMarker>()
        {
            start
        };

        int i = 0;

        while (i < 8)
        {
            var r = addRoom(doors);
            doors.AddRange(r.Item1);
            doors.RemoveAll(t => !t.open);
            if (r.Item2)
            {
                i++;
            }
        }
    }
    List <DungeonDoorMarker> addRoom(DungeonRoomLoader loader, DungeonDoorMarker start, DungeonDoorMarker okdoor, Vector2Int pos, BoundsInt bounds)
    {
        start.open  = false;
        okdoor.open = false;
        var room = Instantiate(loader.prefab);

        room.transform.position = new Vector3(pos.x, pos.y, 0);
        loader.paintConstruct(tilemap, FGTilemap, FullFGTilemap, new Vector3Int(pos.x, pos.y, 0));
        var doors = loader.getDoors().Where(t => t.pos != okdoor.pos).ToList();

        doors.ForEach(t => t.setToWorld(pos));
        foreach (var item in doors.Where(t => !isAnyRoomOk(t)))
        {
            item.open = false;
        }
        for (int i = bounds.min.x; i < bounds.max.x; i++)
        {
            for (int j = bounds.min.y; j < bounds.max.y; j++)
            {
                taken[i + w / 2, j + h / 2] = true;
            }
        }
        return(doors.Where(t => t.open).ToList());
    }
 bool okDoor(DungeonDoorMarker myDoor, DungeonDoorMarker outerDoor)
 {
     return(myDoor.intoDir.x * outerDoor.intoDir.x == -1 || myDoor.intoDir.y * outerDoor.intoDir.y == -1);
 }