107 lines
4.7 KiB
Lua

local function circularNoise(tableTarget, position, radius, depthMult, sliceCount)
if (settings.global["nuke-crater-noise"].value) then
for num=0,sliceCount do
local slice_w = (math.floor(radius*depthMult/50)+1)
for ang=0,math.ceil(3.1416*2*radius*slice_w*4/(num*num+1)) do
local dist = math.floor(num*slice_w+slice_w*math.random())
local offset = math.random()
local noise_pos = {x = math.floor(position.x+(dist+radius-1)*math.sin(ang+offset)+0.5), y = math.floor(position.y+(dist+radius-1)*math.cos(ang+offset)+0.5)}
if((position.x-noise_pos.x)*(position.x-noise_pos.x)+(position.y-noise_pos.y)*(position.y-noise_pos.y)<=radius*radius) then
--Do nothing - used to remove rounding errors and prevent hitting the same tile twice
else
if(tableTarget[noise_pos.x]==nil) then
tableTarget[noise_pos.x] = {}
end
tableTarget[noise_pos.x][noise_pos.y] = 1;
end
end
end
end
end
local function tileNoise(surface, tableTarget, position, radius, depthMult, tileMap, sliceCount)
if (settings.global["nuke-crater-noise"].value) then
local defaultOnly = true
for k,v in pairs (tileMap) do
if(k~="default") then
defaultOnly=false;
break;
end
end
for num=0,sliceCount do
local slice_w = (math.floor(radius*depthMult/50)+1)
for ang=0,math.ceil(3.1416*2*radius*slice_w*4/(num*num+1)) do
local dist = math.floor(math.random(num*slice_w, slice_w+num*slice_w))
local offset = math.random()
local noise_pos = {x = math.floor(position.x+(dist+radius-1)*math.sin(ang+offset)+0.5), y = math.floor(position.y+(dist+radius-1)*math.cos(ang+offset)+0.5)}
local cur_tile = defaultOnly or surface.get_tile(noise_pos)
if((not defaultOnly and cur_tile.name == "out-of-map") or (position.x-noise_pos.x)*(position.x-noise_pos.x)+(position.y-noise_pos.y)*(position.y-noise_pos.y)<=radius+0.5) then
--Do nothing - used to remove rounding errors and prevent hitting the same tile twice
elseif (defaultOnly or tileMap[cur_tile.name] == nil) then
if(not(tileMap["default"] ==nil)) then
table.insert(tableTarget, {name = tileMap["default"], position = noise_pos})
end
else
table.insert(tableTarget, {name = tileMap[cur_tile.name], position = noise_pos})
end
end
end
end
end
local function tileNoiseLimited(surface, tableTarget, position, radius, depthMult, tileMap, sliceCount, lesserAngle, greaterAngle, minR, maxR, boundaryBox)
if (settings.global["nuke-crater-noise"].value) then
local defaultOnly = true
for k,v in pairs (tileMap) do
if(k~="default") then
defaultOnly=false;
break;
end
end
local startAngle = lesserAngle
local endAngle = greaterAngle
local angleDiff = (endAngle-startAngle)
if(angleDiff>5) then
angleDiff = 6.283185307-angleDiff
local tmp = startAngle;
startAngle = endAngle;
endAngle = tmp+6.283185307;
end
local slice_w = (math.floor(radius*depthMult/50)+1)
for num=0,sliceCount do
if(minR<=slice_w+num*slice_w+radius and maxR>=num*slice_w+radius-1) then
for ang=0,math.ceil(angleDiff*radius*slice_w*4/(num*num+1)) do
local dist = math.floor(math.random(num*slice_w, slice_w+num*slice_w))
local offset = math.random()+sliceCount
local angle = (ang+offset)%angleDiff+startAngle
local noise_pos = {x = math.floor(position.x+(dist+radius-1)*math.cos(angle)+0.5), y = math.floor(position.y+(dist+radius-1)*math.sin(angle)+0.5)}
if(boundaryBox.left_top.x<=noise_pos.x and boundaryBox.right_bottom.x>=noise_pos.x
and boundaryBox.left_top.y<=noise_pos.y and boundaryBox.right_bottom.y>=noise_pos.y) then
local cur_tile = defaultOnly or surface.get_tile(noise_pos)
if(defaultOnly or (cur_tile.valid and cur_tile.name~="out-of-map")) then
if((position.x-noise_pos.x)*(position.x-noise_pos.x)+(position.y-noise_pos.y)*(position.y-noise_pos.y)<=radius+0.5) then
--Do nothing - used to remove rounding errors and prevent hitting the same tile twice
elseif (defaultOnly or tileMap[cur_tile.name] == nil) then
if(not(tileMap["default"] == nil)) then
table.insert(tableTarget, {name = tileMap["default"], position = noise_pos})
end
else
table.insert(tableTarget, {name = tileMap[cur_tile.name], position = noise_pos})
end
end
end
end
end
end
end
end
return {
circularNoise = circularNoise,
tileNoise = tileNoise,
tileNoiseLimited = tileNoiseLimited
}