mirror of
https://github.com/osmarks/random-stuff
synced 2024-12-28 02:50:33 +00:00
93 lines
2.5 KiB
Lua
93 lines
2.5 KiB
Lua
|
local map = {}
|
||
|
local w = 300
|
||
|
local h = 300
|
||
|
local seed = 349259
|
||
|
require("perlin") -- not mine.
|
||
|
-- it uses globals. spiteful, but i do not care enough about code quality for this.
|
||
|
|
||
|
|
||
|
local biomecols = {
|
||
|
empty = {0.5, 0.5, 0.5},
|
||
|
forest = { 0, 0.5, 0},
|
||
|
rainforest = { 0, 0.5, 0.5},
|
||
|
ocean = { 0, 0, 1},
|
||
|
plains = { 0, 1, 0},
|
||
|
desert = { 1, 1, 0},
|
||
|
}
|
||
|
|
||
|
local PERSISTENCE = 0.3
|
||
|
local ITERS = 4
|
||
|
local function oct_noise(x, y, seed, gen)
|
||
|
local total = 0
|
||
|
local frequency = 1
|
||
|
local amplitude = 1
|
||
|
local norm = 0
|
||
|
for i = 1, ITERS do
|
||
|
total = total + gen:noise(x * frequency, y * frequency, seed + i) * amplitude
|
||
|
norm = norm + amplitude
|
||
|
frequency = frequency * 2
|
||
|
amplitude = amplitude * PERSISTENCE
|
||
|
end
|
||
|
return total
|
||
|
end
|
||
|
|
||
|
local sf = 1/20 -- scaling factor.
|
||
|
local function pick_biome(x, y, gen)
|
||
|
local islandicity = gen:noise(x*sf/10, y*sf/10, 302382359)/2+1/2
|
||
|
islandicity = math.min(math.max(0,islandicity*3),1)
|
||
|
local mainland_modifier = gen:noise(x*sf/20, y*sf/20, 302382359)/2
|
||
|
local is_ocean = gen:noise(x*sf/4, y*sf/4, 555575)/2+1/2 + gen:noise(x*sf, y*sf, 555575)/(25-islandicity*10) + mainland_modifier
|
||
|
local humidity = oct_noise(x*sf/2, y*sf/2, 10000, gen)/2+1/2
|
||
|
local temp = oct_noise(x*sf/6, y*sf/6, 20000, gen)/2+1/2
|
||
|
--return { is_ocean, humidity, temp }
|
||
|
--
|
||
|
if is_ocean > 0.45 then return "ocean" end
|
||
|
if is_ocean > 0.43 and humidity < 0.6 then return "desert" end -- coast?
|
||
|
if temp > 0.75 then return "desert" end
|
||
|
if humidity < 0.5 then
|
||
|
if temp > 0.5 then
|
||
|
return "desert"
|
||
|
else
|
||
|
return "plains"
|
||
|
end
|
||
|
else
|
||
|
if humidity > 0.75 then
|
||
|
return "rainforest"
|
||
|
else
|
||
|
if temp < 0.6 then
|
||
|
return "forest"
|
||
|
else
|
||
|
return "plains"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return "empty"
|
||
|
--]]
|
||
|
end
|
||
|
|
||
|
function love.load()
|
||
|
local noise = perlin(seed)
|
||
|
local gen = noise
|
||
|
for x=1, w do
|
||
|
map[x] = {}
|
||
|
for y=1, h do
|
||
|
map[x][y] = 0
|
||
|
end
|
||
|
end
|
||
|
for x=1, w do
|
||
|
for y=1, h do
|
||
|
local biome = pick_biome(x, y, noise)
|
||
|
--map[x][y] = biome
|
||
|
map[x][y] = biomecols[biome]
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function love.draw()
|
||
|
for x=1, w do
|
||
|
for y=1, h do
|
||
|
love.graphics.setColor(unpack(map[x][y]))
|
||
|
love.graphics.rectangle("fill",x*2, y*2, 2, 2)
|
||
|
end
|
||
|
end
|
||
|
end
|