summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dat/layout.des
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/dat/layout.des')
-rw-r--r--crawl-ref/source/dat/layout.des293
1 files changed, 37 insertions, 256 deletions
diff --git a/crawl-ref/source/dat/layout.des b/crawl-ref/source/dat/layout.des
index 366100d082..59e5d5d561 100644
--- a/crawl-ref/source/dat/layout.des
+++ b/crawl-ref/source/dat/layout.des
@@ -6,227 +6,6 @@
#
###############################################################################
-lua {{
- -- TODO enne - most of these should probably get moved back into C++
-
- function fill_area(x1, y1, x2, y2, feature)
- for x = x1, x2 do
- for y = y1, y2 do
- dgn.grid(x, y, feature)
- end
- end
- end
-
- function octa_room(x1, y1, x2, y2, oblique, fill)
- local ob_temp = oblique
-
- local rock_wall = dgn.feature_number("rock_wall")
- local shallow_water = dgn.feature_number("shallow_water")
- local deep_water = dgn.feature_number("deep_water")
- local floor = dgn.feature_number("floor")
-
- for x = x1, x2 do
- for y = y1 + ob_temp, y2 - ob_temp do
- if dgn.grid(x, y) == rock_wall then
- dgn.grid(x, y, fill)
- end
- if dgn.grid(x, y) == floor and (fill == shallow_water or fill == deep_water) then
- dgn.grid(x, y, shallow_water)
- end
- end
-
- if x > x2 - oblique then
- ob_temp = ob_temp + 1
- elseif ob_temp > 0 then
- ob_temp = ob_temp - 1
- end
- end
- end
-
- function pillars(center_x, center_y, num, flip_x, big_radius,
- pillar_radius, pillar_routine, fill)
- for i = 0, num - 1 do
- local angle = i * 2 * math.pi / num
- local x = math.floor(math.cos(angle) * big_radius * flip_x + 0.5)
- local y = math.floor(math.sin(angle) * big_radius + 0.5)
-
- pillar_routine(center_x + x, center_y + y, pillar_radius, fill)
- end
- end
-
- -- begin pillar functions
- function pillar_square(center_x, center_y, radius, fill)
- for x = -radius, radius do
- for y = -radius, radius do
- dgn.grid(center_x + x, center_y + y, fill)
- end
- end
- end
-
- function pillar_rounded_square(center_x, center_y, radius, fill)
- for x = -radius, radius do
- for y = -radius, radius do
- if math.abs(x) ~= radius or math.abs(y) ~= radius then
- dgn.grid(center_x + x, center_y + y, fill)
- end
- end
- end
- end
-
- function pillar_circle(center_x, center_y, radius, fill)
- for x = -radius, radius do
- for y = -radius, radius do
- if x * x + y * y < radius * radius then
- dgn.grid(center_x + x, center_y + y, fill)
- end
- end
- end
- end
- -- end pillar functions
-
- function select_from_weighted_table(tb)
- local value = nil
- local rollsize = 0
- for temp_val, temp_weight in pairs (tb) do
- if rollsize == 0 then
- value = temp_val
- rollsize = temp_weight
- else
- rollsize = rollsize + temp_weight
- if crawl.random2(rollsize) < temp_weight then
- value = temp_val
- end
- end
- end
-
- return value
- end
-
- -- Randomly selects a grid with feature 'search' and sets it to 'replace'
- function replace_random(search, replace)
- local gxm, gym = dgn.max_bounds()
-
- local feature = nil, x, y
- while feature ~= search do
- x = crawl.random2(gxm)
- y = crawl.random2(gym)
- feature = dgn.grid(x, y)
- end
-
- dgn.grid(x, y, replace)
- end
-
- function valid(x, y)
- local gxm, gym = dgn.max_bounds()
- return (x >= 0 and y >= 0 and x < gxm and y < gym)
- end
-
- -- Walks from x, y along dx,dy until it finds 'search'
- function replace_first(x, y, dx, dy, search, replace)
-
- local feature = dgn.grid(x, y)
-
- while feature ~= search and valid(x,y) do
- x = x + dx
- y = y + dy
- feature = dgn.grid(x, y)
- end
-
- if valid(x, y) then
- dgn.grid(x, y, replace)
- return true
- else
- return false
- end
- end
-
- function spotty_level(boxy, x1, y1, x2, y2)
- local iterations
- -- boxy levels have more clearing, so they get fewer iterations
- if boxy then
- iterations = 200 + crawl.random2(750)
- else
- iterations = 200 + crawl.random2(1500)
- end
-
- make_spotty(iterations, boxy, x1, y1, x2, y2)
- end
-
- -- randomly turns walls into floors
- function make_spotty(iterations, boxy, x1, y1, x2, y2)
- if x2 - x1 - 8 <= 0 or y2 - y1 - 8 <= 0 then
- return
- end
-
- local wall = dgn.feature_number("rock_wall")
- local floor = dgn.feature_number("floor")
-
- for i = 1, iterations do
- local x, y
- repeat
- x = crawl.random2(x2 - x1 - 7) + x1 + 4
- y = crawl.random2(y2 - y1 - 7) + y1 + 4
- until dgn.grid(x, y) ~= wall or
- dgn.grid(x-1, y) ~= wall or
- dgn.grid(x+1, y) ~= wall or
- dgn.grid(x, y-1) ~= wall or
- dgn.grid(x, y+1) ~= wall or
- dgn.grid(x-2, y) ~= wall or
- dgn.grid(x+2, y) ~= wall or
- dgn.grid(x, y-2) ~= wall or
- dgn.grid(x, y+2) ~= wall
-
- -- convenience function
- function replace_grid(x, y, search, replace)
- if dgn.grid(x, y) == search then
- dgn.grid(x, y, replace)
- end
- end
-
- replace_grid(x, y, wall, floor)
- replace_grid(x, y-1, wall, floor)
- replace_grid(x, y+1, wall, floor)
- replace_grid(x-1, y, wall, floor)
- replace_grid(x+1, y, wall, floor)
-
- if boxy then
- replace_grid(x-1, y-1, wall, floor)
- replace_grid(x+1, y+1, wall, floor)
- replace_grid(x-1, y+1, wall, floor)
- replace_grid(x+1, y-1, wall, floor)
- end
- end
- end
-
- -- randomly extends walls onto floors
- function smear_feature(iterations, boxy, feature, x1, y1, x2, y2)
- for i = 1, iterations do
- local x, y
- function check_box(x, y, feature)
- return dgn.grid(x+1, y) == feature or
- dgn.grid(x-1, y) == feature or
- dgn.grid(x, y+1) == feature or
- dgn.grid(x, y-1) == feature
- end
- function check_diagonal(x, y, feature)
- return dgn.grid(x+1, y+1) == feature or
- dgn.grid(x-1, y+1) == feature or
- dgn.grid(x-1, y-1) == feature or
- dgn.grid(x+1, y-1) == feature
- end
-
- repeat
- x = crawl.random2(x2 - x1 - 2) + x1 + 1
- y = crawl.random2(y2 - y1 - 2) + y1 + 1
- until dgn.grid(x, y) ~= feature and
- (check_box(x, y, feature) or
- not boxy and check_diagonal(x, y, feature))
-
- dgn.grid(x, y, feature)
- end
- end
-}}
-
##############################################################
# layout_forbidden_doughnut
#
@@ -241,15 +20,15 @@ TAGS: layout allow_dup
local gxm, gym = dgn.max_bounds()
local wall = dgn.feature_number("rock_wall")
local floor = dgn.feature_number("floor")
- fill_area(0, 0, gxm - 1, gym - 1, wall)
+ dgn.fill_area(0, 0, gxm - 1, gym - 1, wall)
local width = (10 - crawl.random2(7))
-- construct donut
- fill_area(10, 10, gxm - 10, 10 + width, floor)
- fill_area(10, 60 - width, gxm - 10, gym - 10, floor)
- fill_area(10, 10, 10 + width, gym - 10, floor)
- fill_area(60 - width, 10, gxm - 10, gym - 10, floor)
+ dgn.fill_area(10, 10, gxm - 10, 10 + width, floor)
+ dgn.fill_area(10, 60 - width, gxm - 10, gym - 10, floor)
+ dgn.fill_area(10, 10, 10 + width, gym - 10, floor)
+ dgn.fill_area(60 - width, 10, gxm - 10, gym - 10, floor)
local spotty = crawl.coinflip()
local smears = crawl.random2(300)
@@ -258,8 +37,8 @@ TAGS: layout allow_dup
if crawl.coinflip() then
local width2 = 1 + crawl.random2(5)
- fill_area(10, gym/2 - width2, gxm - 10, gym/2 + width2, floor)
- fill_area(gxm/2 - width2, 10, gxm/2 + width2, gym - 10, floor)
+ dgn.fill_area(10, gym/2 - width2, gxm - 10, gym/2 + width2, floor)
+ dgn.fill_area(gxm/2 - width2, 10, gxm/2 + width2, gym - 10, floor)
-- sometimes add a small octagon room
if crawl.coinflip() and crawl.random2(15) > 7 then
@@ -268,14 +47,12 @@ TAGS: layout allow_dup
oblique = 5 + crawl.random2(20)
end
- local feature_name = select_from_weighted_table({
+ local feature_name = crawl.random_element({
["floor"] = 5,
["deep_water"] = 1,
["lava"] = 1,
})
- local feature_idx = dgn.feature_number(feature_name)
-
- octa_room(25, 25, gxm - 25, gym - 25, oblique, feature_idx)
+ dgn.octa_room(25, 25, gxm - 25, gym - 25, oblique, feature_name)
-- decrease spotty chance
spotty = crawl.one_chance_in(5)
@@ -286,10 +63,10 @@ TAGS: layout allow_dup
local smear_boxy = crawl.coinflip()
if spotty then
- spotty_level(spotty_boxy, 0, 0, gxm - 1, gym - 1)
+ dgn.spotty_level(true, 0, spotty_boxy)
end
if not spotty and crawl.one_chance_in(4) or spotty then
- smear_feature(smears, smear_boxy, wall, 0, 0, gxm - 1, gym - 1)
+ dgn.smear_feature(smears, smear_boxy, wall, 0, 0, gxm - 1, gym - 1)
end
}}
MAP
@@ -328,23 +105,23 @@ TAGS: layout allow_dup
end
-- fill with rock
- fill_area(0, 0, gxm-1, gym-1, wall)
+ dgn.fill_area(0, 0, gxm-1, gym-1, wall)
-- create window
if window then
local clear = dgn.feature_number("clear_rock_wall")
- fill_area(10, gym/2 - height - 1, gxm - 10, gym/2 - height - 1, clear)
- fill_area(10, gym/2 + height + 1, gxm - 10, gym/2 + height + 1, clear)
- fill_area(gxm/2 - width - 1, 10, gxm/2 - width - 1, gym - 10, clear)
- fill_area(gxm/2 + width + 1, 10, gxm/2 + width + 1, gym - 10, clear)
+ dgn.fill_area(10, gym/2 - height - 1, gxm - 10, gym/2 - height - 1, clear)
+ dgn.fill_area(10, gym/2 + height + 1, gxm - 10, gym/2 + height + 1, clear)
+ dgn.fill_area(gxm/2 - width - 1, 10, gxm/2 - width - 1, gym - 10, clear)
+ dgn.fill_area(gxm/2 + width + 1, 10, gxm/2 + width + 1, gym - 10, clear)
end
-- create a cross
- fill_area(10, gym/2 - height, gxm - 10, gym/2 + height, floor)
- fill_area(gxm/2 - width, 10, gxm/2 + width, gym - 10, floor)
+ dgn.fill_area(10, gym/2 - height, gxm - 10, gym/2 + height, floor)
+ dgn.fill_area(gxm/2 - width, 10, gxm/2 + width, gym - 10, floor)
if not crawl.one_chance_in(4) then
- spotty_level(crawl.coinflip(), 0, 0, gxm - 1, gym - 1)
+ dgn.spotty_level(true, 0, crawl.coinflip())
end
}}
MAP
@@ -369,13 +146,12 @@ TAGS: layout allow_dup
local oblique = 10 + crawl.random2(20)
- -- Step 1: Create octagon
- fill_area(0, 0, gxm - 1, gym - 1, wall)
- octa_room(10, 10, gxm - 10, gym - 10, oblique, floor)
+ dgn.fill_area(0, 0, gxm - 1, gym - 1, "rock_wall")
+ dgn.octa_room(10, 10, gxm - 10, gym - 10, oblique, "floor")
- if crawl.coinflip() then
+ if crawl.coinflip() or true then
local iterations = 100 + crawl.random2(200)
- smear_feature(iterations, false, wall, 0, 0, gxm - 1, gym - 1)
+ dgn.smear_feature(iterations, false, wall, 0, 0, gxm - 1, gym - 1)
end
-- Step 2: Add pillars
@@ -389,10 +165,14 @@ TAGS: layout allow_dup
["deep_water"] = 2,
["lava"] = 1,
}
- local fill = dgn.feature_number(select_from_weighted_table(pillar_fill))
+ local fill = dgn.feature_number(crawl.random_element(pillar_fill))
-- Potential pillar drawing routines
- local pillar_func = {pillar_circle, pillar_square, pillar_rounded_square}
+ local pillar_func = {
+ dgn.make_circle,
+ dgn.make_square,
+ dgn.make_rounded_square
+ }
-- Pillar size params
-- NOTE: Be careful about tweaking the ranges here. Pillars that are
@@ -402,14 +182,15 @@ TAGS: layout allow_dup
local pillar_radius = 1 + crawl.random2(3)
local circle_radius = 2 + crawl.random2(6) + pillar_radius * 2 + num / 2
+
-- beautification hack: no "circle" pillars of radius 1
if type == 1 and pillar_radius == 1 then
fill = dgn.feature_number("stone_arch")
end
-- Finally, make the pillars
- pillars(gxm/2, gym/2, num, 1, circle_radius, pillar_radius,
- pillar_func[type], fill)
+ dgn.make_pillars(gxm/2, gym/2, num, 1, circle_radius, pillar_radius,
+ pillar_func[type], fill)
-- Step 3: Create stairs
@@ -445,17 +226,17 @@ TAGS: layout allow_dup
local ret = true
if loc == 0 then
- replace_random(floor, stair_list[i])
+ dgn.replace_random(floor, stair_list[i])
elseif loc == 1 then
dgn.grid(gxm/2 + i - 2, gym/2 + 1 - math.abs(i - 2), st)
elseif loc == 2 then
- ret = replace_first(gxm/2 + i - 2, 0, 0, 1, floor, st)
+ ret = dgn.replace_first(gxm/2 + i-2, 0, 0, 1, floor, st)
elseif loc == 3 then
- ret = replace_first(gxm - 1, gym/2 + i - 2, -1, 0, floor, st)
+ ret = dgn.replace_first(gxm - 1, gym/2 + i-2, -1, 0, floor, st)
elseif loc == 4 then
- ret = replace_first(gxm/2 + i - 2, gym - 1, 0, -1, floor, st)
+ ret = dgn.replace_first(gxm/2 + i-2, gym - 1, 0, -1, floor, st)
elseif loc == 5 then
- ret = replace_first(0, gym/2 + i - 2, 1, 0, floor, st)
+ ret = dgn.replace_first(0, gym/2 + i-2, 1, 0, floor, st)
end
assert(ret)