bool CreateCorridorRecursivly(cRoom room) { ////randomly choose a room //cRoom room = roomList[Random.Range(0, roomList.Count - 1)]; int deltaX, deltaZ; int wallX, wallZ;//target wall pos switch (Random.Range(1,4)) { //randomly choose a direction (for corridor) case 1: //up deltaX = 0; deltaZ = 1; wallX = Random.Range (room.x + 1, room.x + room.xWidth - 2); wallZ = room.z + room.zLength - 1; if (_mapInfo[wallX,wallZ] != -1 || _mapInfo[wallX-1,wallZ] != -1 || _mapInfo[wallX+1,wallZ] != -1) { return false; } break; case 2: //down deltaX = 0; deltaZ = -1; wallX = Random.Range (room.x + 1, room.x + room.xWidth - 2); wallZ = room.z; if (_mapInfo[wallX,wallZ] != -1 || _mapInfo[wallX-1,wallZ] != -1 || _mapInfo[wallX+1,wallZ] != -1) { return false; } break; case 3: //left deltaX = -1; deltaZ = 0; wallX = room.x; wallZ = Random.Range (room.z + 1, room.z + room.zLength - 2); if (_mapInfo[wallX,wallZ] != -1 || _mapInfo[wallX,wallZ-1] != -1 || _mapInfo[wallX,wallZ+1] != -1) { return false; } break; case 4: //right deltaX = 1; deltaZ = 0; wallX = room.x+room.xWidth-1; wallZ = Random.Range (room.z + 1, room.z + room.zLength - 2); if (_mapInfo[wallX,wallZ] != -1 || _mapInfo[wallX,wallZ-1] != -1 || _mapInfo[wallX,wallZ+1] != -1) { return false; } break; default: deltaX = 0; deltaZ = 0; wallX = 0; wallZ = 0; Debug.LogError ("Invalid Direction!"); break; } int corridorLength = Random.Range (_corridorMinLength, _corridorMaxLength); if (!CheckCorridorSpace( wallX + deltaX, wallZ + deltaZ, deltaX, deltaZ, corridorLength )) { return false; } currentMapElemId++; currentCorridor = new cCorridor ( currentMapElemId, wallX + deltaX, wallZ + deltaZ, deltaX, deltaZ, corridorLength ); _mapInfo [wallX, wallZ] = room.id;//remove wall UpdateMapInfo (currentCorridor); corridorList.Add (currentCorridor); return true; }
bool CreateRoomRecursivly(cCorridor corridor) { int jointX = corridor.x + corridor.deltaX * (corridor.length+1);//wall length add 1 for wall int jointZ = corridor.z + corridor.deltaZ * (corridor.length+1); int roomX, roomZ; int widthX = Random.Range (_roomMinRange, _roomMaxRange); int lengthZ = Random.Range (_roomMinRange, _roomMaxRange); if (corridor.deltaX == 0) { if (corridor.deltaZ == 1) { //joint on room down roomX = jointX - Random.Range(1, widthX-2); roomZ = jointZ; } else { //joint on room up roomX = jointX - Random.Range(1, widthX-2); roomZ = jointZ - lengthZ + 1; } } else { if (corridor.deltaX == 1) { //joint on room left roomX = jointX; roomZ = jointZ - Random.Range (1, lengthZ-2); } else { //joint on room right roomX = jointX - widthX + 1; roomZ = jointZ - Random.Range (1, lengthZ-2); } } if (!CheckRoomSpace( roomX, roomZ, widthX, lengthZ )) { return false; } currentMapElemId++; currentRoom = new cRoom( currentMapElemId, roomX, roomZ, widthX, lengthZ ); UpdateMapInfo(currentRoom); roomList.Add(currentRoom); _mapInfo [corridor.x + corridor.deltaX * corridor.length, corridor.z + corridor.deltaZ * corridor.length] = corridor.id; _mapInfo [jointX, jointZ] = currentRoom.id; corridor.exitList.Clear (); return true; }
void UpdateMapInfo(cCorridor corridor) { int index = 0; int wallDelX = Mathf.Abs(corridor.deltaX) ^ 1; int wallDelZ = Mathf.Abs(corridor.deltaZ) ^ 1; while (index<corridor.length) { _mapInfo [corridor.x + corridor.deltaX * index, corridor.z + corridor.deltaZ * index] = corridor.id; _mapInfo [corridor.x + corridor.deltaX * index + wallDelX, corridor.z + corridor.deltaZ * index + wallDelZ] = -1; _mapInfo [corridor.x + corridor.deltaX * index - wallDelX, corridor.z + corridor.deltaZ * index - wallDelZ] = -1; index++; } _mapInfo [corridor.x + corridor.deltaX * index, corridor.z + corridor.deltaZ * index] = -1; _mapInfo [corridor.x + corridor.deltaX * index + wallDelX, corridor.z + corridor.deltaZ * index + wallDelZ] = -1; _mapInfo [corridor.x + corridor.deltaX * index - wallDelX, corridor.z + corridor.deltaZ * index - wallDelZ] = -1; }
bool CreateCorridorRecursivly(cCorridor corridor) { cCorridorExit corExit = corridor.exitList[Random.Range(0,corridor.exitList.Count-1)]; int corridorLength = Random.Range(_corridorMinLength, _corridorMaxLength); if (!CheckCorridorSpace( corExit.X + corExit.deltaX, corExit.Z + corExit.deltaZ, corExit.deltaX, corExit.deltaZ, corridorLength )) { return false; } currentMapElemId++; currentCorridor = new cCorridor ( currentMapElemId, corExit.X + corExit.deltaX, corExit.Z + corExit.deltaZ, corExit.deltaX, corExit.deltaZ, corridorLength ); _mapInfo [corExit.X, corExit.Z] = corridor.id;//remove wall UpdateMapInfo (currentCorridor); corridorList.Add (currentCorridor); corridor.exitList.Remove (corExit); return true; }