//replaces an given area public static MapData FlattenNoiseArea(MapData _mapData, int _nodeValue, bool _cannotOverwrite, EnumTypes.FigureMode _figureMode, Vector2 _clearPosition, int _clearSize, int _mapChunkSize) { int radius = Mathf.FloorToInt(_clearSize / 2); if (_figureMode == EnumTypes.FigureMode.Square) { for (int y = 0; y < _mapChunkSize; y++) { for (int x = 0; x < _mapChunkSize; x++) { if (x >= _clearPosition.x - radius && x <= _clearPosition.x + radius && y >= _clearPosition.y - radius && y <= _clearPosition.y + radius) { float distance = x + y - _mapChunkSize + 1; _mapData.noiseMap[x, y] = _mapData.noiseMap[x, y] / (_clearSize / distance); _mapData.obstacleData[x, y].cannotOverwrite = _cannotOverwrite; if (_nodeValue != 0) { _mapData.obstacleData[x, y].nodeValue = _nodeValue; } } } } } else if (_figureMode == EnumTypes.FigureMode.Circle) { _clearSize /= 2; for (int y = (int)_clearPosition.y - radius; y <= (int)_clearPosition.y + radius; y++) { for (int x = (int)_clearPosition.x - radius; x <= (int)_clearPosition.x + radius; x++) { float distance = Vector2.Distance(_clearPosition, new Vector2(x, y)); //check if this location is withing the given _clearSize if (distance <= _clearSize) { _mapData.noiseMap[x, y] = _mapData.noiseMap[x, y] / (_clearSize / distance); _mapData.obstacleData[x, y].cannotOverwrite = _cannotOverwrite; } } } } return(_mapData); }
//flatten a circle, and add other small circles to it to make it seem natural public static MapData FlattenCircleRandomized(MapData _mapData, int _nodeValue, bool _cannotOverwrite, EnumTypes.FigureMode _figureMode, Vector2 _clearPosition, int _clearSize, int _mapChunkSize, int _randomizeAmount) { FlattenNoiseArea(_mapData, _nodeValue, _cannotOverwrite, EnumTypes.FigureMode.Circle, _clearPosition, _clearSize, _mapChunkSize); for (int i = 0; i < _randomizeAmount; i++) { int randomClearSize = Mathf.RoundToInt(_clearSize / Random.Range(1f, 2f)); Vector2 randomCirclePosition = new Vector2(_clearPosition.x + randomClearSize / 2 * Random.Range(-1f, 1f), _clearPosition.y + randomClearSize / 2 * Random.Range(-1f, 1f)); _mapData = FlattenNoiseArea(_mapData, _nodeValue, _cannotOverwrite, EnumTypes.FigureMode.Circle, randomCirclePosition, randomClearSize, _mapChunkSize); } return(_mapData); }