From 42dba9b07452dc9af1847cb0fc492ea31c39fb35 Mon Sep 17 00:00:00 2001 From: jwalz Date: Sat, 5 Jan 2002 21:05:47 +0000 Subject: [PATCH] *** empty log message *** --- doc/lev_comp.txt | 726 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 726 insertions(+) create mode 100644 doc/lev_comp.txt diff --git a/doc/lev_comp.txt b/doc/lev_comp.txt new file mode 100644 index 000000000..4a28fcea6 --- /dev/null +++ b/doc/lev_comp.txt @@ -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 + + +