*** empty log message ***
This commit is contained in:
726
doc/lev_comp.txt
Normal file
726
doc/lev_comp.txt
Normal file
@@ -0,0 +1,726 @@
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
NAME
|
||||
lev_comp - NetHack special levels compiler
|
||||
|
||||
SYNOPSIS
|
||||
lev_comp [ -w ] [ files ]
|
||||
|
||||
If no arguments are given, it reads standard input.
|
||||
|
||||
DESCRIPTION
|
||||
Lev_comp is a special level compiler for NetHack version 3.2
|
||||
and higher. It takes description files as arguments and
|
||||
produces level files that can be loaded by NetHack at run-
|
||||
time.
|
||||
|
||||
The purpose of this tool is to provide NetHack administra-
|
||||
tors and implementors with a convenient way for adding spe-
|
||||
cial levels to the game, or modifying existing ones, without
|
||||
having to recompile the entire world.
|
||||
|
||||
The -w option causes lev_comp to perform extra checks on the
|
||||
level and display extra warnings, however these warnings are
|
||||
sometimes superfluous, so they are not normally displayed.
|
||||
|
||||
|
||||
GRAMMAR
|
||||
file : /* nothing */
|
||||
| levels
|
||||
;
|
||||
|
||||
levels : level
|
||||
| level levels
|
||||
;
|
||||
|
||||
level : maze_level
|
||||
| room_level
|
||||
;
|
||||
|
||||
maze_level : maze_def flags lev_init messages regions
|
||||
;
|
||||
|
||||
room_level : level_def flags lev_init messages rreg_init rooms corridors_def
|
||||
;
|
||||
|
||||
level_def : LEVEL_ID ':' string
|
||||
;
|
||||
|
||||
lev_init : /* nothing */
|
||||
| LEV_INIT_ID ':' CHAR ',' CHAR ',' BOOLEAN ',' BOOLEAN ',' light_state ',' walled
|
||||
;
|
||||
|
||||
walled : BOOLEAN
|
||||
| RANDOM_TYPE
|
||||
|
||||
|
||||
|
||||
May Last change: 16 1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
;
|
||||
|
||||
flags : /* nothing */
|
||||
| FLAGS_ID ':' flag_list
|
||||
;
|
||||
|
||||
flag_list : FLAG_TYPE ',' flag_list
|
||||
| FLAG_TYPE
|
||||
;
|
||||
|
||||
messages : /* nothing */
|
||||
| message messages
|
||||
;
|
||||
|
||||
message : MESSAGE_ID ':' STRING
|
||||
;
|
||||
|
||||
rreg_init : /* nothing */
|
||||
| rreg_init init_rreg
|
||||
;
|
||||
|
||||
init_rreg : RANDOM_OBJECTS_ID ':' object_list
|
||||
| RANDOM_MONSTERS_ID ':' monster_list
|
||||
;
|
||||
|
||||
rooms : /* Nothing - dummy room for use with INIT_MAP */
|
||||
| roomlist
|
||||
;
|
||||
|
||||
roomlist : aroom
|
||||
| aroom roomlist
|
||||
;
|
||||
|
||||
corridors_def : random_corridors
|
||||
| corridors
|
||||
;
|
||||
|
||||
random_corridors: RAND_CORRIDOR_ID
|
||||
;
|
||||
|
||||
corridors : /* nothing */
|
||||
| corridors corridor
|
||||
;
|
||||
|
||||
corridor : CORRIDOR_ID ':' corr_spec ',' corr_spec
|
||||
| CORRIDOR_ID ':' corr_spec ',' INTEGER
|
||||
;
|
||||
|
||||
corr_spec : '(' INTEGER ',' DIRECTION ',' door_pos ')'
|
||||
;
|
||||
|
||||
aroom : room_def room_details
|
||||
|
||||
|
||||
|
||||
May Last change: 16 2
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
| subroom_def room_details
|
||||
;
|
||||
|
||||
subroom_def : SUBROOM_ID ':' room_type ',' light_state ',' subroom_pos ',' room_size ',' string roomfill
|
||||
;
|
||||
|
||||
room_def : ROOM_ID ':' room_type ',' light_state ',' room_pos ',' room_align ',' room_size roomfill
|
||||
;
|
||||
|
||||
roomfill : /* nothing */
|
||||
| ',' BOOLEAN
|
||||
;
|
||||
|
||||
room_pos : '(' INTEGER ',' INTEGER ')'
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
subroom_pos : '(' INTEGER ',' INTEGER ')'
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
room_align : '(' h_justif ',' v_justif ')'
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
room_size : '(' INTEGER ',' INTEGER ')'
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
room_details : /* nothing */
|
||||
| room_details room_detail
|
||||
;
|
||||
|
||||
room_detail : room_name
|
||||
| room_chance
|
||||
| room_door
|
||||
| monster_detail
|
||||
| object_detail
|
||||
| trap_detail
|
||||
| altar_detail
|
||||
| fountain_detail
|
||||
| sink_detail
|
||||
| pool_detail
|
||||
| gold_detail
|
||||
| engraving_detail
|
||||
| stair_detail
|
||||
;
|
||||
|
||||
room_name : NAME_ID ':' string
|
||||
;
|
||||
|
||||
room_chance : CHANCE_ID ':' INTEGER
|
||||
|
||||
|
||||
|
||||
May Last change: 16 3
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
;
|
||||
|
||||
room_door : DOOR_ID ':' secret ',' door_state ',' door_wall ',' door_pos
|
||||
;
|
||||
|
||||
secret : BOOLEAN
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
door_wall : DIRECTION
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
door_pos : INTEGER
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
maze_def : MAZE_ID ':' string ',' filling
|
||||
;
|
||||
|
||||
filling : CHAR
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
regions : aregion
|
||||
| aregion regions
|
||||
;
|
||||
|
||||
aregion : map_definition reg_init map_details
|
||||
;
|
||||
|
||||
map_definition : NOMAP_ID
|
||||
| map_geometry MAP_ID
|
||||
;
|
||||
|
||||
map_geometry : GEOMETRY_ID ':' h_justif ',' v_justif
|
||||
;
|
||||
|
||||
h_justif : LEFT_OR_RIGHT
|
||||
| CENTER
|
||||
;
|
||||
|
||||
v_justif : TOP_OR_BOT
|
||||
| CENTER
|
||||
;
|
||||
|
||||
reg_init : /* nothing */
|
||||
| reg_init init_reg
|
||||
;
|
||||
|
||||
init_reg : RANDOM_OBJECTS_ID ':' object_list
|
||||
| RANDOM_PLACES_ID ':' place_list
|
||||
|
||||
|
||||
|
||||
May Last change: 16 4
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
| RANDOM_MONSTERS_ID ':' monster_list
|
||||
;
|
||||
|
||||
object_list : object
|
||||
| object ',' object_list
|
||||
;
|
||||
|
||||
monster_list : monster
|
||||
| monster ',' monster_list
|
||||
;
|
||||
|
||||
place_list : place
|
||||
| place ',' place_list
|
||||
;
|
||||
|
||||
map_details : /* nothing */
|
||||
| map_details map_detail
|
||||
;
|
||||
|
||||
map_detail : monster_detail
|
||||
| object_detail
|
||||
| door_detail
|
||||
| trap_detail
|
||||
| drawbridge_detail
|
||||
| region_detail
|
||||
| stair_region
|
||||
| portal_region
|
||||
| teleprt_region
|
||||
| branch_region
|
||||
| altar_detail
|
||||
| fountain_detail
|
||||
| mazewalk_detail
|
||||
| wallify_detail
|
||||
| ladder_detail
|
||||
| stair_detail
|
||||
| gold_detail
|
||||
| engraving_detail
|
||||
| diggable_detail
|
||||
| passwall_detail
|
||||
;
|
||||
|
||||
monster_detail : MONSTER_ID chance ':' monster_c ',' m_name ',' coordinate
|
||||
monster_infos
|
||||
;
|
||||
|
||||
monster_infos : /* nothing */
|
||||
| monster_infos monster_info
|
||||
;
|
||||
|
||||
monster_info : ',' string
|
||||
| ',' MON_ATTITUDE
|
||||
| ',' MON_ALERTNESS
|
||||
|
||||
|
||||
|
||||
May Last change: 16 5
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
| ',' alignment
|
||||
| ',' MON_APPEARANCE string
|
||||
;
|
||||
|
||||
object_detail : OBJECT_ID object_desc
|
||||
| COBJECT_ID object_desc
|
||||
;
|
||||
|
||||
object_desc : chance ':' object_c ',' o_name ',' object_where object_infos
|
||||
;
|
||||
|
||||
object_where : coordinate
|
||||
| CONTAINED
|
||||
;
|
||||
|
||||
object_infos : /* nothing */
|
||||
| ',' curse_state ',' monster_id ',' enchantment optional_name
|
||||
| ',' curse_state ',' enchantment optional_name
|
||||
| ',' monster_id ',' enchantment optional_name
|
||||
;
|
||||
|
||||
curse_state : RANDOM_TYPE
|
||||
| CURSE_TYPE
|
||||
;
|
||||
|
||||
monster_id : STRING
|
||||
;
|
||||
|
||||
enchantment : RANDOM_TYPE
|
||||
| INTEGER
|
||||
;
|
||||
|
||||
optional_name : /* nothing */
|
||||
| ',' NONE
|
||||
| ',' STRING
|
||||
;
|
||||
|
||||
door_detail : DOOR_ID ':' door_state ',' coordinate
|
||||
;
|
||||
|
||||
trap_detail : TRAP_ID chance ':' trap_name ',' coordinate
|
||||
;
|
||||
|
||||
drawbridge_detail: DRAWBRIDGE_ID ':' coordinate ',' DIRECTION ',' door_state
|
||||
;
|
||||
|
||||
mazewalk_detail : MAZEWALK_ID ':' coordinate ',' DIRECTION
|
||||
;
|
||||
|
||||
wallify_detail : WALLIFY_ID
|
||||
;
|
||||
|
||||
|
||||
|
||||
|
||||
May Last change: 16 6
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
ladder_detail : LADDER_ID ':' coordinate ',' UP_OR_DOWN
|
||||
;
|
||||
|
||||
stair_detail : STAIR_ID ':' coordinate ',' UP_OR_DOWN
|
||||
;
|
||||
|
||||
stair_region : STAIR_ID ':' lev_region ',' lev_region ',' UP_OR_DOWN
|
||||
;
|
||||
|
||||
portal_region : PORTAL_ID ':' lev_region ',' lev_region ',' string
|
||||
;
|
||||
|
||||
teleprt_region : TELEPRT_ID ':' lev_region ',' lev_region teleprt_detail
|
||||
;
|
||||
|
||||
branch_region : BRANCH_ID ':' lev_region ',' lev_region
|
||||
;
|
||||
|
||||
teleprt_detail : /* empty */
|
||||
| ',' UP_OR_DOWN
|
||||
;
|
||||
|
||||
lev_region : region
|
||||
| LEV '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'
|
||||
;
|
||||
|
||||
fountain_detail : FOUNTAIN_ID ':' coordinate
|
||||
;
|
||||
|
||||
sink_detail : SINK_ID ':' coordinate
|
||||
;
|
||||
|
||||
pool_detail : POOL_ID ':' coordinate
|
||||
;
|
||||
|
||||
diggable_detail : NON_DIGGABLE_ID ':' region
|
||||
;
|
||||
|
||||
passwall_detail : NON_PASSWALL_ID ':' region
|
||||
;
|
||||
|
||||
region_detail : REGION_ID ':' region ',' light_state ',' room_type prefilled
|
||||
;
|
||||
|
||||
altar_detail : ALTAR_ID ':' coordinate ',' alignment ',' altar_type
|
||||
;
|
||||
|
||||
gold_detail : GOLD_ID ':' amount ',' coordinate
|
||||
;
|
||||
|
||||
engraving_detail: ENGRAVING_ID ':' coordinate ',' engraving_type ',' string
|
||||
;
|
||||
|
||||
|
||||
|
||||
May Last change: 16 7
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
monster_c : monster
|
||||
| RANDOM_TYPE
|
||||
| m_register
|
||||
;
|
||||
|
||||
object_c : object
|
||||
| RANDOM_TYPE
|
||||
| o_register
|
||||
;
|
||||
|
||||
m_name : string
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
o_name : string
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
trap_name : string
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
room_type : string
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
prefilled : /* empty */
|
||||
| ',' FILLING
|
||||
| ',' FILLING ',' BOOLEAN
|
||||
;
|
||||
|
||||
coordinate : coord
|
||||
| p_register
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
door_state : DOOR_STATE
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
light_state : LIGHT_STATE
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
alignment : ALIGNMENT
|
||||
| a_register
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
altar_type : ALTAR_TYPE
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
|
||||
|
||||
May Last change: 16 8
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
p_register : P_REGISTER '[' INTEGER ']'
|
||||
;
|
||||
|
||||
o_register : O_REGISTER '[' INTEGER ']'
|
||||
;
|
||||
|
||||
m_register : M_REGISTER '[' INTEGER ']'
|
||||
;
|
||||
|
||||
a_register : A_REGISTER '[' INTEGER ']'
|
||||
;
|
||||
|
||||
place : coord
|
||||
;
|
||||
|
||||
monster : CHAR
|
||||
;
|
||||
|
||||
object : CHAR
|
||||
;
|
||||
|
||||
string : STRING
|
||||
;
|
||||
|
||||
amount : INTEGER
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
chance : /* empty */
|
||||
| PERCENT
|
||||
;
|
||||
|
||||
engraving_type : ENGRAVING_TYPE
|
||||
| RANDOM_TYPE
|
||||
;
|
||||
|
||||
coord : '(' INTEGER ',' INTEGER ')'
|
||||
;
|
||||
|
||||
region : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'
|
||||
;
|
||||
|
||||
NOTE:
|
||||
Lines beginning with '#' are considered comments.
|
||||
|
||||
The contents of a "MAP" description of a maze is a rectangle
|
||||
showing the exact level map that should be used for the
|
||||
given part of a maze. Each character in the map corresponds
|
||||
to a location on the screen. Different location types are
|
||||
denoted using different ASCII characters. The following
|
||||
characters are recognized. To give an idea of how these are
|
||||
used, see the EXAMPLE, below. The maximum size of a map is
|
||||
|
||||
|
||||
|
||||
May Last change: 16 9
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
normally 76 columns by 21 rows.
|
||||
|
||||
'-' horizontal wall
|
||||
'|' vertical wall
|
||||
'+' a doorway (state is specified in a DOOR declaration)
|
||||
'A' open air
|
||||
'B' boundary room location (for bounding unwalled irregular regions)
|
||||
'C' cloudy air
|
||||
'I' ice
|
||||
'S' a secret door
|
||||
'H' a secret corridor
|
||||
'{' a fountain
|
||||
'\' a throne
|
||||
'K' a sink (if SINKS is defined, else a room location)
|
||||
'}' a part of a moat or other deep water
|
||||
'P' a pool
|
||||
'L' lava
|
||||
'W' water (yes, different from a pool)
|
||||
'T' a tree
|
||||
'F' iron bars
|
||||
'#' a corridor
|
||||
'.' a normal room location (unlit unless lit in a REGION declaration)
|
||||
' ' stone
|
||||
|
||||
EXAMPLE
|
||||
Here is an example of a description file (a very simple
|
||||
one):
|
||||
|
||||
MAZE : "fortress", random
|
||||
GEOMETRY : center , center
|
||||
MAP
|
||||
}}}}}}}}}
|
||||
}}}|-|}}}
|
||||
}}|-.-|}}
|
||||
}|-...-|}
|
||||
}|.....|}
|
||||
}|-...-|}
|
||||
}}|-.-|}}
|
||||
}}}|-|}}}
|
||||
}}}}}}}}}
|
||||
ENDMAP
|
||||
MONSTER: '@', "Wizard of Yendor", (4,4)
|
||||
OBJECT: '"', "Amulet of Yendor", (4,4)
|
||||
# a hell hound flanking the Wiz on a random side
|
||||
RANDOM_PLACES: (4,3), (4,5), (3,4), (5,4)
|
||||
MONSTER: 'd', "hell hound", place[0]
|
||||
# a chest on another random side
|
||||
OBJECT: '(', "chest", place[1]
|
||||
# a sack on a random side, with a diamond and maybe a ruby in it
|
||||
CONTAINER: '(', "sack", place[2]
|
||||
OBJECT: '*', "diamond", contained
|
||||
OBJECT[50%]: '*', "ruby", contained
|
||||
|
||||
|
||||
|
||||
May Last change: 16 10
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LEV_COMP(6) 1996 LEV_COMP(6)
|
||||
|
||||
|
||||
|
||||
# a random dragon somewhere
|
||||
MONSTER: 'D', random, random
|
||||
# 3 out of 4 chance for a random trap in the EAST end
|
||||
TRAP[75%]: random, (6,4)
|
||||
# an electric eel below the SOUTH end
|
||||
MONSTER: ';', "electric eel", (4,8)
|
||||
# make the walls non-diggable
|
||||
NON_DIGGABLE: (0,0,8,8)
|
||||
TELEPORT_REGION: levregion(0,0,79,20), (0,0,8,8)
|
||||
|
||||
This example will produce a file named "fortress" that can
|
||||
be integrated into one of the numerous mazes of the game.
|
||||
|
||||
Note especially the final, TELEPORT_REGION specification.
|
||||
This says that level teleports or other non-stairway
|
||||
arrivals on this level can land anywhere on the level except
|
||||
the area of the map. This shows the use of the ``levre-
|
||||
gion'' prefix allowed in certain region specifications.
|
||||
Normally, regions apply only to the most recent MAP specifi-
|
||||
cation, but when prefixed with ``levregion'', one can refer
|
||||
to any area of the level, regardless of the placement of the
|
||||
current MAP in the level.
|
||||
|
||||
AUTHOR
|
||||
Jean-Christophe Collet, David Cohrs.
|
||||
|
||||
SEE ALSO
|
||||
dgn_comp(6), nethack(6)
|
||||
|
||||
BUGS
|
||||
Probably infinite. Most importantly, still needs additional
|
||||
bounds checking.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
May Last change: 16 11
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user