OSDN Git Service

Initial Import
[nethackexpress/trunk.git] / sys / share / lev_yacc.c
1 #ifndef lint
2 static char yysccsid[] = "@(#)yaccpar   1.9 (Berkeley) 02/21/93";
3 #endif
4 #define YYBYACC 1
5 #define YYMAJOR 1
6 #define YYMINOR 9
7 #define yyclearin (yychar=(-1))
8 #define yyerrok (yyerrflag=0)
9 #define YYRECOVERING (yyerrflag!=0)
10 #define YYPREFIX "yy"
11 /*      SCCS Id: @(#)lev_yacc.c 3.4     2000/01/17      */
12 /*      Copyright (c) 1989 by Jean-Christophe Collet */
13 /* NetHack may be freely redistributed.  See license for details. */
14
15 /*
16  * This file contains the Level Compiler code
17  * It may handle special mazes & special room-levels
18  */
19
20 /* In case we're using bison in AIX.  This definition must be
21  * placed before any other C-language construct in the file
22  * excluding comments and preprocessor directives (thanks IBM
23  * for this wonderful feature...).
24  *
25  * Note: some cpps barf on this 'undefined control' (#pragma).
26  * Addition of the leading space seems to prevent barfage for now,
27  * and AIX will still see the directive.
28  */
29 #ifdef _AIX
30  #pragma alloca         /* keep leading space! */
31 #endif
32
33 #include "hack.h"
34 #include "sp_lev.h"
35
36 #define MAX_REGISTERS   10
37 #define ERR             (-1)
38 /* many types of things are put in chars for transference to NetHack.
39  * since some systems will use signed chars, limit everybody to the
40  * same number for portability.
41  */
42 #define MAX_OF_TYPE     128
43
44 #define New(type)               \
45         (type *) memset((genericptr_t)alloc(sizeof(type)), 0, sizeof(type))
46 #define NewTab(type, size)      (type **) alloc(sizeof(type *) * size)
47 #define Free(ptr)               free((genericptr_t)ptr)
48
49 extern void FDECL(yyerror, (const char *));
50 extern void FDECL(yywarning, (const char *));
51 extern int NDECL(yylex);
52 int NDECL(yyparse);
53
54 extern int FDECL(get_floor_type, (CHAR_P));
55 extern int FDECL(get_room_type, (char *));
56 extern int FDECL(get_trap_type, (char *));
57 extern int FDECL(get_monster_id, (char *,CHAR_P));
58 extern int FDECL(get_object_id, (char *,CHAR_P));
59 extern boolean FDECL(check_monster_char, (CHAR_P));
60 extern boolean FDECL(check_object_char, (CHAR_P));
61 extern char FDECL(what_map_char, (CHAR_P));
62 extern void FDECL(scan_map, (char *));
63 extern void NDECL(wallify_map);
64 extern boolean NDECL(check_subrooms);
65 extern void FDECL(check_coord, (int,int,const char *));
66 extern void NDECL(store_part);
67 extern void NDECL(store_room);
68 extern boolean FDECL(write_level_file, (char *,splev *,specialmaze *));
69 extern void FDECL(free_rooms, (splev *));
70
71 static struct reg {
72         int x1, y1;
73         int x2, y2;
74 }               current_region;
75
76 static struct coord {
77         int x;
78         int y;
79 }               current_coord, current_align;
80
81 static struct size {
82         int height;
83         int width;
84 }               current_size;
85
86 char tmpmessage[256];
87 digpos *tmppass[32];
88 char *tmpmap[ROWNO];
89
90 digpos *tmpdig[MAX_OF_TYPE];
91 region *tmpreg[MAX_OF_TYPE];
92 lev_region *tmplreg[MAX_OF_TYPE];
93 door *tmpdoor[MAX_OF_TYPE];
94 drawbridge *tmpdb[MAX_OF_TYPE];
95 walk *tmpwalk[MAX_OF_TYPE];
96
97 room_door *tmprdoor[MAX_OF_TYPE];
98 trap *tmptrap[MAX_OF_TYPE];
99 monster *tmpmonst[MAX_OF_TYPE];
100 object *tmpobj[MAX_OF_TYPE];
101 altar *tmpaltar[MAX_OF_TYPE];
102 lad *tmplad[MAX_OF_TYPE];
103 stair *tmpstair[MAX_OF_TYPE];
104 gold *tmpgold[MAX_OF_TYPE];
105 engraving *tmpengraving[MAX_OF_TYPE];
106 fountain *tmpfountain[MAX_OF_TYPE];
107 sink *tmpsink[MAX_OF_TYPE];
108 pool *tmppool[MAX_OF_TYPE];
109
110 mazepart *tmppart[10];
111 room *tmproom[MAXNROFROOMS*2];
112 corridor *tmpcor[MAX_OF_TYPE];
113
114 static specialmaze maze;
115 static splev special_lev;
116 static lev_init init_lev;
117
118 static char olist[MAX_REGISTERS], mlist[MAX_REGISTERS];
119 static struct coord plist[MAX_REGISTERS];
120
121 int n_olist = 0, n_mlist = 0, n_plist = 0;
122
123 unsigned int nlreg = 0, nreg = 0, ndoor = 0, ntrap = 0, nmons = 0, nobj = 0;
124 unsigned int ndb = 0, nwalk = 0, npart = 0, ndig = 0, nlad = 0, nstair = 0;
125 unsigned int naltar = 0, ncorridor = 0, nrooms = 0, ngold = 0, nengraving = 0;
126 unsigned int nfountain = 0, npool = 0, nsink = 0, npass = 0;
127
128 static int lev_flags = 0;
129
130 unsigned int max_x_map, max_y_map;
131
132 static xchar in_room;
133
134 extern int fatal_error;
135 extern int want_warnings;
136 extern const char *fname;
137
138 typedef union
139 {
140         int     i;
141         char*   map;
142         struct {
143                 xchar room;
144                 xchar wall;
145                 xchar door;
146         } corpos;
147 } YYSTYPE;
148 #define CHAR 257
149 #define INTEGER 258
150 #define BOOLEAN 259
151 #define PERCENT 260
152 #define MESSAGE_ID 261
153 #define MAZE_ID 262
154 #define LEVEL_ID 263
155 #define LEV_INIT_ID 264
156 #define GEOMETRY_ID 265
157 #define NOMAP_ID 266
158 #define OBJECT_ID 267
159 #define COBJECT_ID 268
160 #define MONSTER_ID 269
161 #define TRAP_ID 270
162 #define DOOR_ID 271
163 #define DRAWBRIDGE_ID 272
164 #define MAZEWALK_ID 273
165 #define WALLIFY_ID 274
166 #define REGION_ID 275
167 #define FILLING 276
168 #define RANDOM_OBJECTS_ID 277
169 #define RANDOM_MONSTERS_ID 278
170 #define RANDOM_PLACES_ID 279
171 #define ALTAR_ID 280
172 #define LADDER_ID 281
173 #define STAIR_ID 282
174 #define NON_DIGGABLE_ID 283
175 #define NON_PASSWALL_ID 284
176 #define ROOM_ID 285
177 #define PORTAL_ID 286
178 #define TELEPRT_ID 287
179 #define BRANCH_ID 288
180 #define LEV 289
181 #define CHANCE_ID 290
182 #define CORRIDOR_ID 291
183 #define GOLD_ID 292
184 #define ENGRAVING_ID 293
185 #define FOUNTAIN_ID 294
186 #define POOL_ID 295
187 #define SINK_ID 296
188 #define NONE 297
189 #define RAND_CORRIDOR_ID 298
190 #define DOOR_STATE 299
191 #define LIGHT_STATE 300
192 #define CURSE_TYPE 301
193 #define ENGRAVING_TYPE 302
194 #define DIRECTION 303
195 #define RANDOM_TYPE 304
196 #define O_REGISTER 305
197 #define M_REGISTER 306
198 #define P_REGISTER 307
199 #define A_REGISTER 308
200 #define ALIGNMENT 309
201 #define LEFT_OR_RIGHT 310
202 #define CENTER 311
203 #define TOP_OR_BOT 312
204 #define ALTAR_TYPE 313
205 #define UP_OR_DOWN 314
206 #define SUBROOM_ID 315
207 #define NAME_ID 316
208 #define FLAGS_ID 317
209 #define FLAG_TYPE 318
210 #define MON_ATTITUDE 319
211 #define MON_ALERTNESS 320
212 #define MON_APPEARANCE 321
213 #define CONTAINED 322
214 #define STRING 323
215 #define MAP_ID 324
216 #define YYERRCODE 256
217 short yylhs[] = {                                        -1,
218     0,    0,   36,   36,   37,   37,   38,   39,   32,   23,
219    23,   14,   14,   19,   19,   20,   20,   40,   40,   45,
220    42,   42,   46,   46,   43,   43,   49,   49,   44,   44,
221    51,   52,   52,   53,   53,   35,   50,   50,   56,   54,
222    10,   10,   59,   59,   57,   57,   60,   60,   58,   58,
223    55,   55,   61,   61,   61,   61,   61,   61,   61,   61,
224    61,   61,   61,   61,   61,   62,   63,   64,   15,   15,
225    13,   13,   12,   12,   31,   11,   11,   41,   41,   75,
226    76,   76,   79,    1,    1,    2,    2,   77,   77,   80,
227    80,   80,   47,   47,   48,   48,   81,   83,   81,   78,
228    78,   84,   84,   84,   84,   84,   84,   84,   84,   84,
229    84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
230    84,   99,   65,   98,   98,  100,  100,  100,  100,  100,
231    66,   66,  102,  101,  103,  103,  104,  104,  104,  104,
232   105,  105,  106,  107,  107,  108,  108,  108,   85,   67,
233    86,   92,   93,   94,   74,  109,   88,  110,   89,  111,
234   113,   90,  114,   91,  112,  112,   22,   22,   69,   70,
235    71,   95,   96,   87,   68,   72,   73,   25,   25,   25,
236    28,   28,   28,   33,   33,   34,   34,    3,    3,    4,
237     4,   21,   21,   21,   97,   97,   97,    5,    5,    6,
238     6,    7,    7,    7,    8,    8,  117,   29,   26,    9,
239    82,   24,   27,   30,   16,   16,   17,   17,   18,   18,
240   116,  115,
241 };
242 short yylen[] = {                                         2,
243     0,    1,    1,    2,    1,    1,    5,    7,    3,    0,
244    13,    1,    1,    0,    3,    3,    1,    0,    2,    3,
245     0,    2,    3,    3,    0,    1,    1,    2,    1,    1,
246     1,    0,    2,    5,    5,    7,    2,    2,   12,   12,
247     0,    2,    5,    1,    5,    1,    5,    1,    5,    1,
248     0,    2,    1,    1,    1,    1,    1,    1,    1,    1,
249     1,    1,    1,    1,    1,    3,    3,    9,    1,    1,
250     1,    1,    1,    1,    5,    1,    1,    1,    2,    3,
251     1,    2,    5,    1,    1,    1,    1,    0,    2,    3,
252     3,    3,    1,    3,    1,    3,    1,    0,    4,    0,
253     2,    1,    1,    1,    1,    1,    1,    1,    1,    1,
254     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
255     1,    0,   10,    0,    2,    2,    2,    2,    2,    3,
256     2,    2,    0,    9,    1,    1,    0,    7,    5,    5,
257     1,    1,    1,    1,    1,    0,    2,    2,    5,    6,
258     7,    5,    1,    5,    5,    0,    8,    0,    8,    0,
259     0,    8,    0,    6,    0,    2,    1,   10,    3,    3,
260     3,    3,    3,    8,    7,    5,    7,    1,    1,    1,
261     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
262     1,    0,    2,    4,    1,    1,    1,    1,    1,    1,
263     1,    1,    1,    1,    1,    1,    4,    4,    4,    4,
264     1,    1,    1,    1,    1,    1,    0,    1,    1,    1,
265     5,    9,
266 };
267 short yydefred[] = {                                      0,
268     0,    0,    0,    0,    0,    2,    0,    5,    6,    0,
269     0,    0,    0,    0,    4,  214,    0,    9,    0,    0,
270     0,    0,    0,    0,   15,    0,    0,    0,    0,   21,
271    76,   77,   75,    0,    0,    0,    0,   81,    7,    0,
272    88,    0,   19,    0,   16,    0,   20,    0,   79,    0,
273    82,    0,    0,    0,    0,    0,   22,   26,    0,   51,
274    51,    0,   84,   85,    0,    0,    0,    0,    0,   89,
275     0,    0,    0,    0,   31,    8,   29,    0,   28,    0,
276     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
277     0,    0,    0,  153,    0,    0,    0,    0,    0,    0,
278     0,    0,    0,    0,    0,    0,  102,  103,  105,  112,
279   113,  118,  119,  117,  101,  104,  106,  107,  108,  109,
280   110,  111,  114,  115,  116,  120,  121,  213,    0,   23,
281   212,    0,   24,  191,    0,  190,    0,    0,   33,    0,
282     0,    0,    0,    0,    0,   52,   53,   54,   55,   56,
283    57,   58,   59,   60,   61,   62,   63,   64,   65,    0,
284    87,   86,   83,   90,   92,    0,   91,    0,  211,  218,
285     0,  131,  132,    0,    0,    0,    0,    0,    0,    0,
286     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
287     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
288     0,    0,    0,    0,    0,    0,    0,  198,  199,    0,
289   197,    0,    0,  195,  196,    0,    0,    0,    0,    0,
290     0,    0,  156,    0,  167,  172,  173,  158,  160,  163,
291   215,  216,    0,    0,  169,   94,   96,  200,  201,    0,
292     0,    0,    0,   69,   70,    0,   67,  171,  170,   66,
293     0,    0,    0,  182,    0,  181,    0,  183,  179,    0,
294   178,    0,  180,  189,    0,  188,    0,    0,    0,    0,
295     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
296     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
297    99,    0,    0,    0,    0,    0,  149,    0,    0,  152,
298     0,    0,  204,    0,  202,    0,  203,  154,    0,    0,
299     0,  155,    0,    0,    0,  176,  219,  220,    0,   44,
300     0,    0,   46,    0,    0,    0,   35,   34,    0,    0,
301   221,    0,  187,  186,  133,    0,  185,  184,    0,  150,
302   207,    0,    0,    0,    0,    0,    0,    0,    0,    0,
303   161,  164,    0,    0,    0,    0,    0,    0,    0,    0,
304   208,    0,  209,    0,  151,    0,    0,    0,  206,  205,
305   175,    0,    0,    0,    0,  177,    0,   48,    0,    0,
306     0,   50,    0,    0,    0,   71,   72,    0,   12,   13,
307    11,    0,  122,    0,    0,  174,  210,    0,  157,  159,
308     0,  162,    0,    0,    0,    0,    0,    0,   73,   74,
309     0,    0,  136,  135,    0,  124,    0,    0,    0,  166,
310    43,    0,    0,   45,    0,    0,   36,   68,    0,  134,
311     0,    0,    0,    0,    0,    0,   40,    0,   39,  142,
312   141,  143,    0,    0,    0,  125,  222,  194,    0,   47,
313    42,   49,    0,    0,  127,  128,    0,  129,  126,  168,
314   145,  144,    0,    0,    0,  130,    0,    0,  139,  140,
315     0,  147,  148,  138,
316 };
317 short yydgoto[] = {                                       3,
318    65,  163,  265,  135,  210,  240,  306,  371,  307,  437,
319    33,  411,  388,  391,  246,  233,  171,  319,   13,   25,
320   396,  223,   21,  132,  262,  263,  129,  257,  258,  136,
321     4,    5,  339,  335,  243,    6,    7,    8,    9,   28,
322    39,   44,   56,   76,   29,   57,  130,  133,   58,   59,
323    77,   78,  139,   60,   80,   61,  325,  384,  322,  380,
324   146,  147,  148,  149,  150,  151,  152,  153,  154,  155,
325   156,  157,  158,  159,   40,   41,   50,   69,   42,   70,
326   167,  168,  204,  115,  116,  117,  118,  119,  120,  121,
327   122,  123,  124,  125,  126,  127,  224,  431,  416,  446,
328   172,  362,  415,  430,  443,  444,  464,  469,  277,  279,
329   280,  402,  375,  281,  225,  214,  215,
330 };
331 short yysindex[] = {                                   -166,
332   -18,    4,    0, -233, -233,    0, -166,    0,    0, -222,
333  -222,   32, -134, -134,    0,    0,   88,    0, -173,   76,
334  -114, -114, -230,  105,    0,  -99,  115, -124, -114,    0,
335     0,    0,    0, -173,  127, -143,  128,    0,    0, -124,
336     0, -132,    0, -236,    0,  -67,    0, -155,    0, -156,
337     0,  137,  138,  140,  142,  -94,    0,    0, -263,    0,
338     0,  161,    0,    0,  162,  149,  150,  151, -105,    0,
339   -47,  -46, -276, -276,    0,    0,    0,  -79,    0, -142,
340  -142,  -45, -151,  -47,  -46,  173,  -44,  -44,  -44,  -44,
341   160,  163,  165,    0,  166,  167,  168,  170,  171,  172,
342   174,  175,  176,  177,  178,  179,    0,    0,    0,    0,
343     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
344     0,    0,    0,    0,    0,    0,    0,    0,  187,    0,
345     0,  194,    0,    0,  195,    0,  197,  184,    0,  185,
346   186,  188,  189,  190,  191,    0,    0,    0,    0,    0,
347     0,    0,    0,    0,    0,    0,    0,    0,    0,  206,
348     0,    0,    0,    0,    0,  -43,    0,    0,    0,    0,
349   193,    0,    0,  196,  198, -239,   45,   45,  180,   45,
350    45,   58,  180,  180,  -37,  -37,  -37, -232,   45,   45,
351   -47,  -46, -218, -218,  205, -238,   45,  -41,   45,   45,
352  -222,   -6,  211,  213, -234, -237, -268,    0,    0,  214,
353     0,  169,  215,    0,    0,  217,  -39,  218,  219,  220,
354   225,   12,    0,  296,    0,    0,    0,    0,    0,    0,
355     0,    0,  300,  306,    0,    0,    0,    0,    0,  317,
356   319,  112,  329,    0,    0,  341,    0,    0,    0,    0,
357   342,  129,  173,    0,  315,    0,  366,    0,    0,  320,
358     0,  368,    0,    0,  374,    0,   45,  200,  120,  124,
359   385, -218, -201,  116,  202,  389,  390,  118,  399,  401,
360   405,   45, -254,  -38,   -9,  407,  -36, -239, -218,  411,
361     0,  207, -267,  238, -260,   45,    0,  360,  410,    0,
362   239,  412,    0,  386,    0,  415,    0,    0,  454,  242,
363   -37,    0,  -37,  -37,  -37,    0,    0,    0,  457,    0,
364   246,  492,    0,  279,  495,  237,    0,    0,  497,  498,
365     0,  456,    0,    0,    0,  458,    0,    0,  506,    0,
366     0, -239,  509, -276,  298, -259,  299,   72,  510,  517,
367     0,    0, -222,  518,   -1,  519,   28,  520, -119, -227,
368     0,  522,    0,   45,    0,  316,  531,  483,    0,    0,
369     0,  533,  264, -222,  537,    0,  321,    0, -155,  539,
370   328,    0,  330,  543, -229,    0,    0,  545,    0,    0,
371     0,   38,    0,  546,  318,    0,    0,  333,    0,    0,
372   281,    0,  552,  555,   28,  559,  557, -222,    0,    0,
373   561, -229,    0,    0,  560,    0,  338,  563,  566,    0,
374     0, -151,  571,    0,  345,  571,    0,    0, -243,    0,
375   575,  579,  362,  367,  585,  371,    0,  586,    0,    0,
376     0,    0,  590,  591, -209,    0,    0,    0,  597,    0,
377     0,    0, -240, -228,    0,    0, -222,    0,    0,    0,
378     0,    0,  595,  599,  599,    0, -228, -264,    0,    0,
379   599,    0,    0,    0,
380 };
381 short yyrindex[] = {                                    641,
382     0,    0,    0, -172,  307,    0,  645,    0,    0,    0,
383     0,    0, -146,  355,    0,    0,    0,    0,    0,    0,
384   -72,  351,    0,  282,    0,    0,    0,    0,  346,    0,
385     0,    0,    0,    0,    0,    0,    0,    0,    0,  104,
386     0,    0,    0,  157,    0,    0,    0,    0,    0,  491,
387     0,    0,    0,    0,    0,   57,    0,    0,  159,    0,
388     0,    0,    0,    0,    0,    0,    0,    0,   91,    0,
389     0,    0,    0,    0,    0,    0,    0,  106,    0,  267,
390   388,    0,    0,    0,    0,    0,  589,  589,  589,  589,
391     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
392     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
393     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
394     0,    0,    0,    0,    0,    0,    0,    0,  201,    0,
395     0,  240,    0,    0,    0,    0,    0,    0,    0,    0,
396     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
397     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
398     0,    0,    0,    0,    0,    0,    0,  446,    0,    0,
399     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
400     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
401     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
402     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
403     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
404     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
405     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
406     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
407     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
408     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
409     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
410     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
411     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
412     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
413     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
414     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
415     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
416     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
417     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
418     0,    0,    0,    0,    0,    0,  535,    0,    0,    0,
419     0,    0,    0,    0,  572,    0,    0,    0,    0,    0,
420     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
421     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
422     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
423     0,    0,    0,    0,    6,    0,    0,  606,    0,    0,
424     0,    0,  146,    0,    0,  146,    0,    0,    0,    0,
425    43,    0,    0,    0,    0,    0,    0,    0,    0,    0,
426     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
427     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
428     0,    0,    0,  109,  109,    0,    0,    0,    0,    0,
429   109,    0,    0,    0,
430 };
431 short yygindex[] = {                                      0,
432   269,  230,    0,  -60, -269, -184,  209,    0,    0,  229,
433     0,  244,    0,    0,    0,    0,  113,    0,  652,  624,
434     0, -178,  646,  453,    0,    0,  459,    0,    0,  -10,
435     0,    0,    0,    0,  375,  656,    0,    0,    0,   24,
436   625,    0,    0,    0,    0,    0,  -73,  -68,  608,    0,
437     0,    0,    0,    0,  607,    0,    0,  266,    0,    0,
438     0,    0,    0,    0,  600,  603,  605,  609,  611,    0,
439     0,  612,  613,  614,    0,    0,    0,    0,    0,    0,
440   422,    0,    0,    0,    0,    0,    0,    0,    0,    0,
441     0,    0,    0,    0,    0,    0, -165,    0,    0,    0,
442   588,    0,    0,    0,    0,  224, -416, -384,    0,    0,
443     0,    0,    0,    0,  -40,  -81,    0,
444 };
445 #define YYTABLESIZE 900
446 short yytable[] = {                                      17,
447    18,  321,  217,  242,  169,  137,  228,  229,  230,  241,
448   164,  213,  216,  137,  219,  220,  165,  461,  329,  131,
449   244,   54,  128,  234,  235,  231,   31,  134,  409,  461,
450   324,  389,  472,  248,  249,  264,  333,  465,  379,   10,
451    52,   53,  123,  337,  369,   30,   16,  317,   54,  318,
452   471,   55,   43,  370,   16,   16,   32,  440,  473,  208,
453   441,   11,   16,  462,  209,  245,  259,  383,  260,  254,
454   255,  232,  365,   32,  410,  462,  390,  166,   55,  442,
455   470,  238,  442,   12,  166,  239,  474,  302,   14,   19,
456    80,   14,   14,   14,  303,    1,    2,  222,  304,  305,
457    16,  297,  303,   78,  330,   30,  304,  305,  146,  455,
458   456,  457,  331,   16,   10,  366,  316,  236,   10,   10,
459    66,   67,   68,  237,   87,   88,   89,   90,  140,   20,
460   340,   23,  349,   26,  350,  351,  352,   96,  218,  141,
461    37,   38,  226,  227,   24,   41,   27,  142,   34,  104,
462   105,  106,  143,  144,   63,   64,   25,   35,   27,  161,
463   162,   87,   88,   89,   90,   91,   92,   93,   94,   95,
464    46,  169,   36,  145,   96,   97,   98,   99,  100,   47,
465   101,  102,  103,  386,  387,   48,  104,  105,  106,   62,
466   250,   51,   18,   18,   71,   72,  266,   73,  393,   74,
467    93,  174,  175,   75,   82,   83,   84,   85,   86,  128,
468   131,  138,  166,  160,  203,  170,  247,  176,  271,  217,
469   177,  327,  178,  179,  180,  181,  414,  182,  183,  184,
470   191,  185,  186,  187,  188,  189,  190,  192,  193,   95,
471   194,  195,  196,  197,  242,  198,  199,  200,  201,  202,
472   205,  221,  251,  206,  252,  207,  253,  267,  269,  268,
473   270,  272,  273,  274,  275,  320,   37,  137,  137,  276,
474   137,  137,  137,  137,  137,  137,  137,  137,  137,  137,
475   137,   17,  334,  367,  338,  137,  137,  137,  137,  137,
476   137,  137,  137,  137,  323,  137,  137,  137,  137,  137,
477   137,  137,  378,  137,  123,  123,   14,  123,  123,  123,
478   123,  123,  123,  123,  123,  123,  123,  123,   32,   32,
479   137,  137,  123,  123,  123,  123,  123,  123,  123,  123,
480   123,  382,  123,  123,  123,  123,  123,  123,  123,  278,
481   123,  211,  376,  282,  212,   18,  221,   32,  211,  283,
482    18,  212,   80,   80,   10,   80,   80,  123,  123,  413,
483   284,  211,  285,  400,  212,   78,   78,   30,   30,  286,
484   146,  146,  287,  146,  146,  146,  146,  146,  146,  146,
485   146,  146,  146,  146,  288,  289,  290,   38,  146,  146,
486   146,  146,  146,  146,  146,  146,  146,  426,  146,  146,
487   146,  146,  146,  146,  146,  292,  146,   41,   41,  293,
488   294,  295,   41,   41,   41,   41,   41,  296,   25,   25,
489    27,   27,  299,  146,  146,   41,  300,   41,  301,  308,
490    41,  312,  310,  311,  459,   41,   41,   41,   41,   41,
491    41,   41,  313,   41,  314,   97,  466,   25,  315,   27,
492   326,  331,  341,  342,   25,  344,   27,  298,  346,  309,
493    41,   41,   93,   93,  332,   93,   93,   93,   93,   93,
494    93,   93,   93,   93,   93,   93,  345,   93,   93,   93,
495    93,   93,   93,   93,   93,   93,   93,   93,   93,   98,
496   100,   93,   93,   93,   93,  336,  343,  347,   93,  348,
497   353,   95,   95,  354,   95,   95,   95,   95,   95,   95,
498    95,   95,   95,   95,   95,   93,   95,   95,   95,   95,
499    95,   95,   95,   95,   95,   95,   95,   95,   37,   37,
500    95,   95,   95,   95,  192,  355,  356,   95,  357,  358,
501   359,  360,   17,   17,   17,   17,   17,   17,  361,  364,
502   363,   37,  366,  373,   95,  368,  372,   37,   17,   17,
503   374,  377,  381,  385,   37,  392,   17,   14,   14,   14,
504    14,  165,   17,  394,  395,  397,  398,  399,  403,   17,
505   401,   37,  405,   14,   14,  406,  408,  407,  412,  417,
506   419,   14,  421,  418,  420,  432,   17,   14,  422,  424,
507   425,  427,  438,  429,   14,  193,  433,   18,   18,  434,
508    18,   18,   18,   18,  436,   10,   10,   10,  445,  447,
509   448,   14,   18,   18,  449,  450,  452,   18,   18,  451,
510    18,   10,   10,  453,  454,   18,   18,  460,  467,   10,
511     1,   18,  468,   18,    3,   10,  217,  404,   18,   38,
512    38,  435,   10,  458,  439,  428,   14,   45,  261,   22,
513    18,  328,   15,  256,   49,   18,   79,   81,  107,   10,
514   423,  108,   38,  109,  291,  173,  463,  110,   38,  111,
515   112,  113,  114,    0,    0,   38,    0,    0,    0,    0,
516     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
517     0,    0,   38,    0,    0,    0,    0,   97,   97,    0,
518    97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
519    97,    0,   97,   97,   97,   97,   97,   97,   97,   97,
520     0,   97,   97,   97,    0,    0,    0,   97,   97,   97,
521     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
522     0,    0,  100,  100,    0,  100,  100,  100,  100,  100,
523   100,  100,  100,  100,  100,  100,    0,    0,    0,    0,
524   100,  100,  100,  100,  100,    0,  100,  100,  100,    0,
525     0,    0,  100,  100,  100,    0,    0,    0,    0,    0,
526     0,    0,    0,    0,    0,    0,  192,  192,    0,  192,
527   192,  192,  192,  192,  192,  192,  192,  192,  192,  192,
528     0,    0,    0,    0,  192,  192,  192,  192,  192,    0,
529   192,  192,  192,    0,    0,    0,  192,  192,  192,    0,
530     0,    0,    0,  165,  165,    0,  165,  165,  165,  165,
531   165,  165,  165,  165,  165,  165,  165,    0,    0,    0,
532     0,  165,  165,  165,  165,  165,    0,  165,  165,  165,
533     0,    0,    0,  165,  165,  165,    0,  193,  193,    0,
534   193,  193,  193,  193,  193,  193,  193,  193,  193,  193,
535   193,    0,    0,    0,    0,  193,  193,  193,  193,  193,
536     0,  193,  193,  193,    0,    0,    0,  193,  193,  193,
537 };
538 short yycheck[] = {                                      10,
539    11,   40,   40,   40,   86,    0,  185,  186,  187,  194,
540    84,  177,  178,   74,  180,  181,   85,  258,  288,  257,
541   259,  285,  257,  189,  190,  258,  257,  304,  258,  258,
542    40,  259,  297,  199,  200,  304,  304,  454,   40,   58,
543   277,  278,    0,  304,  304,   22,  323,  302,  285,  304,
544   467,  315,   29,  313,  323,  323,    0,  301,  323,  299,
545   304,   58,  323,  304,  304,  304,  304,   40,  306,  304,
546   305,  304,  342,  304,  304,  304,  304,   40,  315,  323,
547   465,  300,  323,  317,   40,  304,  471,  272,  261,   58,
548     0,  264,  265,  266,  304,  262,  263,   40,  308,  309,
549   323,  267,  304,    0,  289,    0,  308,  309,    0,  319,
550   320,  321,   41,  323,  261,   44,  282,  191,  265,  266,
551   277,  278,  279,  192,  267,  268,  269,  270,  271,  264,
552   296,   44,  311,   58,  313,  314,  315,  280,  179,  282,
553   265,  266,  183,  184,  318,    0,  261,  290,   44,  292,
554   293,  294,  295,  296,  310,  311,    0,  257,    0,  311,
555   312,  267,  268,  269,  270,  271,  272,  273,  274,  275,
556    44,  253,   58,  316,  280,  281,  282,  283,  284,  323,
557   286,  287,  288,  303,  304,   58,  292,  293,  294,  257,
558   201,  324,  265,  266,   58,   58,  207,   58,  364,   58,
559     0,   89,   90,  298,   44,   44,   58,   58,   58,  257,
560   257,  291,   40,  259,  258,  260,  258,   58,  258,   40,
561    58,  258,   58,   58,   58,   58,  392,   58,   58,   58,
562    44,   58,   58,   58,   58,   58,   58,   44,   44,    0,
563    44,   58,   58,   58,   40,   58,   58,   58,   58,   44,
564    58,  289,  259,   58,   44,   58,   44,   44,   44,   91,
565    44,   44,   44,   44,   40,  304,    0,  262,  263,  258,
566   265,  266,  267,  268,  269,  270,  271,  272,  273,  274,
567   275,    0,  293,  344,  295,  280,  281,  282,  283,  284,
568   285,  286,  287,  288,  304,  290,  291,  292,  293,  294,
569   295,  296,  304,  298,  262,  263,    0,  265,  266,  267,
570   268,  269,  270,  271,  272,  273,  274,  275,  262,  263,
571   315,  316,  280,  281,  282,  283,  284,  285,  286,  287,
572   288,  304,  290,  291,  292,  293,  294,  295,  296,   44,
573   298,  304,  353,   44,  307,    0,  289,  291,  304,   44,
574     0,  307,  262,  263,    0,  265,  266,  315,  316,  322,
575    44,  304,   44,  374,  307,  262,  263,  262,  263,  258,
576   262,  263,   44,  265,  266,  267,  268,  269,  270,  271,
577   272,  273,  274,  275,   44,   44,  258,    0,  280,  281,
578   282,  283,  284,  285,  286,  287,  288,  408,  290,  291,
579   292,  293,  294,  295,  296,   91,  298,  262,  263,   44,
580    91,   44,  267,  268,  269,  270,  271,   44,  262,  263,
581   262,  263,  303,  315,  316,  280,  303,  282,   44,  314,
582   285,  314,   44,   44,  445,  290,  291,  292,  293,  294,
583   295,  296,   44,  298,   44,    0,  457,  291,   44,  291,
584    44,   41,   93,   44,  298,   44,  298,  258,   44,  258,
585   315,  316,  262,  263,  258,  265,  266,  267,  268,  269,
586   270,  271,  272,  273,  274,  275,   91,  277,  278,  279,
587   280,  281,  282,  283,  284,  285,  286,  287,  288,   44,
588     0,  291,  292,  293,  294,  258,  258,   44,  298,  258,
589    44,  262,  263,  258,  265,  266,  267,  268,  269,  270,
590   271,  272,  273,  274,  275,  315,  277,  278,  279,  280,
591   281,  282,  283,  284,  285,  286,  287,  288,  262,  263,
592   291,  292,  293,  294,    0,   44,  258,  298,   44,  303,
593    44,   44,  261,  262,  263,  264,  265,  266,   93,   44,
594    93,  285,   44,   44,  315,  258,  258,  291,  277,  278,
595    44,   44,   44,   44,  298,   44,  285,  261,  262,  263,
596   264,    0,  291,  258,   44,   93,   44,  314,  258,  298,
597    44,  315,   44,  277,  278,  258,   44,  258,   44,   44,
598   258,  285,   41,  276,  314,  258,  315,  291,   44,   41,
599    44,   41,  258,   44,  298,    0,   44,  262,  263,   44,
600   265,  266,  262,  263,   44,  261,  262,  263,   44,   41,
601   259,  315,  277,  278,  258,   41,   41,  277,  278,  259,
602   285,  277,  278,   44,   44,  285,  291,   41,   44,  285,
603     0,  291,   44,  298,    0,  291,   58,  379,  298,  262,
604   263,  422,  298,  445,  426,  412,    5,   34,  206,   14,
605   315,  287,    7,  205,   40,  315,   59,   61,   69,  315,
606   405,   69,  285,   69,  253,   88,  453,   69,  291,   69,
607    69,   69,   69,   -1,   -1,  298,   -1,   -1,   -1,   -1,
608    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
609    -1,   -1,  315,   -1,   -1,   -1,   -1,  262,  263,   -1,
610   265,  266,  267,  268,  269,  270,  271,  272,  273,  274,
611   275,   -1,  277,  278,  279,  280,  281,  282,  283,  284,
612    -1,  286,  287,  288,   -1,   -1,   -1,  292,  293,  294,
613    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
614    -1,   -1,  262,  263,   -1,  265,  266,  267,  268,  269,
615   270,  271,  272,  273,  274,  275,   -1,   -1,   -1,   -1,
616   280,  281,  282,  283,  284,   -1,  286,  287,  288,   -1,
617    -1,   -1,  292,  293,  294,   -1,   -1,   -1,   -1,   -1,
618    -1,   -1,   -1,   -1,   -1,   -1,  262,  263,   -1,  265,
619   266,  267,  268,  269,  270,  271,  272,  273,  274,  275,
620    -1,   -1,   -1,   -1,  280,  281,  282,  283,  284,   -1,
621   286,  287,  288,   -1,   -1,   -1,  292,  293,  294,   -1,
622    -1,   -1,   -1,  262,  263,   -1,  265,  266,  267,  268,
623   269,  270,  271,  272,  273,  274,  275,   -1,   -1,   -1,
624    -1,  280,  281,  282,  283,  284,   -1,  286,  287,  288,
625    -1,   -1,   -1,  292,  293,  294,   -1,  262,  263,   -1,
626   265,  266,  267,  268,  269,  270,  271,  272,  273,  274,
627   275,   -1,   -1,   -1,   -1,  280,  281,  282,  283,  284,
628    -1,  286,  287,  288,   -1,   -1,   -1,  292,  293,  294,
629 };
630 #define YYFINAL 3
631 #ifndef YYDEBUG
632 #define YYDEBUG 0
633 #endif
634 #define YYMAXTOKEN 324
635 #if YYDEBUG
636 char *yyname[] = {
637 "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
638 0,0,0,0,0,0,"'('","')'",0,0,"','",0,0,0,0,0,0,0,0,0,0,0,0,0,"':'",0,0,0,0,0,0,0,
639 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'['",0,"']'",0,0,0,0,0,0,0,0,
640 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
641 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
642 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
643 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"CHAR",
644 "INTEGER","BOOLEAN","PERCENT","MESSAGE_ID","MAZE_ID","LEVEL_ID","LEV_INIT_ID",
645 "GEOMETRY_ID","NOMAP_ID","OBJECT_ID","COBJECT_ID","MONSTER_ID","TRAP_ID",
646 "DOOR_ID","DRAWBRIDGE_ID","MAZEWALK_ID","WALLIFY_ID","REGION_ID","FILLING",
647 "RANDOM_OBJECTS_ID","RANDOM_MONSTERS_ID","RANDOM_PLACES_ID","ALTAR_ID",
648 "LADDER_ID","STAIR_ID","NON_DIGGABLE_ID","NON_PASSWALL_ID","ROOM_ID",
649 "PORTAL_ID","TELEPRT_ID","BRANCH_ID","LEV","CHANCE_ID","CORRIDOR_ID","GOLD_ID",
650 "ENGRAVING_ID","FOUNTAIN_ID","POOL_ID","SINK_ID","NONE","RAND_CORRIDOR_ID",
651 "DOOR_STATE","LIGHT_STATE","CURSE_TYPE","ENGRAVING_TYPE","DIRECTION",
652 "RANDOM_TYPE","O_REGISTER","M_REGISTER","P_REGISTER","A_REGISTER","ALIGNMENT",
653 "LEFT_OR_RIGHT","CENTER","TOP_OR_BOT","ALTAR_TYPE","UP_OR_DOWN","SUBROOM_ID",
654 "NAME_ID","FLAGS_ID","FLAG_TYPE","MON_ATTITUDE","MON_ALERTNESS",
655 "MON_APPEARANCE","CONTAINED","STRING","MAP_ID",
656 };
657 char *yyrule[] = {
658 "$accept : file",
659 "file :",
660 "file : levels",
661 "levels : level",
662 "levels : level levels",
663 "level : maze_level",
664 "level : room_level",
665 "maze_level : maze_def flags lev_init messages regions",
666 "room_level : level_def flags lev_init messages rreg_init rooms corridors_def",
667 "level_def : LEVEL_ID ':' string",
668 "lev_init :",
669 "lev_init : LEV_INIT_ID ':' CHAR ',' CHAR ',' BOOLEAN ',' BOOLEAN ',' light_state ',' walled",
670 "walled : BOOLEAN",
671 "walled : RANDOM_TYPE",
672 "flags :",
673 "flags : FLAGS_ID ':' flag_list",
674 "flag_list : FLAG_TYPE ',' flag_list",
675 "flag_list : FLAG_TYPE",
676 "messages :",
677 "messages : message messages",
678 "message : MESSAGE_ID ':' STRING",
679 "rreg_init :",
680 "rreg_init : rreg_init init_rreg",
681 "init_rreg : RANDOM_OBJECTS_ID ':' object_list",
682 "init_rreg : RANDOM_MONSTERS_ID ':' monster_list",
683 "rooms :",
684 "rooms : roomlist",
685 "roomlist : aroom",
686 "roomlist : aroom roomlist",
687 "corridors_def : random_corridors",
688 "corridors_def : corridors",
689 "random_corridors : RAND_CORRIDOR_ID",
690 "corridors :",
691 "corridors : corridors corridor",
692 "corridor : CORRIDOR_ID ':' corr_spec ',' corr_spec",
693 "corridor : CORRIDOR_ID ':' corr_spec ',' INTEGER",
694 "corr_spec : '(' INTEGER ',' DIRECTION ',' door_pos ')'",
695 "aroom : room_def room_details",
696 "aroom : subroom_def room_details",
697 "subroom_def : SUBROOM_ID ':' room_type ',' light_state ',' subroom_pos ',' room_size ',' string roomfill",
698 "room_def : ROOM_ID ':' room_type ',' light_state ',' room_pos ',' room_align ',' room_size roomfill",
699 "roomfill :",
700 "roomfill : ',' BOOLEAN",
701 "room_pos : '(' INTEGER ',' INTEGER ')'",
702 "room_pos : RANDOM_TYPE",
703 "subroom_pos : '(' INTEGER ',' INTEGER ')'",
704 "subroom_pos : RANDOM_TYPE",
705 "room_align : '(' h_justif ',' v_justif ')'",
706 "room_align : RANDOM_TYPE",
707 "room_size : '(' INTEGER ',' INTEGER ')'",
708 "room_size : RANDOM_TYPE",
709 "room_details :",
710 "room_details : room_details room_detail",
711 "room_detail : room_name",
712 "room_detail : room_chance",
713 "room_detail : room_door",
714 "room_detail : monster_detail",
715 "room_detail : object_detail",
716 "room_detail : trap_detail",
717 "room_detail : altar_detail",
718 "room_detail : fountain_detail",
719 "room_detail : sink_detail",
720 "room_detail : pool_detail",
721 "room_detail : gold_detail",
722 "room_detail : engraving_detail",
723 "room_detail : stair_detail",
724 "room_name : NAME_ID ':' string",
725 "room_chance : CHANCE_ID ':' INTEGER",
726 "room_door : DOOR_ID ':' secret ',' door_state ',' door_wall ',' door_pos",
727 "secret : BOOLEAN",
728 "secret : RANDOM_TYPE",
729 "door_wall : DIRECTION",
730 "door_wall : RANDOM_TYPE",
731 "door_pos : INTEGER",
732 "door_pos : RANDOM_TYPE",
733 "maze_def : MAZE_ID ':' string ',' filling",
734 "filling : CHAR",
735 "filling : RANDOM_TYPE",
736 "regions : aregion",
737 "regions : aregion regions",
738 "aregion : map_definition reg_init map_details",
739 "map_definition : NOMAP_ID",
740 "map_definition : map_geometry MAP_ID",
741 "map_geometry : GEOMETRY_ID ':' h_justif ',' v_justif",
742 "h_justif : LEFT_OR_RIGHT",
743 "h_justif : CENTER",
744 "v_justif : TOP_OR_BOT",
745 "v_justif : CENTER",
746 "reg_init :",
747 "reg_init : reg_init init_reg",
748 "init_reg : RANDOM_OBJECTS_ID ':' object_list",
749 "init_reg : RANDOM_PLACES_ID ':' place_list",
750 "init_reg : RANDOM_MONSTERS_ID ':' monster_list",
751 "object_list : object",
752 "object_list : object ',' object_list",
753 "monster_list : monster",
754 "monster_list : monster ',' monster_list",
755 "place_list : place",
756 "$$1 :",
757 "place_list : place $$1 ',' place_list",
758 "map_details :",
759 "map_details : map_details map_detail",
760 "map_detail : monster_detail",
761 "map_detail : object_detail",
762 "map_detail : door_detail",
763 "map_detail : trap_detail",
764 "map_detail : drawbridge_detail",
765 "map_detail : region_detail",
766 "map_detail : stair_region",
767 "map_detail : portal_region",
768 "map_detail : teleprt_region",
769 "map_detail : branch_region",
770 "map_detail : altar_detail",
771 "map_detail : fountain_detail",
772 "map_detail : mazewalk_detail",
773 "map_detail : wallify_detail",
774 "map_detail : ladder_detail",
775 "map_detail : stair_detail",
776 "map_detail : gold_detail",
777 "map_detail : engraving_detail",
778 "map_detail : diggable_detail",
779 "map_detail : passwall_detail",
780 "$$2 :",
781 "monster_detail : MONSTER_ID chance ':' monster_c ',' m_name ',' coordinate $$2 monster_infos",
782 "monster_infos :",
783 "monster_infos : monster_infos monster_info",
784 "monster_info : ',' string",
785 "monster_info : ',' MON_ATTITUDE",
786 "monster_info : ',' MON_ALERTNESS",
787 "monster_info : ',' alignment",
788 "monster_info : ',' MON_APPEARANCE string",
789 "object_detail : OBJECT_ID object_desc",
790 "object_detail : COBJECT_ID object_desc",
791 "$$3 :",
792 "object_desc : chance ':' object_c ',' o_name $$3 ',' object_where object_infos",
793 "object_where : coordinate",
794 "object_where : CONTAINED",
795 "object_infos :",
796 "object_infos : ',' curse_state ',' monster_id ',' enchantment optional_name",
797 "object_infos : ',' curse_state ',' enchantment optional_name",
798 "object_infos : ',' monster_id ',' enchantment optional_name",
799 "curse_state : RANDOM_TYPE",
800 "curse_state : CURSE_TYPE",
801 "monster_id : STRING",
802 "enchantment : RANDOM_TYPE",
803 "enchantment : INTEGER",
804 "optional_name :",
805 "optional_name : ',' NONE",
806 "optional_name : ',' STRING",
807 "door_detail : DOOR_ID ':' door_state ',' coordinate",
808 "trap_detail : TRAP_ID chance ':' trap_name ',' coordinate",
809 "drawbridge_detail : DRAWBRIDGE_ID ':' coordinate ',' DIRECTION ',' door_state",
810 "mazewalk_detail : MAZEWALK_ID ':' coordinate ',' DIRECTION",
811 "wallify_detail : WALLIFY_ID",
812 "ladder_detail : LADDER_ID ':' coordinate ',' UP_OR_DOWN",
813 "stair_detail : STAIR_ID ':' coordinate ',' UP_OR_DOWN",
814 "$$4 :",
815 "stair_region : STAIR_ID ':' lev_region $$4 ',' lev_region ',' UP_OR_DOWN",
816 "$$5 :",
817 "portal_region : PORTAL_ID ':' lev_region $$5 ',' lev_region ',' string",
818 "$$6 :",
819 "$$7 :",
820 "teleprt_region : TELEPRT_ID ':' lev_region $$6 ',' lev_region $$7 teleprt_detail",
821 "$$8 :",
822 "branch_region : BRANCH_ID ':' lev_region $$8 ',' lev_region",
823 "teleprt_detail :",
824 "teleprt_detail : ',' UP_OR_DOWN",
825 "lev_region : region",
826 "lev_region : LEV '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'",
827 "fountain_detail : FOUNTAIN_ID ':' coordinate",
828 "sink_detail : SINK_ID ':' coordinate",
829 "pool_detail : POOL_ID ':' coordinate",
830 "diggable_detail : NON_DIGGABLE_ID ':' region",
831 "passwall_detail : NON_PASSWALL_ID ':' region",
832 "region_detail : REGION_ID ':' region ',' light_state ',' room_type prefilled",
833 "altar_detail : ALTAR_ID ':' coordinate ',' alignment ',' altar_type",
834 "gold_detail : GOLD_ID ':' amount ',' coordinate",
835 "engraving_detail : ENGRAVING_ID ':' coordinate ',' engraving_type ',' string",
836 "monster_c : monster",
837 "monster_c : RANDOM_TYPE",
838 "monster_c : m_register",
839 "object_c : object",
840 "object_c : RANDOM_TYPE",
841 "object_c : o_register",
842 "m_name : string",
843 "m_name : RANDOM_TYPE",
844 "o_name : string",
845 "o_name : RANDOM_TYPE",
846 "trap_name : string",
847 "trap_name : RANDOM_TYPE",
848 "room_type : string",
849 "room_type : RANDOM_TYPE",
850 "prefilled :",
851 "prefilled : ',' FILLING",
852 "prefilled : ',' FILLING ',' BOOLEAN",
853 "coordinate : coord",
854 "coordinate : p_register",
855 "coordinate : RANDOM_TYPE",
856 "door_state : DOOR_STATE",
857 "door_state : RANDOM_TYPE",
858 "light_state : LIGHT_STATE",
859 "light_state : RANDOM_TYPE",
860 "alignment : ALIGNMENT",
861 "alignment : a_register",
862 "alignment : RANDOM_TYPE",
863 "altar_type : ALTAR_TYPE",
864 "altar_type : RANDOM_TYPE",
865 "p_register : P_REGISTER '[' INTEGER ']'",
866 "o_register : O_REGISTER '[' INTEGER ']'",
867 "m_register : M_REGISTER '[' INTEGER ']'",
868 "a_register : A_REGISTER '[' INTEGER ']'",
869 "place : coord",
870 "monster : CHAR",
871 "object : CHAR",
872 "string : STRING",
873 "amount : INTEGER",
874 "amount : RANDOM_TYPE",
875 "chance :",
876 "chance : PERCENT",
877 "engraving_type : ENGRAVING_TYPE",
878 "engraving_type : RANDOM_TYPE",
879 "coord : '(' INTEGER ',' INTEGER ')'",
880 "region : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')'",
881 };
882 #endif
883 #ifdef YYSTACKSIZE
884 #undef YYMAXDEPTH
885 #define YYMAXDEPTH YYSTACKSIZE
886 #else
887 #ifdef YYMAXDEPTH
888 #define YYSTACKSIZE YYMAXDEPTH
889 #else
890 #define YYSTACKSIZE 500
891 #define YYMAXDEPTH 500
892 #endif
893 #endif
894 int yydebug;
895 int yynerrs;
896 int yyerrflag;
897 int yychar;
898 short *yyssp;
899 YYSTYPE *yyvsp;
900 YYSTYPE yyval;
901 YYSTYPE yylval;
902 short yyss[YYSTACKSIZE];
903 YYSTYPE yyvs[YYSTACKSIZE];
904 #define yystacksize YYSTACKSIZE
905
906 /*lev_comp.y*/
907 #define YYABORT goto yyabort
908 #define YYREJECT goto yyabort
909 #define YYACCEPT goto yyaccept
910 #define YYERROR goto yyerrlab
911 int
912 yyparse()
913 {
914     register int yym, yyn, yystate;
915 #if YYDEBUG
916     register char *yys;
917     extern char *getenv();
918
919     if ((yys = getenv("YYDEBUG")) != 0)
920     {
921         yyn = *yys;
922         if (yyn >= '0' && yyn <= '9')
923             yydebug = yyn - '0';
924     }
925 #endif
926
927     yynerrs = 0;
928     yyerrflag = 0;
929     yychar = (-1);
930
931     yyssp = yyss;
932     yyvsp = yyvs;
933     *yyssp = yystate = 0;
934
935 yyloop:
936     if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
937     if (yychar < 0)
938     {
939         if ((yychar = yylex()) < 0) yychar = 0;
940 #if YYDEBUG
941         if (yydebug)
942         {
943             yys = 0;
944             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
945             if (!yys) yys = "illegal-symbol";
946             printf("%sdebug: state %d, reading %d (%s)\n",
947                     YYPREFIX, yystate, yychar, yys);
948         }
949 #endif
950     }
951     if ((yyn = yysindex[yystate]) != 0 && (yyn += yychar) >= 0 &&
952             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
953     {
954 #if YYDEBUG
955         if (yydebug)
956             printf("%sdebug: state %d, shifting to state %d\n",
957                     YYPREFIX, yystate, yytable[yyn]);
958 #endif
959         if (yyssp >= yyss + yystacksize - 1)
960         {
961             goto yyoverflow;
962         }
963         *++yyssp = yystate = yytable[yyn];
964         *++yyvsp = yylval;
965         yychar = (-1);
966         if (yyerrflag > 0)  --yyerrflag;
967         goto yyloop;
968     }
969     if ((yyn = yyrindex[yystate]) != 0 && (yyn += yychar) >= 0 &&
970             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
971     {
972         yyn = yytable[yyn];
973         goto yyreduce;
974     }
975     if (yyerrflag) goto yyinrecovery;
976 #ifdef lint
977     goto yynewerror;
978 #endif
979 yynewerror:
980     yyerror("syntax error");
981 #ifdef lint
982     goto yyerrlab;
983 #endif
984 yyerrlab:
985     ++yynerrs;
986 yyinrecovery:
987     if (yyerrflag < 3)
988     {
989         yyerrflag = 3;
990         for (;;)
991         {
992             if ((yyn = yysindex[*yyssp]) != 0 && (yyn += YYERRCODE) >= 0 &&
993                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
994             {
995 #if YYDEBUG
996                 if (yydebug)
997                     printf("%sdebug: state %d, error recovery shifting\
998  to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
999 #endif
1000                 if (yyssp >= yyss + yystacksize - 1)
1001                 {
1002                     goto yyoverflow;
1003                 }
1004                 *++yyssp = yystate = yytable[yyn];
1005                 *++yyvsp = yylval;
1006                 goto yyloop;
1007             }
1008             else
1009             {
1010 #if YYDEBUG
1011                 if (yydebug)
1012                     printf("%sdebug: error recovery discarding state %d\n",
1013                             YYPREFIX, *yyssp);
1014 #endif
1015                 if (yyssp <= yyss) goto yyabort;
1016                 --yyssp;
1017                 --yyvsp;
1018             }
1019         }
1020     }
1021     else
1022     {
1023         if (yychar == 0) goto yyabort;
1024 #if YYDEBUG
1025         if (yydebug)
1026         {
1027             yys = 0;
1028             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
1029             if (!yys) yys = "illegal-symbol";
1030             printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
1031                     YYPREFIX, yystate, yychar, yys);
1032         }
1033 #endif
1034         yychar = (-1);
1035         goto yyloop;
1036     }
1037 yyreduce:
1038 #if YYDEBUG
1039     if (yydebug)
1040         printf("%sdebug: state %d, reducing by rule %d (%s)\n",
1041                 YYPREFIX, yystate, yyn, yyrule[yyn]);
1042 #endif
1043     yym = yylen[yyn];
1044     yyval = yyvsp[1-yym];
1045     switch (yyn)
1046     {
1047 case 7:
1048 {
1049                         unsigned i;
1050
1051                         if (fatal_error > 0) {
1052                                 (void) fprintf(stderr,
1053                                 "%s : %d errors detected. No output created!\n",
1054                                         fname, fatal_error);
1055                         } else {
1056                                 maze.flags = yyvsp[-3].i;
1057                                 (void) memcpy((genericptr_t)&(maze.init_lev),
1058                                                 (genericptr_t)&(init_lev),
1059                                                 sizeof(lev_init));
1060                                 maze.numpart = npart;
1061                                 maze.parts = NewTab(mazepart, npart);
1062                                 for(i=0;i<npart;i++)
1063                                     maze.parts[i] = tmppart[i];
1064                                 if (!write_level_file(yyvsp[-4].map, (splev *)0, &maze)) {
1065                                         yyerror("Can't write output file!!");
1066                                         exit(EXIT_FAILURE);
1067                                 }
1068                                 npart = 0;
1069                         }
1070                         Free(yyvsp[-4].map);
1071                   }
1072 break;
1073 case 8:
1074 {
1075                         unsigned i;
1076
1077                         if (fatal_error > 0) {
1078                             (void) fprintf(stderr,
1079                               "%s : %d errors detected. No output created!\n",
1080                                         fname, fatal_error);
1081                         } else {
1082                                 special_lev.flags = (long) yyvsp[-5].i;
1083                                 (void) memcpy(
1084                                         (genericptr_t)&(special_lev.init_lev),
1085                                         (genericptr_t)&(init_lev),
1086                                         sizeof(lev_init));
1087                                 special_lev.nroom = nrooms;
1088                                 special_lev.rooms = NewTab(room, nrooms);
1089                                 for(i=0; i<nrooms; i++)
1090                                     special_lev.rooms[i] = tmproom[i];
1091                                 special_lev.ncorr = ncorridor;
1092                                 special_lev.corrs = NewTab(corridor, ncorridor);
1093                                 for(i=0; i<ncorridor; i++)
1094                                     special_lev.corrs[i] = tmpcor[i];
1095                                 if (check_subrooms()) {
1096                                     if (!write_level_file(yyvsp[-6].map, &special_lev,
1097                                                           (specialmaze *)0)) {
1098                                         yyerror("Can't write output file!!");
1099                                         exit(EXIT_FAILURE);
1100                                     }
1101                                 }
1102                                 free_rooms(&special_lev);
1103                                 nrooms = 0;
1104                                 ncorridor = 0;
1105                         }
1106                         Free(yyvsp[-6].map);
1107                   }
1108 break;
1109 case 9:
1110 {
1111                         if (index(yyvsp[0].map, '.'))
1112                             yyerror("Invalid dot ('.') in level name.");
1113                         if ((int) strlen(yyvsp[0].map) > 8)
1114                             yyerror("Level names limited to 8 characters.");
1115                         yyval.map = yyvsp[0].map;
1116                         special_lev.nrmonst = special_lev.nrobjects = 0;
1117                         n_mlist = n_olist = 0;
1118                   }
1119 break;
1120 case 10:
1121 {
1122                         /* in case we're processing multiple files,
1123                            explicitly clear any stale settings */
1124                         (void) memset((genericptr_t) &init_lev, 0,
1125                                         sizeof init_lev);
1126                         init_lev.init_present = FALSE;
1127                         yyval.i = 0;
1128                   }
1129 break;
1130 case 11:
1131 {
1132                         init_lev.init_present = TRUE;
1133                         init_lev.fg = what_map_char((char) yyvsp[-10].i);
1134                         if (init_lev.fg == INVALID_TYPE)
1135                             yyerror("Invalid foreground type.");
1136                         init_lev.bg = what_map_char((char) yyvsp[-8].i);
1137                         if (init_lev.bg == INVALID_TYPE)
1138                             yyerror("Invalid background type.");
1139                         init_lev.smoothed = yyvsp[-6].i;
1140                         init_lev.joined = yyvsp[-4].i;
1141                         if (init_lev.joined &&
1142                             init_lev.fg != CORR && init_lev.fg != ROOM)
1143                             yyerror("Invalid foreground type for joined map.");
1144                         init_lev.lit = yyvsp[-2].i;
1145                         init_lev.walled = yyvsp[0].i;
1146                         yyval.i = 1;
1147                   }
1148 break;
1149 case 14:
1150 {
1151                         yyval.i = 0;
1152                   }
1153 break;
1154 case 15:
1155 {
1156                         yyval.i = lev_flags;
1157                         lev_flags = 0;  /* clear for next user */
1158                   }
1159 break;
1160 case 16:
1161 {
1162                         lev_flags |= yyvsp[-2].i;
1163                   }
1164 break;
1165 case 17:
1166 {
1167                         lev_flags |= yyvsp[0].i;
1168                   }
1169 break;
1170 case 20:
1171 {
1172                         int i, j;
1173
1174                         i = (int) strlen(yyvsp[0].map) + 1;
1175                         j = (int) strlen(tmpmessage);
1176                         if (i + j > 255) {
1177                            yyerror("Message string too long (>256 characters)");
1178                         } else {
1179                             if (j) tmpmessage[j++] = '\n';
1180                             (void) strncpy(tmpmessage+j, yyvsp[0].map, i - 1);
1181                             tmpmessage[j + i - 1] = 0;
1182                         }
1183                         Free(yyvsp[0].map);
1184                   }
1185 break;
1186 case 23:
1187 {
1188                         if(special_lev.nrobjects) {
1189                             yyerror("Object registers already initialized!");
1190                         } else {
1191                             special_lev.nrobjects = n_olist;
1192                             special_lev.robjects = (char *) alloc(n_olist);
1193                             (void) memcpy((genericptr_t)special_lev.robjects,
1194                                           (genericptr_t)olist, n_olist);
1195                         }
1196                   }
1197 break;
1198 case 24:
1199 {
1200                         if(special_lev.nrmonst) {
1201                             yyerror("Monster registers already initialized!");
1202                         } else {
1203                             special_lev.nrmonst = n_mlist;
1204                             special_lev.rmonst = (char *) alloc(n_mlist);
1205                             (void) memcpy((genericptr_t)special_lev.rmonst,
1206                                           (genericptr_t)mlist, n_mlist);
1207                           }
1208                   }
1209 break;
1210 case 25:
1211 {
1212                         tmproom[nrooms] = New(room);
1213                         tmproom[nrooms]->name = (char *) 0;
1214                         tmproom[nrooms]->parent = (char *) 0;
1215                         tmproom[nrooms]->rtype = 0;
1216                         tmproom[nrooms]->rlit = 0;
1217                         tmproom[nrooms]->xalign = ERR;
1218                         tmproom[nrooms]->yalign = ERR;
1219                         tmproom[nrooms]->x = 0;
1220                         tmproom[nrooms]->y = 0;
1221                         tmproom[nrooms]->w = 2;
1222                         tmproom[nrooms]->h = 2;
1223                         in_room = 1;
1224                   }
1225 break;
1226 case 31:
1227 {
1228                         tmpcor[0] = New(corridor);
1229                         tmpcor[0]->src.room = -1;
1230                         ncorridor = 1;
1231                   }
1232 break;
1233 case 34:
1234 {
1235                         tmpcor[ncorridor] = New(corridor);
1236                         tmpcor[ncorridor]->src.room = yyvsp[-2].corpos.room;
1237                         tmpcor[ncorridor]->src.wall = yyvsp[-2].corpos.wall;
1238                         tmpcor[ncorridor]->src.door = yyvsp[-2].corpos.door;
1239                         tmpcor[ncorridor]->dest.room = yyvsp[0].corpos.room;
1240                         tmpcor[ncorridor]->dest.wall = yyvsp[0].corpos.wall;
1241                         tmpcor[ncorridor]->dest.door = yyvsp[0].corpos.door;
1242                         ncorridor++;
1243                         if (ncorridor >= MAX_OF_TYPE) {
1244                                 yyerror("Too many corridors in level!");
1245                                 ncorridor--;
1246                         }
1247                   }
1248 break;
1249 case 35:
1250 {
1251                         tmpcor[ncorridor] = New(corridor);
1252                         tmpcor[ncorridor]->src.room = yyvsp[-2].corpos.room;
1253                         tmpcor[ncorridor]->src.wall = yyvsp[-2].corpos.wall;
1254                         tmpcor[ncorridor]->src.door = yyvsp[-2].corpos.door;
1255                         tmpcor[ncorridor]->dest.room = -1;
1256                         tmpcor[ncorridor]->dest.wall = yyvsp[0].i;
1257                         ncorridor++;
1258                         if (ncorridor >= MAX_OF_TYPE) {
1259                                 yyerror("Too many corridors in level!");
1260                                 ncorridor--;
1261                         }
1262                   }
1263 break;
1264 case 36:
1265 {
1266                         if ((unsigned) yyvsp[-5].i >= nrooms)
1267                             yyerror("Wrong room number!");
1268                         yyval.corpos.room = yyvsp[-5].i;
1269                         yyval.corpos.wall = yyvsp[-3].i;
1270                         yyval.corpos.door = yyvsp[-1].i;
1271                   }
1272 break;
1273 case 37:
1274 {
1275                         store_room();
1276                   }
1277 break;
1278 case 38:
1279 {
1280                         store_room();
1281                   }
1282 break;
1283 case 39:
1284 {
1285                         tmproom[nrooms] = New(room);
1286                         tmproom[nrooms]->parent = yyvsp[-1].map;
1287                         tmproom[nrooms]->name = (char *) 0;
1288                         tmproom[nrooms]->rtype = yyvsp[-9].i;
1289                         tmproom[nrooms]->rlit = yyvsp[-7].i;
1290                         tmproom[nrooms]->filled = yyvsp[0].i;
1291                         tmproom[nrooms]->xalign = ERR;
1292                         tmproom[nrooms]->yalign = ERR;
1293                         tmproom[nrooms]->x = current_coord.x;
1294                         tmproom[nrooms]->y = current_coord.y;
1295                         tmproom[nrooms]->w = current_size.width;
1296                         tmproom[nrooms]->h = current_size.height;
1297                         in_room = 1;
1298                   }
1299 break;
1300 case 40:
1301 {
1302                         tmproom[nrooms] = New(room);
1303                         tmproom[nrooms]->name = (char *) 0;
1304                         tmproom[nrooms]->parent = (char *) 0;
1305                         tmproom[nrooms]->rtype = yyvsp[-9].i;
1306                         tmproom[nrooms]->rlit = yyvsp[-7].i;
1307                         tmproom[nrooms]->filled = yyvsp[0].i;
1308                         tmproom[nrooms]->xalign = current_align.x;
1309                         tmproom[nrooms]->yalign = current_align.y;
1310                         tmproom[nrooms]->x = current_coord.x;
1311                         tmproom[nrooms]->y = current_coord.y;
1312                         tmproom[nrooms]->w = current_size.width;
1313                         tmproom[nrooms]->h = current_size.height;
1314                         in_room = 1;
1315                   }
1316 break;
1317 case 41:
1318 {
1319                         yyval.i = 1;
1320                   }
1321 break;
1322 case 42:
1323 {
1324                         yyval.i = yyvsp[0].i;
1325                   }
1326 break;
1327 case 43:
1328 {
1329                         if ( yyvsp[-3].i < 1 || yyvsp[-3].i > 5 ||
1330                             yyvsp[-1].i < 1 || yyvsp[-1].i > 5 ) {
1331                             yyerror("Room position should be between 1 & 5!");
1332                         } else {
1333                             current_coord.x = yyvsp[-3].i;
1334                             current_coord.y = yyvsp[-1].i;
1335                         }
1336                   }
1337 break;
1338 case 44:
1339 {
1340                         current_coord.x = current_coord.y = ERR;
1341                   }
1342 break;
1343 case 45:
1344 {
1345                         if ( yyvsp[-3].i < 0 || yyvsp[-1].i < 0) {
1346                             yyerror("Invalid subroom position !");
1347                         } else {
1348                             current_coord.x = yyvsp[-3].i;
1349                             current_coord.y = yyvsp[-1].i;
1350                         }
1351                   }
1352 break;
1353 case 46:
1354 {
1355                         current_coord.x = current_coord.y = ERR;
1356                   }
1357 break;
1358 case 47:
1359 {
1360                         current_align.x = yyvsp[-3].i;
1361                         current_align.y = yyvsp[-1].i;
1362                   }
1363 break;
1364 case 48:
1365 {
1366                         current_align.x = current_align.y = ERR;
1367                   }
1368 break;
1369 case 49:
1370 {
1371                         current_size.width = yyvsp[-3].i;
1372                         current_size.height = yyvsp[-1].i;
1373                   }
1374 break;
1375 case 50:
1376 {
1377                         current_size.height = current_size.width = ERR;
1378                   }
1379 break;
1380 case 66:
1381 {
1382                         if (tmproom[nrooms]->name)
1383                             yyerror("This room already has a name!");
1384                         else
1385                             tmproom[nrooms]->name = yyvsp[0].map;
1386                   }
1387 break;
1388 case 67:
1389 {
1390                         if (tmproom[nrooms]->chance)
1391                             yyerror("This room already assigned a chance!");
1392                         else if (tmproom[nrooms]->rtype == OROOM)
1393                             yyerror("Only typed rooms can have a chance!");
1394                         else if (yyvsp[0].i < 1 || yyvsp[0].i > 99)
1395                             yyerror("The chance is supposed to be percentile.");
1396                         else
1397                             tmproom[nrooms]->chance = yyvsp[0].i;
1398                    }
1399 break;
1400 case 68:
1401 {
1402                         /* ERR means random here */
1403                         if (yyvsp[-2].i == ERR && yyvsp[0].i != ERR) {
1404                      yyerror("If the door wall is random, so must be its pos!");
1405                         } else {
1406                             tmprdoor[ndoor] = New(room_door);
1407                             tmprdoor[ndoor]->secret = yyvsp[-6].i;
1408                             tmprdoor[ndoor]->mask = yyvsp[-4].i;
1409                             tmprdoor[ndoor]->wall = yyvsp[-2].i;
1410                             tmprdoor[ndoor]->pos = yyvsp[0].i;
1411                             ndoor++;
1412                             if (ndoor >= MAX_OF_TYPE) {
1413                                     yyerror("Too many doors in room!");
1414                                     ndoor--;
1415                             }
1416                         }
1417                   }
1418 break;
1419 case 75:
1420 {
1421                         maze.filling = (schar) yyvsp[0].i;
1422                         if (index(yyvsp[-2].map, '.'))
1423                             yyerror("Invalid dot ('.') in level name.");
1424                         if ((int) strlen(yyvsp[-2].map) > 8)
1425                             yyerror("Level names limited to 8 characters.");
1426                         yyval.map = yyvsp[-2].map;
1427                         in_room = 0;
1428                         n_plist = n_mlist = n_olist = 0;
1429                   }
1430 break;
1431 case 76:
1432 {
1433                         yyval.i = get_floor_type((char)yyvsp[0].i);
1434                   }
1435 break;
1436 case 77:
1437 {
1438                         yyval.i = -1;
1439                   }
1440 break;
1441 case 80:
1442 {
1443                         store_part();
1444                   }
1445 break;
1446 case 81:
1447 {
1448                         tmppart[npart] = New(mazepart);
1449                         tmppart[npart]->halign = 1;
1450                         tmppart[npart]->valign = 1;
1451                         tmppart[npart]->nrobjects = 0;
1452                         tmppart[npart]->nloc = 0;
1453                         tmppart[npart]->nrmonst = 0;
1454                         tmppart[npart]->xsize = 1;
1455                         tmppart[npart]->ysize = 1;
1456                         tmppart[npart]->map = (char **) alloc(sizeof(char *));
1457                         tmppart[npart]->map[0] = (char *) alloc(1);
1458                         tmppart[npart]->map[0][0] = STONE;
1459                         max_x_map = COLNO-1;
1460                         max_y_map = ROWNO;
1461                   }
1462 break;
1463 case 82:
1464 {
1465                         tmppart[npart] = New(mazepart);
1466                         tmppart[npart]->halign = yyvsp[-1].i % 10;
1467                         tmppart[npart]->valign = yyvsp[-1].i / 10;
1468                         tmppart[npart]->nrobjects = 0;
1469                         tmppart[npart]->nloc = 0;
1470                         tmppart[npart]->nrmonst = 0;
1471                         scan_map(yyvsp[0].map);
1472                         Free(yyvsp[0].map);
1473                   }
1474 break;
1475 case 83:
1476 {
1477                         yyval.i = yyvsp[-2].i + (yyvsp[0].i * 10);
1478                   }
1479 break;
1480 case 90:
1481 {
1482                         if (tmppart[npart]->nrobjects) {
1483                             yyerror("Object registers already initialized!");
1484                         } else {
1485                             tmppart[npart]->robjects = (char *)alloc(n_olist);
1486                             (void) memcpy((genericptr_t)tmppart[npart]->robjects,
1487                                           (genericptr_t)olist, n_olist);
1488                             tmppart[npart]->nrobjects = n_olist;
1489                         }
1490                   }
1491 break;
1492 case 91:
1493 {
1494                         if (tmppart[npart]->nloc) {
1495                             yyerror("Location registers already initialized!");
1496                         } else {
1497                             register int i;
1498                             tmppart[npart]->rloc_x = (char *) alloc(n_plist);
1499                             tmppart[npart]->rloc_y = (char *) alloc(n_plist);
1500                             for(i=0;i<n_plist;i++) {
1501                                 tmppart[npart]->rloc_x[i] = plist[i].x;
1502                                 tmppart[npart]->rloc_y[i] = plist[i].y;
1503                             }
1504                             tmppart[npart]->nloc = n_plist;
1505                         }
1506                   }
1507 break;
1508 case 92:
1509 {
1510                         if (tmppart[npart]->nrmonst) {
1511                             yyerror("Monster registers already initialized!");
1512                         } else {
1513                             tmppart[npart]->rmonst = (char *) alloc(n_mlist);
1514                             (void) memcpy((genericptr_t)tmppart[npart]->rmonst,
1515                                           (genericptr_t)mlist, n_mlist);
1516                             tmppart[npart]->nrmonst = n_mlist;
1517                         }
1518                   }
1519 break;
1520 case 93:
1521 {
1522                         if (n_olist < MAX_REGISTERS)
1523                             olist[n_olist++] = yyvsp[0].i;
1524                         else
1525                             yyerror("Object list too long!");
1526                   }
1527 break;
1528 case 94:
1529 {
1530                         if (n_olist < MAX_REGISTERS)
1531                             olist[n_olist++] = yyvsp[-2].i;
1532                         else
1533                             yyerror("Object list too long!");
1534                   }
1535 break;
1536 case 95:
1537 {
1538                         if (n_mlist < MAX_REGISTERS)
1539                             mlist[n_mlist++] = yyvsp[0].i;
1540                         else
1541                             yyerror("Monster list too long!");
1542                   }
1543 break;
1544 case 96:
1545 {
1546                         if (n_mlist < MAX_REGISTERS)
1547                             mlist[n_mlist++] = yyvsp[-2].i;
1548                         else
1549                             yyerror("Monster list too long!");
1550                   }
1551 break;
1552 case 97:
1553 {
1554                         if (n_plist < MAX_REGISTERS)
1555                             plist[n_plist++] = current_coord;
1556                         else
1557                             yyerror("Location list too long!");
1558                   }
1559 break;
1560 case 98:
1561 {
1562                         if (n_plist < MAX_REGISTERS)
1563                             plist[n_plist++] = current_coord;
1564                         else
1565                             yyerror("Location list too long!");
1566                   }
1567 break;
1568 case 122:
1569 {
1570                         tmpmonst[nmons] = New(monster);
1571                         tmpmonst[nmons]->x = current_coord.x;
1572                         tmpmonst[nmons]->y = current_coord.y;
1573                         tmpmonst[nmons]->class = yyvsp[-4].i;
1574                         tmpmonst[nmons]->peaceful = -1; /* no override */
1575                         tmpmonst[nmons]->asleep = -1;
1576                         tmpmonst[nmons]->align = - MAX_REGISTERS - 2;
1577                         tmpmonst[nmons]->name.str = 0;
1578                         tmpmonst[nmons]->appear = 0;
1579                         tmpmonst[nmons]->appear_as.str = 0;
1580                         tmpmonst[nmons]->chance = yyvsp[-6].i;
1581                         tmpmonst[nmons]->id = NON_PM;
1582                         if (!in_room)
1583                             check_coord(current_coord.x, current_coord.y,
1584                                         "Monster");
1585                         if (yyvsp[-2].map) {
1586                             int token = get_monster_id(yyvsp[-2].map, (char) yyvsp[-4].i);
1587                             if (token == ERR)
1588                                 yywarning(
1589                               "Invalid monster name!  Making random monster.");
1590                             else
1591                                 tmpmonst[nmons]->id = token;
1592                             Free(yyvsp[-2].map);
1593                         }
1594                   }
1595 break;
1596 case 123:
1597 {
1598                         if (++nmons >= MAX_OF_TYPE) {
1599                             yyerror("Too many monsters in room or mazepart!");
1600                             nmons--;
1601                         }
1602                   }
1603 break;
1604 case 126:
1605 {
1606                         tmpmonst[nmons]->name.str = yyvsp[0].map;
1607                   }
1608 break;
1609 case 127:
1610 {
1611                         tmpmonst[nmons]->peaceful = yyvsp[0].i;
1612                   }
1613 break;
1614 case 128:
1615 {
1616                         tmpmonst[nmons]->asleep = yyvsp[0].i;
1617                   }
1618 break;
1619 case 129:
1620 {
1621                         tmpmonst[nmons]->align = yyvsp[0].i;
1622                   }
1623 break;
1624 case 130:
1625 {
1626                         tmpmonst[nmons]->appear = yyvsp[-1].i;
1627                         tmpmonst[nmons]->appear_as.str = yyvsp[0].map;
1628                   }
1629 break;
1630 case 131:
1631 {
1632                   }
1633 break;
1634 case 132:
1635 {
1636                         /* 1: is contents of preceeding object with 2 */
1637                         /* 2: is a container */
1638                         /* 0: neither */
1639                         tmpobj[nobj-1]->containment = 2;
1640                   }
1641 break;
1642 case 133:
1643 {
1644                         tmpobj[nobj] = New(object);
1645                         tmpobj[nobj]->class = yyvsp[-2].i;
1646                         tmpobj[nobj]->corpsenm = NON_PM;
1647                         tmpobj[nobj]->curse_state = -1;
1648                         tmpobj[nobj]->name.str = 0;
1649                         tmpobj[nobj]->chance = yyvsp[-4].i;
1650                         tmpobj[nobj]->id = -1;
1651                         if (yyvsp[0].map) {
1652                             int token = get_object_id(yyvsp[0].map, yyvsp[-2].i);
1653                             if (token == ERR)
1654                                 yywarning(
1655                                 "Illegal object name!  Making random object.");
1656                              else
1657                                 tmpobj[nobj]->id = token;
1658                             Free(yyvsp[0].map);
1659                         }
1660                   }
1661 break;
1662 case 134:
1663 {
1664                         if (++nobj >= MAX_OF_TYPE) {
1665                             yyerror("Too many objects in room or mazepart!");
1666                             nobj--;
1667                         }
1668                   }
1669 break;
1670 case 135:
1671 {
1672                         tmpobj[nobj]->containment = 0;
1673                         tmpobj[nobj]->x = current_coord.x;
1674                         tmpobj[nobj]->y = current_coord.y;
1675                         if (!in_room)
1676                             check_coord(current_coord.x, current_coord.y,
1677                                         "Object");
1678                   }
1679 break;
1680 case 136:
1681 {
1682                         tmpobj[nobj]->containment = 1;
1683                         /* random coordinate, will be overridden anyway */
1684                         tmpobj[nobj]->x = -MAX_REGISTERS-1;
1685                         tmpobj[nobj]->y = -MAX_REGISTERS-1;
1686                   }
1687 break;
1688 case 137:
1689 {
1690                         tmpobj[nobj]->spe = -127;
1691         /* Note below: we're trying to make as many of these optional as
1692          * possible.  We clearly can't make curse_state, enchantment, and
1693          * monster_id _all_ optional, since ",random" would be ambiguous.
1694          * We can't even just make enchantment mandatory, since if we do that
1695          * alone, ",random" requires too much lookahead to parse.
1696          */
1697                   }
1698 break;
1699 case 138:
1700 {
1701                   }
1702 break;
1703 case 139:
1704 {
1705                   }
1706 break;
1707 case 140:
1708 {
1709                   }
1710 break;
1711 case 141:
1712 {
1713                         tmpobj[nobj]->curse_state = -1;
1714                   }
1715 break;
1716 case 142:
1717 {
1718                         tmpobj[nobj]->curse_state = yyvsp[0].i;
1719                   }
1720 break;
1721 case 143:
1722 {
1723                         int token = get_monster_id(yyvsp[0].map, (char)0);
1724                         if (token == ERR)       /* "random" */
1725                             tmpobj[nobj]->corpsenm = NON_PM - 1;
1726                         else
1727                             tmpobj[nobj]->corpsenm = token;
1728                         Free(yyvsp[0].map);
1729                   }
1730 break;
1731 case 144:
1732 {
1733                         tmpobj[nobj]->spe = -127;
1734                   }
1735 break;
1736 case 145:
1737 {
1738                         tmpobj[nobj]->spe = yyvsp[0].i;
1739                   }
1740 break;
1741 case 147:
1742 {
1743                   }
1744 break;
1745 case 148:
1746 {
1747                         tmpobj[nobj]->name.str = yyvsp[0].map;
1748                   }
1749 break;
1750 case 149:
1751 {
1752                         tmpdoor[ndoor] = New(door);
1753                         tmpdoor[ndoor]->x = current_coord.x;
1754                         tmpdoor[ndoor]->y = current_coord.y;
1755                         tmpdoor[ndoor]->mask = yyvsp[-2].i;
1756                         if(current_coord.x >= 0 && current_coord.y >= 0 &&
1757                            tmpmap[current_coord.y][current_coord.x] != DOOR &&
1758                            tmpmap[current_coord.y][current_coord.x] != SDOOR)
1759                             yyerror("Door decl doesn't match the map");
1760                         ndoor++;
1761                         if (ndoor >= MAX_OF_TYPE) {
1762                                 yyerror("Too many doors in mazepart!");
1763                                 ndoor--;
1764                         }
1765                   }
1766 break;
1767 case 150:
1768 {
1769                         tmptrap[ntrap] = New(trap);
1770                         tmptrap[ntrap]->x = current_coord.x;
1771                         tmptrap[ntrap]->y = current_coord.y;
1772                         tmptrap[ntrap]->type = yyvsp[-2].i;
1773                         tmptrap[ntrap]->chance = yyvsp[-4].i;
1774                         if (!in_room)
1775                             check_coord(current_coord.x, current_coord.y,
1776                                         "Trap");
1777                         if (++ntrap >= MAX_OF_TYPE) {
1778                                 yyerror("Too many traps in room or mazepart!");
1779                                 ntrap--;
1780                         }
1781                   }
1782 break;
1783 case 151:
1784 {
1785                         int x, y, dir;
1786
1787                         tmpdb[ndb] = New(drawbridge);
1788                         x = tmpdb[ndb]->x = current_coord.x;
1789                         y = tmpdb[ndb]->y = current_coord.y;
1790                         /* convert dir from a DIRECTION to a DB_DIR */
1791                         dir = yyvsp[-2].i;
1792                         switch(dir) {
1793                         case W_NORTH: dir = DB_NORTH; y--; break;
1794                         case W_SOUTH: dir = DB_SOUTH; y++; break;
1795                         case W_EAST:  dir = DB_EAST;  x++; break;
1796                         case W_WEST:  dir = DB_WEST;  x--; break;
1797                         default:
1798                             yyerror("Invalid drawbridge direction");
1799                             break;
1800                         }
1801                         tmpdb[ndb]->dir = dir;
1802                         if (current_coord.x >= 0 && current_coord.y >= 0 &&
1803                             !IS_WALL(tmpmap[y][x])) {
1804                             char ebuf[60];
1805                             Sprintf(ebuf,
1806                                     "Wall needed for drawbridge (%02d, %02d)",
1807                                     current_coord.x, current_coord.y);
1808                             yyerror(ebuf);
1809                         }
1810
1811                         if ( yyvsp[0].i == D_ISOPEN )
1812                             tmpdb[ndb]->db_open = 1;
1813                         else if ( yyvsp[0].i == D_CLOSED )
1814                             tmpdb[ndb]->db_open = 0;
1815                         else
1816                             yyerror("A drawbridge can only be open or closed!");
1817                         ndb++;
1818                         if (ndb >= MAX_OF_TYPE) {
1819                                 yyerror("Too many drawbridges in mazepart!");
1820                                 ndb--;
1821                         }
1822                    }
1823 break;
1824 case 152:
1825 {
1826                         tmpwalk[nwalk] = New(walk);
1827                         tmpwalk[nwalk]->x = current_coord.x;
1828                         tmpwalk[nwalk]->y = current_coord.y;
1829                         tmpwalk[nwalk]->dir = yyvsp[0].i;
1830                         nwalk++;
1831                         if (nwalk >= MAX_OF_TYPE) {
1832                                 yyerror("Too many mazewalks in mazepart!");
1833                                 nwalk--;
1834                         }
1835                   }
1836 break;
1837 case 153:
1838 {
1839                         wallify_map();
1840                   }
1841 break;
1842 case 154:
1843 {
1844                         tmplad[nlad] = New(lad);
1845                         tmplad[nlad]->x = current_coord.x;
1846                         tmplad[nlad]->y = current_coord.y;
1847                         tmplad[nlad]->up = yyvsp[0].i;
1848                         if (!in_room)
1849                             check_coord(current_coord.x, current_coord.y,
1850                                         "Ladder");
1851                         nlad++;
1852                         if (nlad >= MAX_OF_TYPE) {
1853                                 yyerror("Too many ladders in mazepart!");
1854                                 nlad--;
1855                         }
1856                   }
1857 break;
1858 case 155:
1859 {
1860                         tmpstair[nstair] = New(stair);
1861                         tmpstair[nstair]->x = current_coord.x;
1862                         tmpstair[nstair]->y = current_coord.y;
1863                         tmpstair[nstair]->up = yyvsp[0].i;
1864                         if (!in_room)
1865                             check_coord(current_coord.x, current_coord.y,
1866                                         "Stairway");
1867                         nstair++;
1868                         if (nstair >= MAX_OF_TYPE) {
1869                                 yyerror("Too many stairs in room or mazepart!");
1870                                 nstair--;
1871                         }
1872                   }
1873 break;
1874 case 156:
1875 {
1876                         tmplreg[nlreg] = New(lev_region);
1877                         tmplreg[nlreg]->in_islev = yyvsp[0].i;
1878                         tmplreg[nlreg]->inarea.x1 = current_region.x1;
1879                         tmplreg[nlreg]->inarea.y1 = current_region.y1;
1880                         tmplreg[nlreg]->inarea.x2 = current_region.x2;
1881                         tmplreg[nlreg]->inarea.y2 = current_region.y2;
1882                   }
1883 break;
1884 case 157:
1885 {
1886                         tmplreg[nlreg]->del_islev = yyvsp[-2].i;
1887                         tmplreg[nlreg]->delarea.x1 = current_region.x1;
1888                         tmplreg[nlreg]->delarea.y1 = current_region.y1;
1889                         tmplreg[nlreg]->delarea.x2 = current_region.x2;
1890                         tmplreg[nlreg]->delarea.y2 = current_region.y2;
1891                         if(yyvsp[0].i)
1892                             tmplreg[nlreg]->rtype = LR_UPSTAIR;
1893                         else
1894                             tmplreg[nlreg]->rtype = LR_DOWNSTAIR;
1895                         tmplreg[nlreg]->rname.str = 0;
1896                         nlreg++;
1897                         if (nlreg >= MAX_OF_TYPE) {
1898                                 yyerror("Too many levregions in mazepart!");
1899                                 nlreg--;
1900                         }
1901                   }
1902 break;
1903 case 158:
1904 {
1905                         tmplreg[nlreg] = New(lev_region);
1906                         tmplreg[nlreg]->in_islev = yyvsp[0].i;
1907                         tmplreg[nlreg]->inarea.x1 = current_region.x1;
1908                         tmplreg[nlreg]->inarea.y1 = current_region.y1;
1909                         tmplreg[nlreg]->inarea.x2 = current_region.x2;
1910                         tmplreg[nlreg]->inarea.y2 = current_region.y2;
1911                   }
1912 break;
1913 case 159:
1914 {
1915                         tmplreg[nlreg]->del_islev = yyvsp[-2].i;
1916                         tmplreg[nlreg]->delarea.x1 = current_region.x1;
1917                         tmplreg[nlreg]->delarea.y1 = current_region.y1;
1918                         tmplreg[nlreg]->delarea.x2 = current_region.x2;
1919                         tmplreg[nlreg]->delarea.y2 = current_region.y2;
1920                         tmplreg[nlreg]->rtype = LR_PORTAL;
1921                         tmplreg[nlreg]->rname.str = yyvsp[0].map;
1922                         nlreg++;
1923                         if (nlreg >= MAX_OF_TYPE) {
1924                                 yyerror("Too many levregions in mazepart!");
1925                                 nlreg--;
1926                         }
1927                   }
1928 break;
1929 case 160:
1930 {
1931                         tmplreg[nlreg] = New(lev_region);
1932                         tmplreg[nlreg]->in_islev = yyvsp[0].i;
1933                         tmplreg[nlreg]->inarea.x1 = current_region.x1;
1934                         tmplreg[nlreg]->inarea.y1 = current_region.y1;
1935                         tmplreg[nlreg]->inarea.x2 = current_region.x2;
1936                         tmplreg[nlreg]->inarea.y2 = current_region.y2;
1937                   }
1938 break;
1939 case 161:
1940 {
1941                         tmplreg[nlreg]->del_islev = yyvsp[0].i;
1942                         tmplreg[nlreg]->delarea.x1 = current_region.x1;
1943                         tmplreg[nlreg]->delarea.y1 = current_region.y1;
1944                         tmplreg[nlreg]->delarea.x2 = current_region.x2;
1945                         tmplreg[nlreg]->delarea.y2 = current_region.y2;
1946                   }
1947 break;
1948 case 162:
1949 {
1950                         switch(yyvsp[0].i) {
1951                         case -1: tmplreg[nlreg]->rtype = LR_TELE; break;
1952                         case 0: tmplreg[nlreg]->rtype = LR_DOWNTELE; break;
1953                         case 1: tmplreg[nlreg]->rtype = LR_UPTELE; break;
1954                         }
1955                         tmplreg[nlreg]->rname.str = 0;
1956                         nlreg++;
1957                         if (nlreg >= MAX_OF_TYPE) {
1958                                 yyerror("Too many levregions in mazepart!");
1959                                 nlreg--;
1960                         }
1961                   }
1962 break;
1963 case 163:
1964 {
1965                         tmplreg[nlreg] = New(lev_region);
1966                         tmplreg[nlreg]->in_islev = yyvsp[0].i;
1967                         tmplreg[nlreg]->inarea.x1 = current_region.x1;
1968                         tmplreg[nlreg]->inarea.y1 = current_region.y1;
1969                         tmplreg[nlreg]->inarea.x2 = current_region.x2;
1970                         tmplreg[nlreg]->inarea.y2 = current_region.y2;
1971                   }
1972 break;
1973 case 164:
1974 {
1975                         tmplreg[nlreg]->del_islev = yyvsp[0].i;
1976                         tmplreg[nlreg]->delarea.x1 = current_region.x1;
1977                         tmplreg[nlreg]->delarea.y1 = current_region.y1;
1978                         tmplreg[nlreg]->delarea.x2 = current_region.x2;
1979                         tmplreg[nlreg]->delarea.y2 = current_region.y2;
1980                         tmplreg[nlreg]->rtype = LR_BRANCH;
1981                         tmplreg[nlreg]->rname.str = 0;
1982                         nlreg++;
1983                         if (nlreg >= MAX_OF_TYPE) {
1984                                 yyerror("Too many levregions in mazepart!");
1985                                 nlreg--;
1986                         }
1987                   }
1988 break;
1989 case 165:
1990 {
1991                         yyval.i = -1;
1992                   }
1993 break;
1994 case 166:
1995 {
1996                         yyval.i = yyvsp[0].i;
1997                   }
1998 break;
1999 case 167:
2000 {
2001                         yyval.i = 0;
2002                   }
2003 break;
2004 case 168:
2005 {
2006 /* This series of if statements is a hack for MSC 5.1.  It seems that its
2007    tiny little brain cannot compile if these are all one big if statement. */
2008                         if (yyvsp[-7].i <= 0 || yyvsp[-7].i >= COLNO)
2009                                 yyerror("Region out of level range!");
2010                         else if (yyvsp[-5].i < 0 || yyvsp[-5].i >= ROWNO)
2011                                 yyerror("Region out of level range!");
2012                         else if (yyvsp[-3].i <= 0 || yyvsp[-3].i >= COLNO)
2013                                 yyerror("Region out of level range!");
2014                         else if (yyvsp[-1].i < 0 || yyvsp[-1].i >= ROWNO)
2015                                 yyerror("Region out of level range!");
2016                         current_region.x1 = yyvsp[-7].i;
2017                         current_region.y1 = yyvsp[-5].i;
2018                         current_region.x2 = yyvsp[-3].i;
2019                         current_region.y2 = yyvsp[-1].i;
2020                         yyval.i = 1;
2021                   }
2022 break;
2023 case 169:
2024 {
2025                         tmpfountain[nfountain] = New(fountain);
2026                         tmpfountain[nfountain]->x = current_coord.x;
2027                         tmpfountain[nfountain]->y = current_coord.y;
2028                         if (!in_room)
2029                             check_coord(current_coord.x, current_coord.y,
2030                                         "Fountain");
2031                         nfountain++;
2032                         if (nfountain >= MAX_OF_TYPE) {
2033                             yyerror("Too many fountains in room or mazepart!");
2034                             nfountain--;
2035                         }
2036                   }
2037 break;
2038 case 170:
2039 {
2040                         tmpsink[nsink] = New(sink);
2041                         tmpsink[nsink]->x = current_coord.x;
2042                         tmpsink[nsink]->y = current_coord.y;
2043                         nsink++;
2044                         if (nsink >= MAX_OF_TYPE) {
2045                                 yyerror("Too many sinks in room!");
2046                                 nsink--;
2047                         }
2048                   }
2049 break;
2050 case 171:
2051 {
2052                         tmppool[npool] = New(pool);
2053                         tmppool[npool]->x = current_coord.x;
2054                         tmppool[npool]->y = current_coord.y;
2055                         npool++;
2056                         if (npool >= MAX_OF_TYPE) {
2057                                 yyerror("Too many pools in room!");
2058                                 npool--;
2059                         }
2060                   }
2061 break;
2062 case 172:
2063 {
2064                         tmpdig[ndig] = New(digpos);
2065                         tmpdig[ndig]->x1 = current_region.x1;
2066                         tmpdig[ndig]->y1 = current_region.y1;
2067                         tmpdig[ndig]->x2 = current_region.x2;
2068                         tmpdig[ndig]->y2 = current_region.y2;
2069                         ndig++;
2070                         if (ndig >= MAX_OF_TYPE) {
2071                                 yyerror("Too many diggables in mazepart!");
2072                                 ndig--;
2073                         }
2074                   }
2075 break;
2076 case 173:
2077 {
2078                         tmppass[npass] = New(digpos);
2079                         tmppass[npass]->x1 = current_region.x1;
2080                         tmppass[npass]->y1 = current_region.y1;
2081                         tmppass[npass]->x2 = current_region.x2;
2082                         tmppass[npass]->y2 = current_region.y2;
2083                         npass++;
2084                         if (npass >= 32) {
2085                                 yyerror("Too many passwalls in mazepart!");
2086                                 npass--;
2087                         }
2088                   }
2089 break;
2090 case 174:
2091 {
2092                         tmpreg[nreg] = New(region);
2093                         tmpreg[nreg]->x1 = current_region.x1;
2094                         tmpreg[nreg]->y1 = current_region.y1;
2095                         tmpreg[nreg]->x2 = current_region.x2;
2096                         tmpreg[nreg]->y2 = current_region.y2;
2097                         tmpreg[nreg]->rlit = yyvsp[-3].i;
2098                         tmpreg[nreg]->rtype = yyvsp[-1].i;
2099                         if(yyvsp[0].i & 1) tmpreg[nreg]->rtype += MAXRTYPE+1;
2100                         tmpreg[nreg]->rirreg = ((yyvsp[0].i & 2) != 0);
2101                         if(current_region.x1 > current_region.x2 ||
2102                            current_region.y1 > current_region.y2)
2103                            yyerror("Region start > end!");
2104                         if(tmpreg[nreg]->rtype == VAULT &&
2105                            (tmpreg[nreg]->rirreg ||
2106                             (tmpreg[nreg]->x2 - tmpreg[nreg]->x1 != 1) ||
2107                             (tmpreg[nreg]->y2 - tmpreg[nreg]->y1 != 1)))
2108                                 yyerror("Vaults must be exactly 2x2!");
2109                         if(want_warnings && !tmpreg[nreg]->rirreg &&
2110                            current_region.x1 > 0 && current_region.y1 > 0 &&
2111                            current_region.x2 < (int)max_x_map &&
2112                            current_region.y2 < (int)max_y_map) {
2113                             /* check for walls in the room */
2114                             char ebuf[60];
2115                             register int x, y, nrock = 0;
2116
2117                             for(y=current_region.y1; y<=current_region.y2; y++)
2118                                 for(x=current_region.x1;
2119                                     x<=current_region.x2; x++)
2120                                     if(IS_ROCK(tmpmap[y][x]) ||
2121                                        IS_DOOR(tmpmap[y][x])) nrock++;
2122                             if(nrock) {
2123                                 Sprintf(ebuf,
2124                                         "Rock in room (%02d,%02d,%02d,%02d)?!",
2125                                         current_region.x1, current_region.y1,
2126                                         current_region.x2, current_region.y2);
2127                                 yywarning(ebuf);
2128                             }
2129                             if (
2130                 !IS_ROCK(tmpmap[current_region.y1-1][current_region.x1-1]) ||
2131                 !IS_ROCK(tmpmap[current_region.y2+1][current_region.x1-1]) ||
2132                 !IS_ROCK(tmpmap[current_region.y1-1][current_region.x2+1]) ||
2133                 !IS_ROCK(tmpmap[current_region.y2+1][current_region.x2+1])) {
2134                                 Sprintf(ebuf,
2135                                 "NonRock edge in room (%02d,%02d,%02d,%02d)?!",
2136                                         current_region.x1, current_region.y1,
2137                                         current_region.x2, current_region.y2);
2138                                 yywarning(ebuf);
2139                             }
2140                         } else if(tmpreg[nreg]->rirreg &&
2141                 !IS_ROOM(tmpmap[current_region.y1][current_region.x1])) {
2142                             char ebuf[60];
2143                             Sprintf(ebuf,
2144                                     "Rock in irregular room (%02d,%02d)?!",
2145                                     current_region.x1, current_region.y1);
2146                             yyerror(ebuf);
2147                         }
2148                         nreg++;
2149                         if (nreg >= MAX_OF_TYPE) {
2150                                 yyerror("Too many regions in mazepart!");
2151                                 nreg--;
2152                         }
2153                   }
2154 break;
2155 case 175:
2156 {
2157                         tmpaltar[naltar] = New(altar);
2158                         tmpaltar[naltar]->x = current_coord.x;
2159                         tmpaltar[naltar]->y = current_coord.y;
2160                         tmpaltar[naltar]->align = yyvsp[-2].i;
2161                         tmpaltar[naltar]->shrine = yyvsp[0].i;
2162                         if (!in_room)
2163                             check_coord(current_coord.x, current_coord.y,
2164                                         "Altar");
2165                         naltar++;
2166                         if (naltar >= MAX_OF_TYPE) {
2167                                 yyerror("Too many altars in room or mazepart!");
2168                                 naltar--;
2169                         }
2170                   }
2171 break;
2172 case 176:
2173 {
2174                         tmpgold[ngold] = New(gold);
2175                         tmpgold[ngold]->x = current_coord.x;
2176                         tmpgold[ngold]->y = current_coord.y;
2177                         tmpgold[ngold]->amount = yyvsp[-2].i;
2178                         if (!in_room)
2179                             check_coord(current_coord.x, current_coord.y,
2180                                         "Gold");
2181                         ngold++;
2182                         if (ngold >= MAX_OF_TYPE) {
2183                                 yyerror("Too many golds in room or mazepart!");
2184                                 ngold--;
2185                         }
2186                   }
2187 break;
2188 case 177:
2189 {
2190                         tmpengraving[nengraving] = New(engraving);
2191                         tmpengraving[nengraving]->x = current_coord.x;
2192                         tmpengraving[nengraving]->y = current_coord.y;
2193                         tmpengraving[nengraving]->engr.str = yyvsp[0].map;
2194                         tmpengraving[nengraving]->etype = yyvsp[-2].i;
2195                         if (!in_room)
2196                             check_coord(current_coord.x, current_coord.y,
2197                                         "Engraving");
2198                         nengraving++;
2199                         if (nengraving >= MAX_OF_TYPE) {
2200                             yyerror("Too many engravings in room or mazepart!");
2201                             nengraving--;
2202                         }
2203                   }
2204 break;
2205 case 179:
2206 {
2207                         yyval.i = - MAX_REGISTERS - 1;
2208                   }
2209 break;
2210 case 182:
2211 {
2212                         yyval.i = - MAX_REGISTERS - 1;
2213                   }
2214 break;
2215 case 185:
2216 {
2217                         yyval.map = (char *) 0;
2218                   }
2219 break;
2220 case 187:
2221 {
2222                         yyval.map = (char *) 0;
2223                   }
2224 break;
2225 case 188:
2226 {
2227                         int token = get_trap_type(yyvsp[0].map);
2228                         if (token == ERR)
2229                                 yyerror("Unknown trap type!");
2230                         yyval.i = token;
2231                         Free(yyvsp[0].map);
2232                   }
2233 break;
2234 case 190:
2235 {
2236                         int token = get_room_type(yyvsp[0].map);
2237                         if (token == ERR) {
2238                                 yywarning("Unknown room type!  Making ordinary room...");
2239                                 yyval.i = OROOM;
2240                         } else
2241                                 yyval.i = token;
2242                         Free(yyvsp[0].map);
2243                   }
2244 break;
2245 case 192:
2246 {
2247                         yyval.i = 0;
2248                   }
2249 break;
2250 case 193:
2251 {
2252                         yyval.i = yyvsp[0].i;
2253                   }
2254 break;
2255 case 194:
2256 {
2257                         yyval.i = yyvsp[-2].i + (yyvsp[0].i << 1);
2258                   }
2259 break;
2260 case 197:
2261 {
2262                         current_coord.x = current_coord.y = -MAX_REGISTERS-1;
2263                   }
2264 break;
2265 case 204:
2266 {
2267                         yyval.i = - MAX_REGISTERS - 1;
2268                   }
2269 break;
2270 case 207:
2271 {
2272                         if ( yyvsp[-1].i >= MAX_REGISTERS )
2273                                 yyerror("Register Index overflow!");
2274                         else
2275                                 current_coord.x = current_coord.y = - yyvsp[-1].i - 1;
2276                   }
2277 break;
2278 case 208:
2279 {
2280                         if ( yyvsp[-1].i >= MAX_REGISTERS )
2281                                 yyerror("Register Index overflow!");
2282                         else
2283                                 yyval.i = - yyvsp[-1].i - 1;
2284                   }
2285 break;
2286 case 209:
2287 {
2288                         if ( yyvsp[-1].i >= MAX_REGISTERS )
2289                                 yyerror("Register Index overflow!");
2290                         else
2291                                 yyval.i = - yyvsp[-1].i - 1;
2292                   }
2293 break;
2294 case 210:
2295 {
2296                         if ( yyvsp[-1].i >= 3 )
2297                                 yyerror("Register Index overflow!");
2298                         else
2299                                 yyval.i = - yyvsp[-1].i - 1;
2300                   }
2301 break;
2302 case 212:
2303 {
2304                         if (check_monster_char((char) yyvsp[0].i))
2305                                 yyval.i = yyvsp[0].i ;
2306                         else {
2307                                 yyerror("Unknown monster class!");
2308                                 yyval.i = ERR;
2309                         }
2310                   }
2311 break;
2312 case 213:
2313 {
2314                         char c = yyvsp[0].i;
2315                         if (check_object_char(c))
2316                                 yyval.i = c;
2317                         else {
2318                                 yyerror("Unknown char class!");
2319                                 yyval.i = ERR;
2320                         }
2321                   }
2322 break;
2323 case 217:
2324 {
2325                         yyval.i = 100;  /* default is 100% */
2326                   }
2327 break;
2328 case 218:
2329 {
2330                         if (yyvsp[0].i <= 0 || yyvsp[0].i > 100)
2331                             yyerror("Expected percentile chance.");
2332                         yyval.i = yyvsp[0].i;
2333                   }
2334 break;
2335 case 221:
2336 {
2337                         if (!in_room && !init_lev.init_present &&
2338                             (yyvsp[-3].i < 0 || yyvsp[-3].i > (int)max_x_map ||
2339                              yyvsp[-1].i < 0 || yyvsp[-1].i > (int)max_y_map))
2340                             yyerror("Coordinates out of map range!");
2341                         current_coord.x = yyvsp[-3].i;
2342                         current_coord.y = yyvsp[-1].i;
2343                   }
2344 break;
2345 case 222:
2346 {
2347 /* This series of if statements is a hack for MSC 5.1.  It seems that its
2348    tiny little brain cannot compile if these are all one big if statement. */
2349                         if (yyvsp[-7].i < 0 || yyvsp[-7].i > (int)max_x_map)
2350                                 yyerror("Region out of map range!");
2351                         else if (yyvsp[-5].i < 0 || yyvsp[-5].i > (int)max_y_map)
2352                                 yyerror("Region out of map range!");
2353                         else if (yyvsp[-3].i < 0 || yyvsp[-3].i > (int)max_x_map)
2354                                 yyerror("Region out of map range!");
2355                         else if (yyvsp[-1].i < 0 || yyvsp[-1].i > (int)max_y_map)
2356                                 yyerror("Region out of map range!");
2357                         current_region.x1 = yyvsp[-7].i;
2358                         current_region.y1 = yyvsp[-5].i;
2359                         current_region.x2 = yyvsp[-3].i;
2360                         current_region.y2 = yyvsp[-1].i;
2361                   }
2362 break;
2363     }
2364     yyssp -= yym;
2365     yystate = *yyssp;
2366     yyvsp -= yym;
2367     yym = yylhs[yyn];
2368     if (yystate == 0 && yym == 0)
2369     {
2370 #if YYDEBUG
2371         if (yydebug)
2372             printf("%sdebug: after reduction, shifting from state 0 to\
2373  state %d\n", YYPREFIX, YYFINAL);
2374 #endif
2375         yystate = YYFINAL;
2376         *++yyssp = YYFINAL;
2377         *++yyvsp = yyval;
2378         if (yychar < 0)
2379         {
2380             if ((yychar = yylex()) < 0) yychar = 0;
2381 #if YYDEBUG
2382             if (yydebug)
2383             {
2384                 yys = 0;
2385                 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
2386                 if (!yys) yys = "illegal-symbol";
2387                 printf("%sdebug: state %d, reading %d (%s)\n",
2388                         YYPREFIX, YYFINAL, yychar, yys);
2389             }
2390 #endif
2391         }
2392         if (yychar == 0) goto yyaccept;
2393         goto yyloop;
2394     }
2395     if ((yyn = yygindex[yym]) != 0 && (yyn += yystate) >= 0 &&
2396             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
2397         yystate = yytable[yyn];
2398     else
2399         yystate = yydgoto[yym];
2400 #if YYDEBUG
2401     if (yydebug)
2402         printf("%sdebug: after reduction, shifting from state %d \
2403 to state %d\n", YYPREFIX, *yyssp, yystate);
2404 #endif
2405     if (yyssp >= yyss + yystacksize - 1)
2406     {
2407         goto yyoverflow;
2408     }
2409     *++yyssp = yystate;
2410     *++yyvsp = yyval;
2411     goto yyloop;
2412 yyoverflow:
2413     yyerror("yacc stack overflow");
2414 yyabort:
2415     return (1);
2416 yyaccept:
2417     return (0);
2418 }