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
yyparse()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 }
2419