Wikihack
Advertisement

Below is the full text to rm.h from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/rm.h#line123]], for example.

The latest source code for vanilla NetHack is at Source code.


The NetHack General Public License applies to screenshots, source code and other content from NetHack.
1.    /*	SCCS Id: @(#)rm.h	3.4	1999/12/12	*/
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
5.    #ifndef RM_H
6.    #define RM_H
7.    
8.    /*
9.     * The dungeon presentation graphics code and data structures were rewritten
10.    * and generalized for NetHack's release 2 by Eric S. Raymond (eric@snark)
11.    * building on Don G. Kneller's MS-DOS implementation.	See drawing.c for
12.    * the code that permits the user to set the contents of the symbol structure.
13.    *
14.    * The door representation was changed by Ari Huttunen(ahuttune@niksula.hut.fi)
15.    */
16.   
17.   /*
18.    * TLCORNER	TDWALL		TRCORNER
19.    * +-		-+-		-+
20.    * |		 |		 |
21.    *
22.    * TRWALL	CROSSWALL	TLWALL		HWALL
23.    * |		 |		 |
24.    * +-		-+-		-+		---
25.    * |		 |		 |
26.    *
27.    * BLCORNER	TUWALL		BRCORNER	VWALL
28.    * |		 |		 |		|
29.    * +-		-+-		-+		|
30.    */
31.   
32.   /* Level location types */
33.   #define STONE		0
34.   #define VWALL		1
35.   #define HWALL		2
36.   #define TLCORNER	3
37.   #define TRCORNER	4
38.   #define BLCORNER	5
39.   #define BRCORNER	6
40.   #define CROSSWALL	7	/* For pretty mazes and special levels */
41.   #define TUWALL		8
42.   #define TDWALL		9
43.   #define TLWALL		10
44.   #define TRWALL		11
45.   #define DBWALL		12
46.   #define TREE		13	/* Added by KMH */
47.   #define SDOOR		14
48.   #define SCORR		15
49.   #define POOL		16
50.   #define MOAT		17	/* pool that doesn't boil, adjust messages */
51.   #define WATER		18
52.   #define DRAWBRIDGE_UP	19
53.   #define LAVAPOOL	20
54.   #define IRONBARS		21	/* Added by KMH */
55.   #define DOOR		22
56.   #define CORR		23
57.   #define ROOM		24
58.   #define STAIRS		25
59.   #define LADDER		26
60.   #define FOUNTAIN	27
61.   #define THRONE		28
62.   #define SINK		29
63.   #define TOILET          30
64.   #define GRAVE           31
65.   #define ALTAR           32
66.   #define ICE             33
67.   #define DRAWBRIDGE_DOWN 34
68.   #define AIR             35
69.   #define CLOUD           36
70.   
71.   #define MAX_TYPE		37
72.   #define INVALID_TYPE	127
73.   
74.   /*
75.    * Avoid using the level types in inequalities:
76.    * these types are subject to change.
77.    * Instead, use one of the macros below.
78.    */
79.   #define IS_WALL(typ)	((typ) && (typ) <= DBWALL)
80.   #define IS_STWALL(typ)	((typ) <= DBWALL)	/* STONE <= (typ) <= DBWALL */
81.   #define IS_ROCK(typ)	((typ) < POOL)		/* absolutely nonaccessible */
82.   #define IS_DOOR(typ)	((typ) == DOOR)
83.   #define IS_TREE(typ)	((typ) == TREE || \
84.   			(level.flags.arboreal && (typ) == STONE))
85.   #define ACCESSIBLE(typ) ((typ) >= DOOR)		/* good position */
86.   #define IS_ROOM(typ)	((typ) >= ROOM)		/* ROOM, STAIRS, furniture.. */
87.   #define ZAP_POS(typ)	((typ) >= POOL)
88.   #define IS_GRAVE(typ)	((typ) == GRAVE)
89.   #define SPACE_POS(typ)	((typ) > DOOR)
90.   #define IS_POOL(typ)	((typ) >= POOL && (typ) <= DRAWBRIDGE_UP)
91.   #define IS_THRONE(typ)	((typ) == THRONE)
92.   #define IS_FOUNTAIN(typ) ((typ) == FOUNTAIN)
93.   #define IS_SINK(typ)	((typ) == SINK)
94.   #define IS_TOILET(typ)  ((typ) == TOILET)
95.   #define IS_GRAVE(typ)	((typ) == GRAVE)
96.   #define IS_ALTAR(typ)	((typ) == ALTAR)
97.   #define IS_DRAWBRIDGE(typ) ((typ) == DRAWBRIDGE_UP || (typ) == DRAWBRIDGE_DOWN)
98.   #define IS_FURNITURE(typ) ((typ) >= STAIRS && (typ) <= ALTAR)
99.   #define IS_AIR(typ)	((typ) == AIR || (typ) == CLOUD)
100.  #define IS_SOFT(typ)	((typ) == AIR || (typ) == CLOUD || IS_POOL(typ))
101.  
102.  /*
103.   * The screen symbols may be the default or defined at game startup time.
104.   * See drawing.c for defaults.
105.   * Note: {ibm|dec}_graphics[] arrays (also in drawing.c) must be kept in synch.
106.   */
107.  
108.  /* begin dungeon characters */
109.  
110.  #define S_stone		0
111.  #define S_vwall		1
112.  #define S_hwall		2
113.  #define S_tlcorn	3
114.  #define S_trcorn	4
115.  #define S_blcorn	5
116.  #define S_brcorn	6
117.  #define S_crwall	7
118.  #define S_tuwall	8
119.  #define S_tdwall	9
120.  #define S_tlwall	10
121.  #define S_trwall	11
122.  #define S_ndoor		12
123.  #define S_vodoor	13
124.  #define S_hodoor	14
125.  #define S_vcdoor	15	/* closed door, vertical wall */
126.  #define S_hcdoor	16	/* closed door, horizontal wall */
127.  #define S_bars		17	/* Added by KMH */
128.  #define S_tree		18	/* Added by KMH */
129.  #define S_room		19
130.  #define S_corr		20
131.  #define S_litcorr	21
132.  #define S_upstair	22
133.  #define S_dnstair	23
134.  #define S_upladder	24
135.  #define S_dnladder	25
136.  #define S_altar		26
137.  #define S_grave		27
138.  #define S_throne	28
139.  #define S_sink		29
140.  #define S_toilet	30
141.  #define S_fountain	31
142.  #define S_pool		32
143.  #define S_ice		33
144.  #define S_lava		34
145.  #define S_vodbridge	35
146.  #define S_hodbridge	36
147.  #define S_vcdbridge	37	/* closed drawbridge, vertical wall */
148.  #define S_hcdbridge	38	/* closed drawbridge, horizontal wall */
149.  #define S_air		39
150.  #define S_cloud		40
151.  #define S_water		41
152.  
153.  /* end dungeon characters, begin traps */
154.  
155.  #define S_arrow_trap		42
156.  #define S_dart_trap		43
157.  #define S_falling_rock_trap	44
158.  #define S_squeaky_board		45
159.  #define S_bear_trap		46
160.  #define S_land_mine		47
161.  #define S_rolling_boulder_trap	48
162.  #define S_sleeping_gas_trap	49
163.  #define S_rust_trap		50
164.  #define S_fire_trap		51
165.  #define S_pit			52
166.  #define S_spiked_pit		53
167.  #define S_hole			54
168.  #define S_trap_door		55
169.  #define S_teleportation_trap	56
170.  #define S_level_teleporter	57
171.  #define S_magic_portal		58
172.  #define S_web			59
173.  #define S_statue_trap		60
174.  #define S_magic_trap		61
175.  #define S_anti_magic_trap	62
176.  #define S_polymorph_trap	63
177.  
178.  /* end traps, begin special effects */
179.  
180.  #define S_vbeam		64	/* The 4 zap beam symbols.  Do NOT separate. */
181.  #define S_hbeam		65	/* To change order or add, see function     */
182.  #define S_lslant	66	/* zapdir_to_glyph() in display.c.	    */
183.  #define S_rslant	67
184.  #define S_digbeam	68	/* dig beam symbol */
185.  #define S_flashbeam	69	/* camera flash symbol */
186.  #define S_boomleft	70	/* thrown boomerang, open left, e.g ')'    */
187.  #define S_boomright	71	/* thrown boomerand, open right, e.g. '('  */
188.  #define S_ss1		72	/* 4 magic shield glyphs */
189.  #define S_ss2		73
190.  #define S_ss3		74
191.  #define S_ss4		75
192.  
193.  /* The 8 swallow symbols.  Do NOT separate.  To change order or add, see */
194.  /* the function swallow_to_glyph() in display.c.			 */
195.  #define S_sw_tl		76	/* swallow top left [1]			*/
196.  #define S_sw_tc		77	/* swallow top center [2]	Order:	*/
197.  #define S_sw_tr		78	/* swallow top right [3]		*/
198.  #define S_sw_ml		79	/* swallow middle left [4]	1 2 3	*/
199.  #define S_sw_mr		80	/* swallow middle right [6]	4 5 6	*/
200.  #define S_sw_bl		81	/* swallow bottom left [7]	7 8 9	*/
201.  #define S_sw_bc		82	/* swallow bottom center [8]		*/
202.  #define S_sw_br		83	/* swallow bottom right [9]		*/
203.  
204.  #define S_explode1	84	/* explosion top left			*/
205.  #define S_explode2	85	/* explosion top center			*/
206.  #define S_explode3	86	/* explosion top right		 Ex.	*/
207.  #define S_explode4	87	/* explosion middle left		*/
208.  #define S_explode5	88	/* explosion middle center	 /-\	*/
209.  #define S_explode6	89	/* explosion middle right	 |@|	*/
210.  #define S_explode7	90	/* explosion bottom left	 \-/	*/
211.  #define S_explode8	91	/* explosion bottom center		*/
212.  #define S_explode9	92	/* explosion bottom right		*/
213.    
214.  /* end effects */
215.    
216.  #define MAXPCHARS	93	/* maximum number of mapped characters */
217.  #define MAXDCHARS	42	/* maximum of mapped dungeon characters */
218.  #define MAXTCHARS	22	/* maximum of mapped trap characters */
219.  #define MAXECHARS       29      /* maximum of mapped effects characters */
220.  #define MAXEXPCHARS	9	/* number of explosion characters */
221.  
222.  struct symdef {
223.      uchar sym;
224.      const char	*explanation;
225.  #ifdef TEXTCOLOR
226.      uchar color;
227.  #endif
228.  };
229.  
230.  extern const struct symdef defsyms[MAXPCHARS];	/* defaults */
231.  extern uchar showsyms[MAXPCHARS];
232.  extern const struct symdef def_warnsyms[WARNCOUNT];
233.  
234.  /*
235.   * Graphics sets for display symbols
236.   */
237.  #define ASCII_GRAPHICS	0	/* regular characters: '-', '+', &c */
238.  #define IBM_GRAPHICS	1	/* PC graphic characters */
239.  #define DEC_GRAPHICS	2	/* VT100 line drawing characters */
240.  #define MAC_GRAPHICS	3	/* Macintosh drawing characters */
241.  
242.  /*
243.   * The 5 possible states of doors
244.   */
245.  
246.  #define D_NODOOR	0
247.  #define D_BROKEN	1
248.  #define D_ISOPEN	2
249.  #define D_CLOSED	4
250.  #define D_LOCKED	8
251.  #define D_TRAPPED	16
252.  
253.  /*
254.   * Some altars are considered as shrines, so we need a flag.
255.   */
256.  #define AM_SHRINE	8
257.  
258.  /*
259.   * Thrones should only be looted once.
260.   */
261.  #define T_LOOTED	1
262.  
263.  /*
264.   * Trees have more than one kick result.
265.   */
266.  #define TREE_LOOTED	1
267.  #define TREE_SWARM	2
268.  
269.  /*
270.   * Fountains have limits, and special warnings.
271.   */
272.  #define F_LOOTED	1
273.  #define F_WARNED	2
274.  #define FOUNTAIN_IS_WARNED(x,y)		(levl[x][y].looted & F_WARNED)
275.  #define FOUNTAIN_IS_LOOTED(x,y)		(levl[x][y].looted & F_LOOTED)
276.  #define SET_FOUNTAIN_WARNED(x,y)	levl[x][y].looted |= F_WARNED;
277.  #define SET_FOUNTAIN_LOOTED(x,y)	levl[x][y].looted |= F_LOOTED;
278.  #define CLEAR_FOUNTAIN_WARNED(x,y)	levl[x][y].looted &= ~F_WARNED;
279.  #define CLEAR_FOUNTAIN_LOOTED(x,y)	levl[x][y].looted &= ~F_LOOTED;
280.  
281.  /*
282.   * Doors are even worse :-) The special warning has a side effect
283.   * of instantly trapping the door, and if it was defined as trapped,
284.   * the guards consider that you have already been warned!
285.   */
286.  #define D_WARNED	16
287.  
288.  /*
289.   * Sinks have 3 different types of loot that shouldn't be abused
290.   */
291.  #define S_LPUDDING	1
292.  #define S_LDWASHER	2
293.  #define S_LRING		4
294.  
295.  /*
296.   * The four directions for a DrawBridge.
297.   */
298.  #define DB_NORTH	0
299.  #define DB_SOUTH	1
300.  #define DB_EAST		2
301.  #define DB_WEST		3
302.  #define DB_DIR		3	/* mask for direction */
303.  
304.  /*
305.   * What's under a drawbridge.
306.   */
307.  #define DB_MOAT		0
308.  #define DB_LAVA		4
309.  #define DB_ICE		8
310.  #define DB_FLOOR	16
311.  #define DB_UNDER	28	/* mask for underneath */
312.  
313.  /*
314.   * Wall information.
315.   */
316.  #define WM_MASK		0x07	/* wall mode (bottom three bits) */
317.  #define W_NONDIGGABLE	0x08
318.  #define W_NONPASSWALL	0x10
319.  
320.  /*
321.   * Ladders (in Vlad's tower) may be up or down.
322.   */
323.  #define LA_UP		1
324.  #define LA_DOWN		2
325.  
326.  /*
327.   * Room areas may be iced pools
328.   */
329.  #define ICED_POOL	8
330.  #define ICED_MOAT	16
331.  
332.  /*
333.   * The structure describing a coordinate position.
334.   * Before adding fields, remember that this will significantly affect
335.   * the size of temporary files and save files.
336.   */
337.  struct rm {
338.  #ifdef DISPLAY_LAYERS
339.  	Bitfield(mem_bg,6);	/* Remembered background */
340.  	Bitfield(mem_trap,5);	/* Remembered trap */
341.  	Bitfield(mem_obj,10);	/* Remembered object/corpse */
342.  	Bitfield(mem_corpse,1);	/* Set if mem_obj refers to a corpse */
343.  	Bitfield(mem_invis,1);	/* Set if invisible monster remembered */
344.  	Bitfield(mem_spare,9);
345.  #else
346.  	int glyph;		/* what the hero thinks is there */
347.  #endif
348.  	schar typ;		/* what is really there */
349.  	uchar seenv;		/* seen vector */
350.  	Bitfield(flags,5);	/* extra information for typ */
351.  	Bitfield(horizontal,1); /* wall/door/etc is horiz. (more typ info) */
352.  	Bitfield(lit,1);	/* speed hack for lit rooms */
353.  	Bitfield(waslit,1);	/* remember if a location was lit */
354.  	Bitfield(roomno,6);	/* room # for special rooms */
355.  	Bitfield(edge,1);	/* marks boundaries for special rooms*/
356.  };
357.  
358.  /*
359.   * Add wall angle viewing by defining "modes" for each wall type.  Each
360.   * mode describes which parts of a wall are finished (seen as as wall)
361.   * and which are unfinished (seen as rock).
362.   *
363.   * We use the bottom 3 bits of the flags field for the mode.  This comes
364.   * in conflict with secret doors, but we avoid problems because until
365.   * a secret door becomes discovered, we know what sdoor's bottom three
366.   * bits are.
367.   *
368.   * The following should cover all of the cases.
369.   *
370.   *	type	mode				Examples: R=rock, F=finished
371.   *	-----	----				----------------------------
372.   *	WALL:	0 none				hwall, mode 1
373.   *		1 left/top (1/2 rock)			RRR
374.   *		2 right/bottom (1/2 rock)		---
375.   *							FFF
376.   *
377.   *	CORNER: 0 none				trcorn, mode 2
378.   *		1 outer (3/4 rock)			FFF
379.   *		2 inner (1/4 rock)			F+-
380.   *							F|R
381.   *
382.   *	TWALL:	0 none				tlwall, mode 3
383.   *		1 long edge (1/2 rock)			F|F
384.   *		2 bottom left (on a tdwall)		-+F
385.   *		3 bottom right (on a tdwall)		R|F
386.   *
387.   *	CRWALL: 0 none				crwall, mode 5
388.   *		1 top left (1/4 rock)			R|F
389.   *		2 top right (1/4 rock)			-+-
390.   *		3 bottom left (1/4 rock)		F|R
391.   *		4 bottom right (1/4 rock)
392.   *		5 top left & bottom right (1/2 rock)
393.   *		6 bottom left & top right (1/2 rock)
394.   */
395.  
396.  #define WM_W_LEFT 1			/* vertical or horizontal wall */
397.  #define WM_W_RIGHT 2
398.  #define WM_W_TOP WM_W_LEFT
399.  #define WM_W_BOTTOM WM_W_RIGHT
400.  
401.  #define WM_C_OUTER 1			/* corner wall */
402.  #define WM_C_INNER 2
403.  #define WM_T_LONG 1			/* T wall */
404.  #define WM_T_BL   2
405.  #define WM_T_BR   3
406.  
407.  #define WM_X_TL   1			/* cross wall */
408.  #define WM_X_TR   2
409.  #define WM_X_BL   3
410.  #define WM_X_BR   4
411.  #define WM_X_TLBR 5
412.  #define WM_X_BLTR 6
413.  
414.  /*
415.   * Seen vector values.	The seen vector is an array of 8 bits, one for each
416.   * octant around a given center x:
417.   *
418.   *			0 1 2
419.   *			7 x 3
420.   *			6 5 4
421.   *
422.   * In the case of walls, a single wall square can be viewed from 8 possible
423.   * directions.	If we know the type of wall and the directions from which
424.   * it has been seen, then we can determine what it looks like to the hero.
425.   */
426.  #define SV0 0x1
427.  #define SV1 0x2
428.  #define SV2 0x4
429.  #define SV3 0x8
430.  #define SV4 0x10
431.  #define SV5 0x20
432.  #define SV6 0x40
433.  #define SV7 0x80
434.  #define SVALL 0xFF
435.  
436.  
437.  
438.  #define doormask	flags
439.  #define altarmask	flags
440.  #define wall_info	flags
441.  #define ladder		flags
442.  #define drawbridgemask	flags
443.  #define looted		flags
444.  #define icedpool	flags
445.  
446.  #define blessedftn	horizontal  /* a fountain that grants attribs */
447.  #define disturbed	horizontal  /* a grave that has been disturbed */
448.  
449.  struct damage {
450.  	struct damage *next;
451.  	long when, cost;
452.  	coord place;
453.  	schar typ;
454.  };
455.  
456.  struct levelflags {
457.  	uchar	nfountains;		/* number of fountains on level */
458.  	uchar	nsinks;		/* number of sinks + toilets on the level */
459.  	/* Several flags that give hints about what's on the level */
460.  	Bitfield(has_shop, 1);
461.  	Bitfield(has_vault, 1);
462.  	Bitfield(has_zoo, 1);
463.  	Bitfield(has_court, 1);
464.  	Bitfield(has_morgue, 1);
465.  	Bitfield(has_beehive, 1);
466.  	Bitfield(has_barracks, 1);
467.  	Bitfield(has_temple, 1);
468.  	Bitfield(has_lemurepit, 1);
469.  	Bitfield(has_migohive, 1);
470.  	Bitfield(has_fungusfarm, 1);
471.  
472.  	Bitfield(has_swamp, 1);
473.  	Bitfield(noteleport,1);
474.  	Bitfield(hardfloor,1);
475.  	Bitfield(nommap,1);
476.  	Bitfield(hero_memory,1);	/* hero has memory */
477.  	Bitfield(shortsighted,1);	/* monsters are shortsighted */
478.  	Bitfield(graveyard,1);		/* has_morgue, but remains set */
479.  	Bitfield(is_maze_lev,1);
480.  
481.  	Bitfield(is_cavernous_lev,1);
482.  	Bitfield(arboreal, 1);		/* Trees replace rock */
483.  	Bitfield(spooky,1);		/* Spooky sounds (Tina Hall) */
484.  	Bitfield(lethe, 1);			/* All water on level causes amnesia */
485.  };
486.  
487.  typedef struct
488.  {
489.      struct rm		locations[COLNO][ROWNO];
490.  #ifndef MICROPORT_BUG
491.      struct obj		*objects[COLNO][ROWNO];
492.      struct monst	*monsters[COLNO][ROWNO];
493.  #else
494.      struct obj		*objects[1][ROWNO];
495.      char		*yuk1[COLNO-1][ROWNO];
496.      struct monst	*monsters[1][ROWNO];
497.      char		*yuk2[COLNO-1][ROWNO];
498.  #endif
499.      struct obj		*objlist;
500.      struct obj		*buriedobjlist;
501.      struct monst	*monlist;
502.      struct damage	*damagelist;
503.      struct levelflags	flags;
504.  }
505.  dlevel_t;
506.  
507.  extern dlevel_t level;	/* structure describing the current level */
508.  
509.  /*
510.   * Macros for compatibility with old code. Someday these will go away.
511.   */
512.  #define levl		level.locations
513.  #define fobj		level.objlist
514.  #define fmon		level.monlist
515.  
516.  /*
517.   * Covert a trap number into the defsym graphics array.
518.   * Convert a defsym number into a trap number.
519.   * Assumes that arrow trap will always be the first trap.
520.   */
521.  #define trap_to_defsym(t) (S_arrow_trap+(t)-1)
522.  #define defsym_to_trap(d) ((d)-S_arrow_trap+1)
523.  
524.  #define OBJ_AT(x,y)	(level.objects[x][y] != (struct obj *)0)
525.  /*
526.   * Macros for encapsulation of level.monsters references.
527.   */
528.  #define MON_AT(x,y)	(level.monsters[x][y] != (struct monst *)0 && \
529.  			 !(level.monsters[x][y])->mburied)
530.  #define MON_BURIED_AT(x,y)	(level.monsters[x][y] != (struct monst *)0 && \
531.  				(level.monsters[x][y])->mburied)
532.  #ifndef STEED
533.  #define place_monster(m,x,y)	((m)->mx=(x),(m)->my=(y),\
534.  				 level.monsters[(m)->mx][(m)->my]=(m))
535.  #endif
536.  #define place_worm_seg(m,x,y)	level.monsters[x][y] = m
537.  #define remove_monster(x,y)	level.monsters[x][y] = (struct monst *)0
538.  #define m_at(x,y)		(MON_AT(x,y) ? level.monsters[x][y] : \
539.  						(struct monst *)0)
540.  #define m_buried_at(x,y)	(MON_BURIED_AT(x,y) ? level.monsters[x][y] : \
541.  						       (struct monst *)0)
542.  
543.  #endif /* RM_H */
Advertisement