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.des177
1 files changed, 170 insertions, 7 deletions
diff --git a/crawl-ref/source/dat/layout.des b/crawl-ref/source/dat/layout.des
index 0727074e79..366100d082 100644
--- a/crawl-ref/source/dat/layout.des
+++ b/crawl-ref/source/dat/layout.des
@@ -7,6 +7,8 @@
###############################################################################
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
@@ -15,18 +17,20 @@ lua {{
end
end
- function octa_room(x1, y1, x2, y2, oblique, floor)
+ 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, floor)
+ dgn.grid(x, y, fill)
end
- if dgn.grid(x, y) == floor and floor == shallow_water then
+ if dgn.grid(x, y) == floor and (fill == shallow_water or fill == deep_water) then
dgn.grid(x, y, shallow_water)
end
end
@@ -135,9 +139,163 @@ lua {{
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
+#
+# This replaces dungeon.cc:_plan_1(). It usually creates a
+# room with a large hole in the middle.
+#
+NAME: layout_forbidden_donut
+ORIENT: encompass
+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)
+
+ 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)
+
+ local spotty = crawl.coinflip()
+ local smears = crawl.random2(300)
+
+ -- sometimes add a hallway cross through center
+ 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)
+
+ -- sometimes add a small octagon room
+ if crawl.coinflip() and crawl.random2(15) > 7 then
+ local oblique = 0
+ if crawl.coinflip() then
+ oblique = 5 + crawl.random2(20)
+ end
+
+ local feature_name = select_from_weighted_table({
+ ["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)
+
+ -- decrease spotty chance
+ spotty = crawl.one_chance_in(5)
+ end
+ end
+
+ local spotty_boxy = crawl.coinflip()
+ local smear_boxy = crawl.coinflip()
+
+ if spotty then
+ spotty_level(spotty_boxy, 0, 0, gxm - 1, gym - 1)
+ 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)
+ end
+}}
+MAP
+ENDMAP
+
+##############################################################
# layout_cross
#
# This replaces dungeon.cc:_plan_2(). It creates a large cross
@@ -185,13 +343,14 @@ TAGS: layout allow_dup
fill_area(10, gym/2 - height, gxm - 10, gym/2 + height, floor)
fill_area(gxm/2 - width, 10, gxm/2 + width, gym - 10, floor)
- -- TODO enne - add lua function for spotty()
+ if not crawl.one_chance_in(4) then
+ spotty_level(crawl.coinflip(), 0, 0, gxm - 1, gym - 1)
+ end
}}
MAP
-.
ENDMAP
-##############################################################
+#############################################################
# layout_big_octagon
#
# This replaces dungeon.cc:_plan_6(). It has an octagonal
@@ -214,6 +373,11 @@ TAGS: layout allow_dup
fill_area(0, 0, gxm - 1, gym - 1, wall)
octa_room(10, 10, gxm - 10, gym - 10, oblique, floor)
+ if crawl.coinflip() then
+ local iterations = 100 + crawl.random2(200)
+ smear_feature(iterations, false, wall, 0, 0, gxm - 1, gym - 1)
+ end
+
-- Step 2: Add pillars
-- pillar types and relative weights
@@ -299,5 +463,4 @@ TAGS: layout allow_dup
end
}}
MAP
-.
ENDMAP