1 /*	SCCS Id: @(#)dungeon.h	3.4	1999/07/02	*/
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /* NetHack may be freely redistributed.  See license for details. */
4 
5 #ifndef DUNGEON_H
6 #define DUNGEON_H
7 
8 typedef struct d_flags {	/* dungeon/level type flags */
9 	Bitfield(town, 1);	/* is this a town? (levels only) */
10 	Bitfield(hellish, 1);	/* is this part of hell? */
11 	Bitfield(maze_like, 1); /* is this a maze? */
12 	Bitfield(rogue_like, 1); /* is this an old-fashioned presentation? */
13 	Bitfield(align, 3);	/* dungeon alignment. */
14 	Bitfield(unused, 1);	/* etc... */
15 } d_flags;
16 
17 typedef struct d_level {	/* basic dungeon level element */
18 	xchar	dnum;		/* dungeon number */
19 	xchar	dlevel;		/* level number */
20 } d_level;
21 
22 typedef struct s_level {	/* special dungeon level element */
23 	struct	s_level *next;
24 	d_level dlevel;		/* dungeon & level numbers */
25 	char	proto[15];	/* name of prototype file (eg. "tower") */
26 	char	boneid;		/* character to id level in bones files */
27 	uchar	rndlevs;	/* no. of randomly available similar levels */
28 	d_flags flags;		/* type flags */
29 } s_level;
30 
31 typedef struct stairway {	/* basic stairway identifier */
32 	xchar	sx, sy;		/* x / y location of the stair */
33 	d_level tolev;		/* where does it go */
34 	char	up;		/* what type of stairway (up/down) */
35 } stairway;
36 
37 /* level region types */
38 #define LR_DOWNSTAIR 0
39 #define LR_UPSTAIR 1
40 #define LR_PORTAL 2
41 #define LR_BRANCH 3
42 #define LR_TELE 4
43 #define LR_UPTELE 5
44 #define LR_DOWNTELE 6
45 
46 typedef struct dest_area {	/* non-stairway level change indentifier */
47 	xchar	lx, ly;		/* "lower" left corner (near [0,0]) */
48 	xchar	hx, hy;		/* "upper" right corner (near [COLNO,ROWNO]) */
49 	xchar	nlx, nly;	/* outline of invalid area */
50 	xchar	nhx, nhy;	/* opposite corner of invalid area */
51 } dest_area;
52 
53 typedef struct dungeon {	/* basic dungeon identifier */
54 	char	dname[24];	/* name of the dungeon (eg. "Hell") */
55 	char	proto[15];	/* name of prototype file (eg. "tower") */
56 	char	boneid;		/* character to id dungeon in bones files */
57 	d_flags flags;		/* dungeon flags */
58 	xchar	entry_lev;	/* entry level */
59 	xchar	num_dunlevs;	/* number of levels in this dungeon */
60 	xchar	dunlev_ureached; /* how deep you have been in this dungeon */
61 	int	ledger_start,	/* the starting depth in "real" terms */
62 		depth_start;	/* the starting depth in "logical" terms */
63 } dungeon;
64 
65 /*
66  * A branch structure defines the connection between two dungeons.  They
67  * will be ordered by the dungeon number/level number of 'end1'.  Ties
68  * are resolved by 'end2'.  'Type' uses 'end1' arbitrarily as the primary
69  * point.
70  */
71 typedef struct branch {
72     struct branch *next;	/* next in the branch chain */
73     int		  id;		/* branch identifier */
74     int		  type;		/* type of branch */
75     d_level	  end1;		/* "primary" end point */
76     d_level	  end2;		/* other end point */
77     boolean	  end1_up;	/* does end1 go up? */
78 } branch;
79 
80 /* branch types */
81 #define BR_STAIR   0	/* "Regular" connection, 2 staircases. */
82 #define BR_NO_END1 1	/* "Regular" connection.  However, no stair from  */
83 			/*	end1 to end2.  There is a stair from end2 */
84 			/*	to end1.				  */
85 #define BR_NO_END2 2	/* "Regular" connection.  However, no stair from  */
86 			/*	end2 to end1.  There is a stair from end1 */
87 			/*	to end2.				  */
88 #define BR_PORTAL  3	/* Connection by magic portals (traps) */
89 
90 
91 /* A particular dungeon contains num_dunlevs d_levels with dlevel 1..
92  * num_dunlevs.  Ledger_start and depth_start are bases that are added
93  * to the dlevel of a particular d_level to get the effective ledger_no
94  * and depth for that d_level.
95  *
96  * Ledger_no is a bookkeeping number that gives a unique identifier for a
97  * particular d_level (for level.?? files, e.g.).
98  *
99  * Depth corresponds to the number of floors below the surface.
100  */
101 #define Is_astralevel(x)	(on_level(x, &astral_level))
102 #define Is_earthlevel(x)	(on_level(x, &earth_level))
103 #define Is_waterlevel(x)	(on_level(x, &water_level))
104 #define Is_firelevel(x)		(on_level(x, &fire_level))
105 #define Is_airlevel(x)		(on_level(x, &air_level))
106 #define Is_medusa_level(x)	(on_level(x, &medusa_level))
107 #define Is_oracle_level(x)	(on_level(x, &oracle_level))
108 #define Is_valley(x)		(on_level(x, &valley_level))
109 #define Is_juiblex_level(x)	(on_level(x, &juiblex_level))
110 #define Is_asmo_level(x)	(on_level(x, &asmodeus_level))
111 #define Is_baal_level(x)	(on_level(x, &baalzebub_level))
112 #define Is_wiz1_level(x)	(on_level(x, &wiz1_level))
113 #define Is_wiz2_level(x)	(on_level(x, &wiz2_level))
114 #define Is_wiz3_level(x)	(on_level(x, &wiz3_level))
115 #define Is_sanctum(x)		(on_level(x, &sanctum_level))
116 #define Is_portal_level(x)	(on_level(x, &portal_level))
117 #define Is_rogue_level(x)	(on_level(x, &rogue_level))
118 #define Is_stronghold(x)	(on_level(x, &stronghold_level))
119 #define Is_bigroom(x)		(on_level(x, &bigroom_level))
120 #define Is_qstart(x)		(on_level(x, &qstart_level))
121 #define Is_qlocate(x)		(on_level(x, &qlocate_level))
122 #define Is_nemesis(x)		(on_level(x, &nemesis_level))
123 #define Is_knox(x)		(on_level(x, &knox_level))
124 #define Is_nymph_level(x)	(on_level(x, &nymph_level))
125 #ifdef ADVENT_CALENDAR
126 #define Is_advent_calendar(x)		(on_level(x, &advcal_level))
127 #endif
128 #ifdef RECORD_ACHIEVE
129 #define Is_mineend_level(x)     (on_level(x, &mineend_level))
130 #define Is_sokoend_level(x)     (on_level(x, &sokoend_level))
131 #endif
132 #ifdef BLACKMARKET
133 #define Is_blackmarket(x)       (on_level(x, &blackmarket_level))
134 #else
135 #define Is_blackmarket(x)       (FALSE)
136 #endif /* BLACKMARKET */
137 #define Is_minetown_level(x)	(on_level(x, &minetown_level))
138 #define Is_town_level(x)	(on_level(x, &town_level))
139 #define Is_moria_level(x)	(on_level(x, &moria_level))
140 
141 #define In_sokoban(x)		((x)->dnum == sokoban_dnum)
142 #define Inhell			In_hell(&u.uz)	/* now gehennom */
143 #define Insheol  		In_sheol(&u.uz)	/* now sheol */
144 #define In_endgame(x)		((x)->dnum == astral_level.dnum)
145 
146 #define within_bounded_area(X,Y,LX,LY,HX,HY) \
147 		((X) >= (LX) && (X) <= (HX) && (Y) >= (LY) && (Y) <= (HY))
148 
149 /* monster and object migration codes */
150 
151 #define MIGR_NOWHERE	      (-1)	/* failure flag for down_gate() */
152 #define MIGR_RANDOM		0
153 #define MIGR_APPROX_XY		1	/* approximate coordinates */
154 #define MIGR_EXACT_XY		2	/* specific coordinates */
155 #define MIGR_STAIRS_UP		3
156 #define MIGR_STAIRS_DOWN	4
157 #define MIGR_LADDER_UP		5
158 #define MIGR_LADDER_DOWN	6
159 #define MIGR_SSTAIRS		7	/* dungeon branch */
160 #define MIGR_PORTAL		8	/* magic portal */
161 #define MIGR_NEAR_PLAYER	9	/* mon: followers; obj: trap door */
162 
163 /* level information (saved via ledger number) */
164 
165 struct linfo {
166 	unsigned char	flags;
167 #define VISITED		0x01	/* hero has visited this level */
168 #define FORGOTTEN	0x02	/* hero will forget this level when reached */
169 #define LFILE_EXISTS	0x04	/* a level file exists for this level */
170 /*
171  * Note:  VISITED and LFILE_EXISTS are currently almost always set at the
172  * same time.  However they _mean_ different things.
173  */
174 
175 #ifdef MFLOPPY
176 # define FROMPERM	 1	/* for ramdisk use */
177 # define TOPERM		 2	/* for ramdisk use */
178 # define ACTIVE		 1
179 # define SWAPPED	 2
180 	int	where;
181 	long	time;
182 	long	size;
183 #endif /* MFLOPPY */
184 };
185 
186 /* types and structures for dungeon map recording
187  *
188  * It is designed to eliminate the need for an external notes file for some of
189  * the more mundane dungeon elements.  "Where was the last altar I passed?" etc...
190  * Presumably the character can remember this sort of thing even if, months
191  * later in real time picking up an old save game, I can't.
192  *
193  * To be consistent, one can assume that this map is in the player's mind and
194  * has no physical correspondence (eliminating illiteracy/blind/hands/hands free
195  * concerns.) Therefore, this map is not exaustive nor detailed ("some fountains").
196  * This makes it also subject to player conditions (amnesia).
197  */
198 
199 /* Because clearly Nethack needs more ways to specify alignment */
200 #define Amask2msa(x) ((x) == 4 ? 3 : (x) & AM_MASK)
201 #define Msa2amask(x) ((x) == 3 ? 4 : (x))
202 #define MSA_NONE	0  /* unaligned or multiple alignments */
203 #define MSA_LAWFUL  1
204 #define MSA_NEUTRAL 2
205 #define MSA_CHAOTIC 3
206 
207 typedef struct mapseen_feat {
208 	/* feature knowledge that must be calculated from levl array */
209 	Bitfield(nfount, 2);
210 	Bitfield(nsink, 2);
211 	Bitfield(naltar, 2);
212 	Bitfield(msalign, 2); /* corresponds to MSA_* above */
213 	Bitfield(nthrone, 2);
214 	Bitfield(ntree, 2);
215 	/* water, lava, ice are too verbose so commented out for now */
216 	/*
217 	Bitfield(water, 1);
218 	Bitfield(lava, 1);
219 	Bitfield(ice, 1);
220 	*/
221 
222 	/* calculated from rooms array */
223 	Bitfield(nshop, 2);
224 	Bitfield(ntemple, 2);
225 	Bitfield(shoptype, 6);
226 
227 	Bitfield(forgot, 1); /* player has forgotten about this level? */
228 } mapseen_feat;
229 
230 /* for mapseen->rooms */
231 #define MSR_SEEN		1
232 
233 /* what the player knows about a single dungeon level */
234 /* initialized in mklev() */
235 typedef struct mapseen  {
236 	struct mapseen *next; /* next map in the chain */
237 	branch *br; /* knows about branch via taking it in goto_level */
238 	d_level lev; /* corresponding dungeon level */
239 
240 	mapseen_feat feat;
241 
242 	/* custom naming */
243 	char *custom;
244 	unsigned custom_lth;
245 
246 	/* maybe this should just be in struct mkroom? */
247 	schar rooms[(MAXNROFROOMS+1)*2];
248 } mapseen;
249 
250 #endif /* DUNGEON_H */
251