Exemplo n.º 1
0
    protected void IncrementGeneration(DungeonEnvironmentGenerationData data, Dictionary <Vector2i, Vector2i> wallDirMapping = null)
    {
        Vector2i[] keys = wallDirMapping.Keys.ToArray();

        // make a corridor
        Vector2i corridorStart = keys[Random.Range(0, keys.Length - 1)];
        Vector2i dir           = wallDirMapping[corridorStart];
        Vector2i corridorEnd   = corridorStart + dir * Random.Range(0, data.mMaxCorridorLength);
        Room     corridor      = new Room();

        corridor.InitMinMax(corridorStart, corridorEnd);

        //Debug.DrawLine(GetTilePosition(corridorStart.mX, corridorStart.mY) + Vector3.up, GetTilePosition(corridorEnd.mX, corridorEnd.mY) + Vector3.up, Color.red, 10.0f);

        if (CanPlaceRoom(corridor))
        {
            PlaceRoom(corridor, true);
            GetWalls(corridor, wallDirMapping);

            // make a room to the end of it
            int  roomWidth      = Random.Range(data.mMinRoomDimensions.mX, data.mMaxRoomDimensions.mX);
            int  halfRoomWidth  = roomWidth / 2;
            int  roomHeight     = Random.Range(data.mMinRoomDimensions.mY, data.mMaxRoomDimensions.mY);
            int  halfRoomHeight = roomHeight / 2;
            Room room           = new Room();
            room.InitCenterSize(corridorEnd.mX, corridorEnd.mY, roomWidth, roomHeight);
            if (dir.mY != 0) // vertical
            {
                room.ShiftBy(dir * (halfRoomHeight + 1));
                room.ShiftBy(new Vector2i(Random.Range(-halfRoomWidth, halfRoomWidth), 0));
            }
            else // horizontal
            {
                room.ShiftBy(dir * (halfRoomWidth + 1));
                room.ShiftBy(new Vector2i(0, Random.Range(-halfRoomHeight, halfRoomHeight)));
            }

            if (CanPlaceRoom(room))
            {
                PlaceRoom(room);
                GetWalls(room, wallDirMapping);
            }

            wallDirMapping.Remove(corridorStart);
            if (dir.mY != 0) // vertical
            {
                wallDirMapping.Remove(corridorStart + Vector2i.kLeft);
                wallDirMapping.Remove(corridorStart + Vector2i.kRight);
            }
            else
            {
                wallDirMapping.Remove(corridorStart + Vector2i.kUp);
                wallDirMapping.Remove(corridorStart + Vector2i.kDown);
            }
        }
    }
Exemplo n.º 2
0
    public void GenerateRooms(DungeonEnvironmentGenerationData data)
    {
        mRooms.Clear();

        if (data.mUseSeed)
        {
            mSeed = data.mSeed;
        }
        else
        {
            mSeed = Random.seed;
        }
        Random.seed = mSeed;
        openWalls.Clear();

        if (data.mRandomizeInitialRoomPosition)
        {
            int halfInitialRoomWidth  = data.mInitialRoomSize.mX / 2;
            int halfInitialRoomHeight = data.mInitialRoomSize.mY / 2;
            mInitialRoomPosition.mX = Random.Range(halfInitialRoomWidth + 1, data.mTotalDimensions.mX - halfInitialRoomWidth - 1);
            mInitialRoomPosition.mY = Random.Range(halfInitialRoomHeight + 1, data.mTotalDimensions.mY - halfInitialRoomHeight - 1);
        }
        else
        {
            mInitialRoomPosition = data.mInitialRoomPosition;
        }
        Room initialRoom = new Room();

        initialRoom.InitCenterSize(mInitialRoomPosition.mX, mInitialRoomPosition.mY, data.mInitialRoomSize.mX, data.mInitialRoomSize.mY);

        PlaceRoom(initialRoom);
        GetWalls(initialRoom, openWalls);

        int attempts = 0;

        while (attempts < mMaxGenerationAttempts && openWalls.Count > 0)
        {
            IncrementGeneration(data, openWalls);
            ++attempts;
        }
    }
Exemplo n.º 3
0
    /* TESTING
    protected void Update()
    {
        if (Input.GetKeyDown(KeyCode.R))
        {
            GenerateDungeon();
        }

        if (Input.GetKeyDown(KeyCode.T))
        {
            mGrid.Init(kWidth, kHeight);
            GenerateRooms(kSeed);
            UpdateTileGraphics();
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            IncrementGeneration(openWalls);
            UpdateTileGraphics();
        }
    }
     */

    public void GenerateDungeon(DungeonEnvironmentGenerationData data)
    {
        mGrid.Init(data.mTotalDimensions.mX, data.mTotalDimensions.mY);
        GenerateRooms(data);
        UpdateTileGraphics();
    }
Exemplo n.º 4
0
    protected void IncrementGeneration(DungeonEnvironmentGenerationData data, Dictionary<Vector2i, Vector2i> wallDirMapping = null)
    {
        Vector2i[] keys = wallDirMapping.Keys.ToArray();

        // make a corridor
        Vector2i corridorStart = keys[Random.Range(0, keys.Length - 1)];
        Vector2i dir = wallDirMapping[corridorStart];
        Vector2i corridorEnd = corridorStart + dir * Random.Range(0, data.mMaxCorridorLength);
        Room corridor = new Room();
        corridor.InitMinMax(corridorStart, corridorEnd);

        //Debug.DrawLine(GetTilePosition(corridorStart.mX, corridorStart.mY) + Vector3.up, GetTilePosition(corridorEnd.mX, corridorEnd.mY) + Vector3.up, Color.red, 10.0f);

        if (CanPlaceRoom(corridor))
        {
            PlaceRoom(corridor, true);
            GetWalls(corridor, wallDirMapping);

            // make a room to the end of it
            int roomWidth = Random.Range(data.mMinRoomDimensions.mX, data.mMaxRoomDimensions.mX);
            int halfRoomWidth = roomWidth / 2;
            int roomHeight = Random.Range(data.mMinRoomDimensions.mY, data.mMaxRoomDimensions.mY);
            int halfRoomHeight = roomHeight / 2;
            Room room = new Room();
            room.InitCenterSize(corridorEnd.mX, corridorEnd.mY, roomWidth, roomHeight);
            if (dir.mY != 0) // vertical
            {
                room.ShiftBy(dir * (halfRoomHeight + 1));
                room.ShiftBy(new Vector2i(Random.Range(-halfRoomWidth, halfRoomWidth), 0));
            }
            else // horizontal
            {
                room.ShiftBy(dir * (halfRoomWidth + 1));
                room.ShiftBy(new Vector2i(0, Random.Range(-halfRoomHeight, halfRoomHeight)));
            }

            if (CanPlaceRoom(room))
            {
                PlaceRoom(room);
                GetWalls(room, wallDirMapping);
            }

            wallDirMapping.Remove(corridorStart);
            if (dir.mY != 0) // vertical
            {
                wallDirMapping.Remove(corridorStart + Vector2i.kLeft);
                wallDirMapping.Remove(corridorStart + Vector2i.kRight);
            }
            else
            {
                wallDirMapping.Remove(corridorStart + Vector2i.kUp);
                wallDirMapping.Remove(corridorStart + Vector2i.kDown);
            }
        }
    }
Exemplo n.º 5
0
    public void GenerateRooms(DungeonEnvironmentGenerationData data)
    {
        mRooms.Clear();
        
        if(data.mUseSeed)
        {
            mSeed = data.mSeed;
        }
        else
        {
            mSeed = Random.seed;
        }
        Random.seed = mSeed;
        openWalls.Clear();

        if (data.mRandomizeInitialRoomPosition)
        {
            int halfInitialRoomWidth = data.mInitialRoomSize.mX/2;
            int halfInitialRoomHeight = data.mInitialRoomSize.mY/2;
            mInitialRoomPosition.mX = Random.Range(halfInitialRoomWidth+1, data.mTotalDimensions.mX - halfInitialRoomWidth-1);
            mInitialRoomPosition.mY = Random.Range(halfInitialRoomHeight+1, data.mTotalDimensions.mY - halfInitialRoomHeight-1);
        }
        else
        {
            mInitialRoomPosition = data.mInitialRoomPosition;
        }
        Room initialRoom = new Room();
        initialRoom.InitCenterSize(mInitialRoomPosition.mX, mInitialRoomPosition.mY, data.mInitialRoomSize.mX, data.mInitialRoomSize.mY);

        PlaceRoom(initialRoom);
        GetWalls(initialRoom, openWalls);

        int attempts = 0;
        while (attempts < mMaxGenerationAttempts && openWalls.Count > 0)
        {
            IncrementGeneration(data, openWalls);
            ++attempts;
        }
    }
Exemplo n.º 6
0
    /* TESTING
     * protected void Update()
     * {
     *  if (Input.GetKeyDown(KeyCode.R))
     *  {
     *      GenerateDungeon();
     *  }
     *
     *  if (Input.GetKeyDown(KeyCode.T))
     *  {
     *      mGrid.Init(kWidth, kHeight);
     *      GenerateRooms(kSeed);
     *      UpdateTileGraphics();
     *  }
     *
     *  if (Input.GetKeyDown(KeyCode.Space))
     *  {
     *      IncrementGeneration(openWalls);
     *      UpdateTileGraphics();
     *  }
     * }
     */

    public void GenerateDungeon(DungeonEnvironmentGenerationData data)
    {
        mGrid.Init(data.mTotalDimensions.mX, data.mTotalDimensions.mY);
        GenerateRooms(data);
        UpdateTileGraphics();
    }