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); } } }
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; } }
/* 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(); }
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); } } }
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; } }
/* 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(); }