Skip to content
Snippets Groups Projects
Commit 05711d9f authored by dg's avatar dg
Browse files

Forest generator can make ponds of water

git-svn-id: http://svn.net-core.org/repos/t-engine4@681 51575b47-30f0-44d4-a5cc-537603b46e54
parent cc549065
No related branches found
No related tags found
No related merge requests found
......@@ -33,6 +33,11 @@ function _M:init(zone, map, level, data)
self.hurst = data.hurst or nil
self.lacunarity = data.lacunarity or nil
self.octave = data.octave or 4
self.do_ponds = data.do_ponds
self.do_ponds.zoom = self.do_ponds.zoom or 5
self.do_ponds.octave = self.do_ponds.octave or 5
self.do_ponds.hurst = self.do_ponds.hurst or nil
self.do_ponds.lacunarity = self.do_ponds.lacunarity or nil
end
function _M:resolve(c)
......@@ -46,6 +51,59 @@ function _M:resolve(c)
end
end
function _M:addPond(x, y, spots)
local noise = core.noise.new(2, self.do_ponds.size.w, self.do_ponds.size.h)
local nmap = {}
local lowest = {v=100, x=nil, y=nil}
for i = 1, self.do_ponds.size.w do
nmap[i] = {}
for j = 1, self.do_ponds.size.h do
nmap[i][j] = noise:fbm_simplex(self.do_ponds.zoom * i / self.do_ponds.size.w, self.do_ponds.zoom * j / self.do_ponds.size.h, self.do_ponds.octave)
if nmap[i][j] < lowest.v then lowest.v = nmap[i][j]; lowest.x = i; lowest.y = j end
end
end
print("Lowest pond point", lowest.x, lowest.y," ::", lowest.v)
local quadrant = function(i, j)
local highest = {v=-100, x=nil, y=nil}
local l = line.new(lowest.x, lowest.y, i, j)
local lx, ly = l()
while lx do
print(lx, ly, nmap[lx][ly])
if nmap[lx][ly] > highest.v then highest.v = nmap[lx][ly]; highest.x = lx; highest.y = ly end
lx, ly = l()
end
print("Highest pond point", highest.x, highest.y," ::", highest.v)
local split = (highest.v + lowest.v)
local l = line.new(lowest.x, lowest.y, i, j)
local lx, ly = l()
while lx do
local stop = true
for _ = 1, #self.do_ponds.pond do
if nmap[lx][ly] < split * self.do_ponds.pond[_][1] then
self.map(lx-1+x, ly-1+y, Map.TERRAIN, self.grid_list[self.do_ponds.pond[_][2]])
stop = false
break
end
end
if stop then break end
lx, ly = l()
end
end
for i = 1, self.do_ponds.size.w do
quadrant(i, 1)
quadrant(i, self.do_ponds.size.h)
end
for i = 1, self.do_ponds.size.h do
quadrant(1, i)
quadrant(self.do_ponds.size.w, i)
end
spots[#spots+1] = {x=x, y=y, type="pond"}
end
function _M:generate(lev, old_lev)
for i = 0, self.map.w - 1 do for j = 0, self.map.h - 1 do
self.map(i, j, Map.TERRAIN, self.grid_list[self:resolve("floor")])
......@@ -65,6 +123,13 @@ function _M:generate(lev, old_lev)
end
local spots = {}
if self.do_ponds then
for i = 1, rng.range(self.do_ponds.nb[1], self.do_ponds.nb[2]) do
self:addPond(rng.range(self.do_ponds.size.w, self.map.w - self.do_ponds.size.w), rng.range(self.do_ponds.size.h, self.map.h - self.do_ponds.size.h), spots)
end
end
local ux, uy, dx, dy
if self.data.edge_entrances then
ux, uy, dx, dy, spots = self:makeStairsSides(lev, old_lev, self.data.edge_entrances, spots)
......
......@@ -749,7 +749,7 @@ function _M:setupMouse()
-- Target stuff
if button == "right" then
self.player:mouseMove(tmx, tmy)
if self.key == self.normal_key then self.player:mouseMove(tmx, tmy) end
-- Move map around
elseif button == "left" and xrel and yrel then
......
......@@ -34,3 +34,18 @@ newEntity{
block_sight = true,
air_level = -20,
}
newEntity{
define_as = "SHALLOW_WATER",
name = "shallow water", image = "terrain/water_floor.png",
display = '~', color=colors.LIGHT_BLUE, back_color=colors.DARK_BLUE,
always_remember = true,
}
newEntity{
define_as = "DEEP_WATER",
name = "deep water", image = "terrain/water_floor.png",
display = '~', color=colors.AQUAMARINE, back_color=colors.DARK_BLUE,
always_remember = true,
air_level = -5, air_condition="water",
}
......@@ -19,3 +19,4 @@
load("/data/general/grids/basic.lua")
load("/data/general/grids/forest.lua")
load("/data/general/grids/water.lua")
......@@ -25,18 +25,21 @@ return {
decay = {300, 800},
actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(-1,2) end,
width = 90, height = 90,
-- all_remembered = true,
all_remembered = true,
all_lited = true,
-- persistant = "zone",
generator = {
map = {
class = "engine.generator.map.Town",
floor = "FLOOR",
external_floor = "GRASS",
wall = "WALL",
class = "engine.generator.map.Forest",
floor = "GRASS",
wall = "TREE",
up = "UP",
down = "DOWN",
door = "DOOR",
do_ponds = {
nb = {0, 3},
size = {w=25, h=25},
pond = {{0.6, "DEEP_WATER"}, {0.8, "SHALLOW_WATER"}},
},
},
--[[
actor = {
......
......@@ -19,3 +19,4 @@
load("/data/general/grids/basic.lua")
load("/data/general/grids/forest.lua")
load("/data/general/grids/water.lua")
......@@ -39,6 +39,11 @@ return {
wall = "TREE",
up = "UP",
down = "DOWN",
do_ponds = {
nb = {0, 2},
size = {w=25, h=25},
pond = {{0.6, "DEEP_WATER"}, {0.8, "SHALLOW_WATER"}},
},
},
actor = {
class = "engine.generator.actor.Random",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment