-- NetHack 3.7 hellfill.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.25 $ -- Copyright (c) 2022 by Pasi Kallinen -- NetHack may be freely redistributed. See license for details. -- -- -- The "fill" level for gehennom. -- -- This level is used to fill out any levels not occupied by -- specific levels. -- function hellobjects() local objclass = { "(", "/", "=", "+", ")", "[", "?", "*", "%" }; shuffle(objclass); des.object(objclass[1]); des.object(objclass[1]); des.object(objclass[2]); des.object(objclass[3]); des.object(objclass[4]); des.object(objclass[5]); des.object() des.object() end -- function hellmonsters() local monclass = { "V", "D", " ", "&", "Z" }; shuffle(monclass); des.monster({ class = monclass[1], peaceful = 0 }); des.monster({ class = monclass[1], peaceful = 0 }); des.monster({ class = monclass[2], peaceful = 0 }); des.monster({ class = monclass[2], peaceful = 0 }); des.monster({ class = monclass[3], peaceful = 0 }); des.monster({ class = monclass[4], peaceful = 0 }); des.monster({ peaceful = 0 }); des.monster({ class = "H", peaceful = 0 }); end -- function helltraps() for i = 1, 12 do des.trap() end end -- function populatemaze() for i = 1, math.random(8) + 11 do if (percent(50)) then des.object("*"); else des.object(); end end for i = 1, math.random(10) + 2 do des.object("`"); end for i = 1, math.random(3) do des.monster({ id = "minotaur", peaceful = 0 }); end for i = 1, math.random(5) + 7 do des.monster({ peaceful = 0 }); end for i = 1, math.random(6) + 7 do des.gold(); end for i = 1, math.random(6) + 7 do des.trap(); end end -- function rnd_halign() local aligns = { "half-left", "center", "half-right" }; return aligns[math.random(1, #aligns)]; end function rnd_valign() local aligns = { "top", "center", "bottom" }; return aligns[math.random(1, #aligns)]; end -- the prefab maps must have contents-function, or populatemaze() -- puts the stuff only inside the prefab map. local hell_prefabs = { function () des.map({ halign = rnd_halign(), valign = "center", map = [[ ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ...... ......]], contents = function() end }); end, function () des.map({ halign = rnd_halign(), valign = "center", map = [[ xxxxxx.....xxxxxx xxxx.........xxxx xx.............xx xx.............xx x...............x x...............x ................. ................. ................. ................. ................. x...............x x...............x xx.............xx xx.............xx xxxx.........xxxx xxxxxx.....xxxxxx ]], contents = function() end }); end, function (coldhell) des.map({ halign = rnd_halign(), valign = rnd_valign(), map = [[ xxxxxx.xxxxxx xLLLLLLLLLLLx xL---------Lx xL|.......|Lx xL|.......|Lx .L|.......|L. xL|.......|Lx xL|.......|Lx xL---------Lx xLLLLLLLLLLLx xxxxxx.xxxxxx ]], contents = function() des.non_diggable(selection.area(2,2, 10,8)); des.region(selection.area(4,4, 8,6), "lit"); if (coldhell) then des.replace_terrain({ region = {1,1, 11,9}, fromterrain="L", toterrain="P" }); end local dblocs = { { x = 1, y = 5, dir="east", state="closed" }, { x = 11, y = 5, dir="west", state="closed" }, { x = 6, y = 1, dir="south", state="closed" }, { x = 6, y = 9, dir="north", state="closed" } } shuffle(dblocs); for i = 1, math.random(1, #dblocs) do des.drawbridge(dblocs[i]); end local mons = { "H", "T", "@" }; shuffle(mons); for i = 1, 3 + math.random(1, 5) do des.monster(mons[1], 6, 5); end end }); end, function () des.map({ halign = "center", valign = "center", map = [[ .............................................................. .............................................................. .............................................................. .............................................................. ..............................................................]], contents = function() end }); end, function () des.map({ halign = rnd_halign(), valign = rnd_valign(), lit = true, map = [[ x.....x ....... ....... ....... ....... ....... x.....x]], contents = function() end }); end, function () des.map({ halign = rnd_halign(), valign = rnd_valign(), map = [[ BBBBBBB B.....B B.....B B.....B B.....B B.....B BBBBBBB]], contents = function() des.region({ region={2,2, 2,2}, type="temple", filled=1, irregular=1 }); des.altar({ x=3, y=3, align="noalign", type=percent(75) and "altar" or "shrine" }); end }); end, function () des.map({ halign = rnd_halign(), valign = rnd_valign(), map = [[ .......... .......... .......... ...FFFF... ...F..F... ...F..F... ...FFFF... .......... .......... ..........]], contents = function() local mons = { "Angel", "D", "H", "L" }; des.monster(mons[math.random(1, #mons)], 4,4); end }); end, function () des.map({ halign = rnd_halign(), valign = rnd_valign(), map = [[ ......... .}}}}}}}. .}}---}}. .}--.--}. .}|...|}. .}--.--}. .}}---}}. .}}}}}}}. ......... ]], contents = function(rm) des.monster("L",04,04) end }) end, }; function rnd_hell_prefab(coldhell) local pf = math.random(1, #hell_prefabs); hell_prefabs[pf](coldhell); end hells = { -- 1: "mines" style with lava function () des.level_init({ style = "solidfill", fg = " ", lit = 0 }); des.level_flags("mazelevel", "noflip"); des.level_init({ style="mines", fg=".", smoothed=true ,joined=true, lit=0, walled=true }); des.replace_terrain({ fromterrain = " ", toterrain = "L" }); des.replace_terrain({ fromterrain = ".", toterrain = "L", chance = 5 }); des.replace_terrain({ mapfragment = [[w]], toterrain = "L", chance = 20 }); des.replace_terrain({ mapfragment = [[w]], toterrain = ".", chance = 15 }); end, -- 2: mazes like original, with some hell_tweaks function () des.level_init({ style = "solidfill", fg = " ", lit = 0 }); des.level_flags("mazelevel", "noflip"); des.level_init({ style = "mazegrid", bg = "-" }); des.mazewalk({ coord = {01,10}, dir = "east", stocked = false}); local tmpbounds = selection.match("-"); local bnds = tmpbounds:bounds(); local protected_area = selection.fillrect(bnds.lx, bnds.ly + 1, bnds.hx - 2, bnds.hy - 1); hell_tweaks(protected_area:negate()); if (percent(25)) then rnd_hell_prefab(false); end end, -- 3: mazes, style 1: wall thick = 1, random wid corr function () des.level_init({ style = "solidfill", fg = " ", lit = 0 }); des.level_flags("mazelevel", "noflip"); des.level_init({ style = "maze", wallthick = 1 }); end, -- 4: mazes, style 2: replace wall with iron bars or lava function () local cwid = math.random(4); des.level_init({ style = "solidfill", fg = " ", lit = 0 }); des.level_flags("mazelevel", "noflip"); des.level_init({ style = "maze", wallthick = 1, corrwid = cwid }); local outside_walls = selection.match(" "); local wallterrain = { "F", "L" }; shuffle(wallterrain); des.replace_terrain({ mapfragment = "w", toterrain = wallterrain[1] }); if (cwid == 1) then if (wallterrain[1] == "F" and percent(80)) then -- replace some horizontal iron bars walls with floor des.replace_terrain({ mapfragment = ".\nF\n.", toterrain = ".", chance = 25 * math.random(4) }); elseif (percent(25)) then rnd_hell_prefab(false); end end des.terrain(outside_walls, " "); -- return the outside back to solid wall end, -- 5: mazes, thick walls, occasionally lava instead of walls function () des.level_init({ style = "solidfill", fg = " ", lit = 0 }); des.level_flags("mazelevel", "noflip"); des.level_init({ style = "maze", wallthick = 1 + math.random(2), corrwid = math.random(2) }); if (percent(50)) then local outside_walls = selection.match(" "); des.replace_terrain({ mapfragment = "w", toterrain = "L" }); des.terrain(outside_walls, " "); -- return the outside back to solid wall end end, -- 6: cold maze, with ice and water function () local cwid = math.random(4); des.level_init({ style = "solidfill", fg = " ", lit = 0 }); des.level_flags("mazelevel", "noflip", "cold"); des.level_init({ style = "maze", wallthick = 1, corrwid = cwid }); local outside_walls = selection.match(" "); local icey = selection.negate():percentage(10):grow():filter_mapchar("."); des.terrain(icey, "I"); if (cwid > 1) then -- turn some ice into wall of water des.terrain(icey:percentage(1), "W"); end des.terrain(icey:percentage(5), "P"); if (percent(25)) then des.terrain(selection.match("w"), "W"); -- walls of water end if (cwid == 1 and percent(25)) then rnd_hell_prefab(true); end des.terrain(outside_walls, " "); -- return the outside back to solid wall end, }; local hellno = math.random(1, #hells); hells[hellno](); -- des.stair("up") if (u.invocation_level) then des.trap("vibrating square"); else des.stair("down") end populatemaze();