Files
nethack/dat/castle.lua
copperwater 0fef8fce9f Unify all special level filling options
The existing system was a confusing mess of competing names (filled,
needfill, prefilled, etc) that had varying semantics, with prefilled
being the worst offender as it meant at least three different things in
various contexts. This commit unifies everything in the code under
"needfill", and everything in Lua under "filled", which defaults to 0
everywhere.

This also removes the second argument to fill_special_room; that
function now just checks the needfill of the room it's passed. As
before, a filled == 2 value is used for a special room to indicate that
the room should set the appropriate level flag, but shouldn't actually
be stocked with anything (for instance, King Arthur's throne room); the
difference is that this now comes directly from the lua script instead
of being manipulated within sp_lev.c.

The prefilled argument had one use case that is occasionally used in the
level files: if the level designer had specified an ordinary region with
prefilled = 1, it would become a room to control monster arrivals on a
level -- monsters that arrive within the bounds of a room are supposed
to stay there.
However, not all of the places where the comments indicated this was
being used were using it correctly; I tested this by letting a few
monsters fall through the knox portal (they're supposed to be
constrained to the entry room) and waiting a hundred turns, then going
through the portal; they were not constrained to the room and had
"wandered" through its walls.
Instead of trying to maintain this special case, I have added an
optional "arrival_room" boolean argument to des.region, which forces it
to create a room for the purposes of constraining monster arrival.

I have gone through and replaced occurrences of prefilled in lua files
with the appropriate filled option (or arrival, as needed). In some
cases, that resulted in questionable regions such as a filled ordinary
area in a non-themeroom (I just dropped the filled=1), or an area which
didn't do anything, not even lighting (which I deleted).
2020-09-27 18:54:15 +03:00

257 lines
8.4 KiB
Lua

-- NetHack 3.7 castle.des $NHDT-Date: 1432512783 2015/05/25 00:13:03 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $
-- Copyright (c) 1989 by Jean-Christophe Collet
-- NetHack may be freely redistributed. See license for details.
--
--
-- This is the stronghold level :
-- there are several ways to enter it :
-- - opening the drawbridge (wand of opening, knock spell, playing
-- the appropriate tune)
--
-- - enter via the back entry (this suppose a ring of levitation, boots
-- of water walking, etc.)
--
-- Note : If you don't play the right tune, you get indications like in the
-- MasterMind game...
--
-- To motivate the player : there are 4 storerooms (armors, weapons, food and
-- gems) and a wand of wishing in one of the 4 towers...
des.level_init({ style="mazegrid", bg ="-" });
des.level_flags("mazelevel", "noteleport", "noflipy")
des.map([[
}}}}}}}}}.............................................}}}}}}}}}
}-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------}
}|.....|-----------------------------------------------|.....|}
}|.....+...............................................+.....|}
}-------------------------------+-----------------------------}
}}}}}}|........|..........+...........|.......S.S.......|}}}}}}
.....}|........|..........|...........|.......|.|.......|}.....
.....}|........------------...........---------S---------}.....
.....}|...{....+..........+.........\.S.................+......
.....}|........------------...........---------S---------}.....
.....}|........|..........|...........|.......|.|.......|}.....
}}}}}}|........|..........+...........|.......S.S.......|}}}}}}
}-------------------------------+-----------------------------}
}|.....+...............................................+.....|}
}|.....|-----------------------------------------------|.....|}
}-------}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}-------}
}}}}}}}}}.............................................}}}}}}}}}
]]);
-- Random registers initialisation
local object = { "[", ")", "*", "%" };
shuffle(object)
local place = selection.new();
place:set(04,02);
place:set(58,02);
place:set(04,14);
place:set(58,14);
local monster = { "L", "N", "E", "H", "M", "O", "R", "T", "X", "Z" }
shuffle(monster)
des.teleport_region({ region = {01,00,10,20}, region_islev=1, exclude={1,1,61,15}, dir="down" })
des.teleport_region({ region = {69,00,79,20}, region_islev=1, exclude={1,1,61,15}, dir="up" })
des.levregion({ region = {01,00,10,20}, region_islev=1, exclude={0,0,62,16}, type="stair-up" })
des.feature("fountain", 10,08)
-- Doors
des.door("closed",07,03)
des.door("closed",55,03)
des.door("locked",32,04)
des.door("locked",26,05)
des.door("locked",46,05)
des.door("locked",48,05)
des.door("locked",47,07)
des.door("closed",15,08)
des.door("closed",26,08)
des.door("locked",38,08)
des.door("locked",56,08)
des.door("locked",47,09)
des.door("locked",26,11)
des.door("locked",46,11)
des.door("locked",48,11)
des.door("locked",32,12)
des.door("closed",07,13)
des.door("closed",55,13)
-- The drawbridge
des.drawbridge({ dir="east", state="closed", x=05,y=08})
-- Storeroom number 1
des.object(object[1],39,05)
des.object(object[1],40,05)
des.object(object[1],41,05)
des.object(object[1],42,05)
des.object(object[1],43,05)
des.object(object[1],44,05)
des.object(object[1],45,05)
des.object(object[1],39,06)
des.object(object[1],40,06)
des.object(object[1],41,06)
des.object(object[1],42,06)
des.object(object[1],43,06)
des.object(object[1],44,06)
des.object(object[1],45,06)
-- Storeroom number 2
des.object(object[2],49,05)
des.object(object[2],50,05)
des.object(object[2],51,05)
des.object(object[2],52,05)
des.object(object[2],53,05)
des.object(object[2],54,05)
des.object(object[2],55,05)
des.object(object[2],49,06)
des.object(object[2],50,06)
des.object(object[2],51,06)
des.object(object[2],52,06)
des.object(object[2],53,06)
des.object(object[2],54,06)
des.object(object[2],55,06)
-- Storeroom number 3
des.object(object[3],39,10)
des.object(object[3],40,10)
des.object(object[3],41,10)
des.object(object[3],42,10)
des.object(object[3],43,10)
des.object(object[3],44,10)
des.object(object[3],45,10)
des.object(object[3],39,11)
des.object(object[3],40,11)
des.object(object[3],41,11)
des.object(object[3],42,11)
des.object(object[3],43,11)
des.object(object[3],44,11)
des.object(object[3],45,11)
-- Storeroom number 4
des.object(object[4],49,10)
des.object(object[4],50,10)
des.object(object[4],51,10)
des.object(object[4],52,10)
des.object(object[4],53,10)
des.object(object[4],54,10)
des.object(object[4],55,10)
des.object(object[4],49,11)
des.object(object[4],50,11)
des.object(object[4],51,11)
des.object(object[4],52,11)
des.object(object[4],53,11)
des.object(object[4],54,11)
des.object(object[4],55,11)
-- THE WAND OF WISHING in 1 of the 4 towers
local px, py = place:rndcoord(1);
des.object({ id = "chest", trapped = 0, locked = 1, x = px, y = py,
contents = function()
des.object("wishing");
end
});
-- Prevent monsters from eating it. (@'s never eat objects)
des.engraving({ x = px, y = py, type="burn", text="Elbereth" })
des.object({ id = "scare monster", x = px, y = py, buc="cursed" })
-- The treasure of the lord
des.object("chest",37,08)
-- Traps
des.trap("trap door",40,08)
des.trap("trap door",44,08)
des.trap("trap door",48,08)
des.trap("trap door",52,08)
des.trap("trap door",55,08)
-- Soldiers guarding the entry hall
des.monster("soldier",08,06)
des.monster("soldier",09,05)
des.monster("soldier",11,05)
des.monster("soldier",12,06)
des.monster("soldier",08,10)
des.monster("soldier",09,11)
des.monster("soldier",11,11)
des.monster("soldier",12,10)
des.monster("lieutenant",09,08)
-- Soldiers guarding the towers
des.monster("soldier",03,02)
des.monster("soldier",05,02)
des.monster("soldier",57,02)
des.monster("soldier",59,02)
des.monster("soldier",03,14)
des.monster("soldier",05,14)
des.monster("soldier",57,14)
des.monster("soldier",59,14)
-- The four dragons that are guarding the storerooms
des.monster("D",47,05)
des.monster("D",47,06)
des.monster("D",47,10)
des.monster("D",47,11)
-- Sea monsters in the moat
des.monster("giant eel",05,07)
des.monster("giant eel",05,09)
des.monster("giant eel",57,07)
des.monster("giant eel",57,09)
des.monster("shark",05,00)
des.monster("shark",05,16)
des.monster("shark",57,00)
des.monster("shark",57,16)
-- The throne room and the court monsters
des.monster(monster[10],27,05)
des.monster(monster[1],30,05)
des.monster(monster[2],33,05)
des.monster(monster[3],36,05)
des.monster(monster[4],28,06)
des.monster(monster[5],31,06)
des.monster(monster[6],34,06)
des.monster(monster[7],37,06)
des.monster(monster[8],27,07)
des.monster(monster[9],30,07)
des.monster(monster[10],33,07)
des.monster(monster[1],36,07)
des.monster(monster[2],28,08)
des.monster(monster[3],31,08)
des.monster(monster[4],34,08)
des.monster(monster[5],27,09)
des.monster(monster[6],30,09)
des.monster(monster[7],33,09)
des.monster(monster[8],36,09)
des.monster(monster[9],28,10)
des.monster(monster[10],31,10)
des.monster(monster[1],34,10)
des.monster(monster[2],37,10)
des.monster(monster[3],27,11)
des.monster(monster[4],30,11)
des.monster(monster[5],33,11)
des.monster(monster[6],36,11)
-- MazeWalks
des.mazewalk(00,10,"west")
des.mazewalk(62,06,"east")
-- Non diggable walls
des.non_diggable(selection.area(00,00,62,16))
-- Subrooms:
-- Entire castle area
des.region(selection.area(00,00,62,16),"unlit")
-- Courtyards
des.region(selection.area(00,05,05,11),"lit")
des.region(selection.area(57,05,62,11),"lit")
-- Throne room
des.region({ region={27,05, 37,11},lit=1,type="throne", filled=2 })
-- Antechamber
des.region(selection.area(07,05,14,11),"lit")
-- Storerooms
des.region(selection.area(39,05,45,06),"lit")
des.region(selection.area(39,10,45,11),"lit")
des.region(selection.area(49,05,55,06),"lit")
des.region(selection.area(49,10,55,11),"lit")
-- Corners
des.region(selection.area(02,02,06,03),"lit")
des.region(selection.area(56,02,60,03),"lit")
des.region(selection.area(02,13,06,14),"lit")
des.region(selection.area(56,13,60,14),"lit")
-- Barracks
des.region({ region={16,05, 25,06},lit=1,type="barracks", filled=1 })
des.region({ region={16,10, 25,11},lit=1,type="barracks", filled=1 })
-- Hallways
des.region(selection.area(08,03,54,03),"unlit")
des.region(selection.area(08,13,54,13),"unlit")
des.region(selection.area(16,08,25,08),"unlit")
des.region(selection.area(39,08,55,08),"unlit")
-- Storeroom alcoves
des.region(selection.area(47,05,47,06),"unlit")
des.region(selection.area(47,10,47,11),"unlit")