1 /* NetHack 3.6 sp_lev.h $NHDT-Date: 1524287214 2018/04/21 05:06:54 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.23 $ */
2 /* Copyright (c) 1989 by Jean-Christophe Collet */
3 /* NetHack may be freely redistributed. See license for details. */
13 #define W_ANY (W_NORTH | W_SOUTH | W_EAST | W_WEST)
20 #define NOTELEPORT 0x00000001L
21 #define HARDFLOOR 0x00000002L
22 #define NOMMAP 0x00000004L
23 #define SHORTSIGHTED 0x00000008L
24 #define ARBOREAL 0x00000010L
25 #define MAZELEVEL 0x00000020L
26 #define PREMAPPED 0x00000040L /* premapped level & sokoban rules */
27 #define SHROUD 0x00000080L
28 #define GRAVEYARD 0x00000100L
29 #define ICEDPOOLS 0x00000200L /* for ice locations: ICED_POOL vs ICED_MOAT \
31 #define SOLIDIFY 0x00000400L /* outer areas are nondiggable & nonpasswall */
32 #define CORRMAZE 0x00000800L /* for maze levels only */
33 #define CHECK_INACCESSIBLES 0x00001000L /* check for inaccessible areas and
34 generate ways to escape from them */
36 /* different level layout initializers */
45 /* max. layers of object containment */
46 #define MAX_CONTAINMENT 10
48 /* max. # of random registers */
49 #define MAX_REGISTERS 10
51 /* max. nested depth of subrooms */
52 #define MAX_NESTED_ROOMS 5
54 /* max. # of opcodes per special level */
55 #define SPCODER_MAX_RUNTIME 65536
57 /* Opcodes for creating the level
58 * If you change these, also change opcodestr[] in util/lev_main.c
121 SPO_VAR_INIT, /* variable_name data */
142 /* MONSTER and OBJECT can take a variable number of parameters,
143 * they also pop different # of values from the stack. So,
144 * first we pop a value that tells what the _next_ value will
148 enum sp_mon_var_flags {
170 enum sp_obj_var_flags {
190 /* When creating objects, we need to know whether
191 * it's a container and/or contents.
193 #define SP_OBJ_CONTENT 0x1
194 #define SP_OBJ_CONTAINER 0x2
196 /* SPO_FILTER types */
197 #define SPOFILTER_PERCENT 0
198 #define SPOFILTER_SELECTION 1
199 #define SPOFILTER_MAPCHAR 2
201 /* gradient filter types */
202 #define SEL_GRADIENT_RADIAL 0
203 #define SEL_GRADIENT_SQUARE 1
206 #define SPOVAR_NULL 0x00
207 #define SPOVAR_INT 0x01 /* l */
208 #define SPOVAR_STRING 0x02 /* str */
209 #define SPOVAR_VARIABLE 0x03 /* str (contains the variable name) */
210 #define SPOVAR_COORD \
211 0x04 /* coordinate, encoded in l; use SP_COORD_X() and SP_COORD_Y() */
212 #define SPOVAR_REGION 0x05 /* region, encoded in l; use SP_REGION_X1() etc \
214 #define SPOVAR_MAPCHAR 0x06 /* map char, in l */
215 #define SPOVAR_MONST \
216 0x07 /* monster class & specific monster, encoded in l; use SP_MONST_... \
219 0x08 /* object class & specific object type, encoded in l; use \
221 #define SPOVAR_SEL 0x09 /* selection. char[COLNO][ROWNO] in str */
222 #define SPOVAR_ARRAY 0x40 /* used in splev_var & lc_vardefs, not in opvar */
224 #define SP_COORD_IS_RANDOM 0x01000000
225 /* Humidity flags for get_location() and friends, used with
226 * SP_COORD_PACK_RANDOM() */
231 #define ANY_LOC 0x10 /* even outside the level */
232 #define NO_LOC_WARN 0x20 /* no complaints and set x & y to -1, if no loc */
233 #define SPACELOC 0x40 /* like DRY, but accepts furniture too */
235 #define SP_COORD_X(l) (l & 0xff)
236 #define SP_COORD_Y(l) ((l >> 16) & 0xff)
237 #define SP_COORD_PACK(x, y) (((x) & 0xff) + (((y) & 0xff) << 16))
238 #define SP_COORD_PACK_RANDOM(f) (SP_COORD_IS_RANDOM | (f))
240 #define SP_REGION_X1(l) (l & 0xff)
241 #define SP_REGION_Y1(l) ((l >> 8) & 0xff)
242 #define SP_REGION_X2(l) ((l >> 16) & 0xff)
243 #define SP_REGION_Y2(l) ((l >> 24) & 0xff)
244 #define SP_REGION_PACK(x1, y1, x2, y2) \
245 (((x1) & 0xff) + (((y1) & 0xff) << 8) + (((x2) & 0xff) << 16) \
246 + (((y2) & 0xff) << 24))
248 /* permonst index, object index, and lit value might be negative;
249 * add 10 to accept -1 through -9 while forcing non-negative for bit shift
251 #define SP_MONST_CLASS(l) ((l) & 0xff)
252 #define SP_MONST_PM(l) ((((l) >> 8) & 0xffff) - 10)
253 #define SP_MONST_PACK(pm, cls) (((10 + (pm)) << 8) | ((cls) & 0xff))
255 #define SP_OBJ_CLASS(l) ((l) & 0xff)
256 #define SP_OBJ_TYP(l) ((((l) >> 8) & 0xffff) - 10)
257 #define SP_OBJ_PACK(ob, cls) (((10 + (ob)) << 8) | ((cls) & 0xff))
259 #define SP_MAPCHAR_TYP(l) ((l) & 0xff)
260 #define SP_MAPCHAR_LIT(l) ((((l) >> 8) & 0xffff) - 10)
261 #define SP_MAPCHAR_PACK(typ, lit) (((10 + (lit)) << 8) | ((typ) & 0xff))
264 struct splev_var *next;
266 xchar svtyp; /* SPOVAR_foo */
269 struct opvar **arrayvalues;
277 struct opvar **stackdata;
281 struct sp_frame *next;
282 struct splevstack *stack;
283 struct splev_var *variables;
288 struct splevstack *stack;
289 struct sp_frame *frame;
292 struct mkroom *croom;
293 struct mkroom *tmproomlist[MAX_NESTED_ROOMS + 1];
294 boolean failed_room[MAX_NESTED_ROOMS + 1];
298 boolean check_inaccessibles;
300 int opcode; /* current opcode */
301 struct opvar *opdat; /* current push data (req. opcode == SPO_PUSH) */
304 /* special level coder CPU flags */
305 #define SP_CPUFLAG_LT 1
306 #define SP_CPUFLAG_GT 2
307 #define SP_CPUFLAG_EQ 4
308 #define SP_CPUFLAG_ZERO 8
311 * Structures manipulated by the special levels loader & compiler
314 #define packed_coord long
330 typedef union str_or_len {
336 xchar init_style; /* one of LVLINIT_foo */
339 boolean init_present, padding;
341 boolean smoothed, joined;
347 xchar wall, pos, secret, mask;
356 Str_or_Len name, appear_as;
360 xchar x, y, class, appear;
361 schar peaceful, asleep;
362 short female, invis, cancelled, revived, avenge, fleeing, blinded,
363 paralyzed, stunned, confused;
373 xchar x, y, class, containment;
378 short eroded, locked, trapped, recharged, invis, greased, broken;
389 xchar x1, y1, x2, y2;
390 xchar rtype, rlit, rirreg;
399 xchar x1, y1, x2, y2;
400 xchar fromter, toter, tolit;
403 /* values for rtype are defined in dungeon.h */
406 xchar x1, y1, x2, y2;
409 xchar x1, y1, x2, y2;
411 boolean in_islev, del_islev;
412 xchar rtype, padding;
424 typedef struct _room {
428 xchar xalign, yalign;
429 xchar rtype, chance, rlit, filled, joined;
435 schar halign, valign;
451 xchar x, y, direction, count, lit;
455 /* only used by lev_comp */
456 struct lc_funcdefs_parm {
459 struct lc_funcdefs_parm *next;
463 struct lc_funcdefs *next;
468 struct lc_funcdefs_parm *params;
473 struct lc_vardefs *next;
475 long var_type; /* SPOVAR_foo */
480 struct lc_breakdef *next;
481 struct opvar *breakpoint;
486 * Quick! Avert your eyes while you still have a chance!
489 /* compiling lev_comp rather than nethack */
492 typedef const char *vA;
495 #undef VA_ARGS /* redefine with the maximum number actually used */
496 #undef VA_SHIFT /* ditto */
499 arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, \
501 /* Unlike in the core, lev_comp's VA_SHIFT should be completely safe,
502 because callers always pass all these arguments. */
504 (arg1 = arg2, arg2 = arg3, arg3 = arg4, arg4 = arg5, arg5 = arg6, \
505 arg6 = arg7, arg7 = arg8, arg8 = arg9, arg9 = arg10, arg10 = arg11, \
506 arg11 = arg12, arg12 = arg13, arg13 = arg14, arg14 = 0)
507 /* standard NULL may be either (void *)0 or plain 0, both of
508 which would need to be explicitly cast to (char *) here */
509 #define VA_PASS1(a1) \
510 (vA) a1, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, \
511 (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0
512 #define VA_PASS2(a1, a2) \
513 (vA) a1, (vA) a2, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, \
514 (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0
515 #define VA_PASS3(a1, a2, a3) \
516 (vA) a1, (vA) a2, (vA) a3, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, \
517 (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0
518 #define VA_PASS4(a1, a2, a3, a4) \
519 (vA) a1, (vA) a2, (vA) a3, (vA) a4, (vA) 0, (vA) 0, (vA) 0, (vA) 0, \
520 (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0
521 #define VA_PASS5(a1, a2, a3, a4, a5) \
522 (vA) a1, (vA) a2, (vA) a3, (vA) a4, (vA) a5, (vA) 0, (vA) 0, (vA) 0, \
523 (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0
524 #define VA_PASS7(a1, a2, a3, a4, a5, a6, a7) \
525 (vA) a1, (vA) a2, (vA) a3, (vA) a4, (vA) a5, (vA) a6, (vA) a7, (vA) 0, \
526 (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0
527 #define VA_PASS8(a1, a2, a3, a4, a5, a6, a7, a8) \
528 (vA) a1, (vA) a2, (vA) a3, (vA) a4, (vA) a5, (vA) a6, (vA) a7, (vA) a8, \
529 (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0
530 #define VA_PASS9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
531 (vA) a1, (vA) a2, (vA) a3, (vA) a4, (vA) a5, (vA) a6, (vA) a7, (vA) a8, \
532 (vA) a9, (vA) 0, (vA) 0, (vA) 0, (vA) 0, (vA) 0
533 #define VA_PASS14(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, \
535 (vA) a1, (vA) a2, (vA) a3, (vA) a4, (vA) a5, (vA) a6, (vA) a7, (vA) a8, \
536 (vA) a9, (vA) a10, (vA) a11, (vA) a12, (vA) a13, (vA) a14
537 #else /*!USE_OLDARGS*/
538 /* USE_STDARG and USE_VARARGS don't need to pass dummy arguments
540 #define VA_PASS1(a1) a1
541 #define VA_PASS2(a1, a2) a1, a2
542 #define VA_PASS3(a1, a2, a3) a1, a2, a3
543 #define VA_PASS4(a1, a2, a3, a4) a1, a2, a3, a4
544 #define VA_PASS5(a1, a2, a3, a4, a5) a1, a2, a3, a4, a5
545 #define VA_PASS7(a1, a2, a3, a4, a5, a6, a7) a1, a2, a3, a4, a5, a6, a7
546 #define VA_PASS8(a1, a2, a3, a4, a5, a6, a7, a8) \
547 a1, a2, a3, a4, a5, a6, a7, a8
548 #define VA_PASS9(a1, a2, a3, a4, a5, a6, a7, a8, a9) \
549 a1, a2, a3, a4, a5, a6, a7, a8, a9
550 #define VA_PASS14(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, \
552 a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14
553 #endif /*?USE_OLDARGS*/
554 /* You were warned to avert your eyes.... */
557 #endif /* SP_LEV_H */