random-stuff/heavbiome/main.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