1 /* aNetHack 0.0.1 dungeon.h $ANH-Date: 1447755969 2015/11/17 10:26:09 $ $ANH-Branch: master $:$ANH-Revision: 1.24 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /* aNetHack may be freely redistributed. See license for details. */
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... */
17 typedef struct d_level
{ /* basic dungeon level element */
18 xchar dnum
; /* dungeon number */
19 xchar dlevel
; /* level number */
22 typedef struct s_level
{ /* special dungeon level element */
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 */
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) */
37 /* level region types */
38 enum level_region_types
{
48 typedef struct dest_area
{ /* non-stairway level change identifier */
49 xchar lx
, ly
; /* "lower" left corner (near [0,0]) */
50 xchar hx
, hy
; /* "upper" right corner (near [COLNO,ROWNO]) */
51 xchar nlx
, nly
; /* outline of invalid area */
52 xchar nhx
, nhy
; /* opposite corner of invalid area */
55 typedef struct dungeon
{ /* basic dungeon identifier */
56 char dname
[24]; /* name of the dungeon (eg. "Hell") */
57 char proto
[15]; /* name of prototype file (eg. "tower") */
58 char boneid
; /* character to id dungeon in bones files */
59 d_flags flags
; /* dungeon flags */
60 xchar entry_lev
; /* entry level */
61 xchar num_dunlevs
; /* number of levels in this dungeon */
62 xchar dunlev_ureached
; /* how deep you have been in this dungeon */
63 int ledger_start
, /* the starting depth in "real" terms */
64 depth_start
; /* the starting depth in "logical" terms */
68 * A branch structure defines the connection between two dungeons. They
69 * will be ordered by the dungeon number/level number of 'end1'. Ties
70 * are resolved by 'end2'. 'Type' uses 'end1' arbitrarily as the primary
73 typedef struct branch
{
74 struct branch
*next
; /* next in the branch chain */
75 int id
; /* branch identifier */
76 int type
; /* type of branch */
77 d_level end1
; /* "primary" end point */
78 d_level end2
; /* other end point */
79 boolean end1_up
; /* does end1 go up? */
83 #define BR_STAIR 0 /* "Regular" connection, 2 staircases. */
84 #define BR_NO_END1 1 /* "Regular" connection. However, no stair from
85 end1 to end2. There is a stair from end2 to end1. */
86 #define BR_NO_END2 2 /* "Regular" connection. However, no stair from
87 end2 to end1. There is a stair from end1 to end2. */
88 #define BR_PORTAL 3 /* Connection by magic portals (traps) */
90 /* A particular dungeon contains num_dunlevs d_levels with dlevel 1..
91 * num_dunlevs. Ledger_start and depth_start are bases that are added
92 * to the dlevel of a particular d_level to get the effective ledger_no
93 * and depth for that d_level.
95 * Ledger_no is a bookkeeping number that gives a unique identifier for a
96 * particular d_level (for level.?? files, e.g.).
98 * Depth corresponds to the number of floors below the surface.
100 #define Is_astralevel(x) (on_level(x, &astral_level))
101 #define Is_earthlevel(x) (on_level(x, &earth_level))
102 #define Is_waterlevel(x) (on_level(x, &water_level))
103 #define Is_firelevel(x) (on_level(x, &fire_level))
104 #define Is_airlevel(x) (on_level(x, &air_level))
105 #define Is_medusa_level(x) (on_level(x, &medusa_level))
106 #define Is_oracle_level(x) (on_level(x, &oracle_level))
107 #define Is_valley(x) (on_level(x, &valley_level))
108 #define Is_juiblex_level(x) (on_level(x, &juiblex_level))
109 #define Is_asmo_level(x) (on_level(x, &asmodeus_level))
110 #define Is_baal_level(x) (on_level(x, &baalzebub_level))
111 #define Is_wiz1_level(x) (on_level(x, &wiz1_level))
112 #define Is_wiz2_level(x) (on_level(x, &wiz2_level))
113 #define Is_wiz3_level(x) (on_level(x, &wiz3_level))
114 #define Is_sanctum(x) (on_level(x, &sanctum_level))
115 #define Is_portal_level(x) (on_level(x, &portal_level))
116 #define Is_rogue_level(x) (on_level(x, &rogue_level))
117 #define Is_stronghold(x) (on_level(x, &stronghold_level))
118 #define Is_bigroom(x) (on_level(x, &bigroom_level))
119 #define Is_qstart(x) (on_level(x, &qstart_level))
120 #define Is_qlocate(x) (on_level(x, &qlocate_level))
121 #define Is_nemesis(x) (on_level(x, &nemesis_level))
122 #define Is_knox(x) (on_level(x, &knox_level))
123 #define Is_mineend_level(x) (on_level(x, &mineend_level))
124 #define Is_sokoend_level(x) (on_level(x, &sokoend_level))
126 #define In_sokoban(x) ((x)->dnum == sokoban_dnum)
127 #define Inhell In_hell(&u.uz) /* now gehennom */
128 #define In_endgame(x) ((x)->dnum == astral_level.dnum)
130 #define within_bounded_area(X, Y, LX, LY, HX, HY) \
131 ((X) >= (LX) && (X) <= (HX) && (Y) >= (LY) && (Y) <= (HY))
133 /* monster and object migration codes */
135 #define MIGR_NOWHERE (-1) /* failure flag for down_gate() */
136 #define MIGR_RANDOM 0
137 #define MIGR_APPROX_XY 1 /* approximate coordinates */
138 #define MIGR_EXACT_XY 2 /* specific coordinates */
139 #define MIGR_STAIRS_UP 3
140 #define MIGR_STAIRS_DOWN 4
141 #define MIGR_LADDER_UP 5
142 #define MIGR_LADDER_DOWN 6
143 #define MIGR_SSTAIRS 7 /* dungeon branch */
144 #define MIGR_PORTAL 8 /* magic portal */
145 #define MIGR_WITH_HERO 9 /* mon: followers; obj: trap door */
146 #define MIGR_NOBREAK 1024 /* bitmask: don't break on delivery */
147 #define MIGR_NOSCATTER 2048 /* don't scatter on delivery */
149 /* level information (saved via ledger number) */
153 #define VISITED 0x01 /* hero has visited this level */
154 #define FORGOTTEN 0x02 /* hero will forget this level when reached */
155 #define LFILE_EXISTS 0x04 /* a level file exists for this level */
156 /* Note: VISITED and LFILE_EXISTS are currently almost always
157 * set at the same time. However they _mean_ different things.
160 #define FROMPERM 1 /* for ramdisk use */
161 #define TOPERM 2 /* for ramdisk use */
170 /* types and structures for dungeon map recording
172 * It is designed to eliminate the need for an external notes file for some
173 * mundane dungeon elements. "Where was the last altar I passed?" etc...
174 * Presumably the character can remember this sort of thing even if, months
175 * later in real time picking up an old save game, I can't.
177 * To be consistent, one can assume that this map is in the player's mind and
178 * has no physical correspondence (eliminating illiteracy/blind/hands/hands
179 * free concerns). Therefore, this map is not exhaustive nor detailed ("some
180 * fountains"). This makes it also subject to player conditions (amnesia).
183 /* Because clearly Nethack needs more ways to specify alignment */
184 #define Amask2msa(x) ((x) == 4 ? 3 : (x) &AM_MASK)
185 #define Msa2amask(x) ((x) == 3 ? 4 : (x))
186 #define MSA_NONE 0 /* unaligned or multiple alignments */
188 #define MSA_NEUTRAL 2
189 #define MSA_CHAOTIC 3
191 /* what the player knows about a single dungeon level */
192 /* initialized in mklev() */
193 typedef struct mapseen
{
194 struct mapseen
*next
; /* next map in the chain */
195 branch
*br
; /* knows about branch via taking it in goto_level */
196 d_level lev
; /* corresponding dungeon level */
197 struct mapseen_feat
{
198 /* feature knowledge that must be calculated from levl array */
202 Bitfield(nthrone
, 2);
210 /* calculated from rooms array */
212 Bitfield(ntemple
, 2);
213 /* altar alignment; MSA_NONE if there is more than one and
214 they aren't all the same */
215 Bitfield(msalign
, 2);
217 Bitfield(shoptype
, 5);
219 struct mapseen_flags
{
220 Bitfield(unreachable
, 1); /* can't get back to this level */
221 Bitfield(forgot
, 1); /* player has forgotten about this level */
222 Bitfield(knownbones
, 1); /* player aware of bones */
224 Bitfield(sokosolved
, 1);
225 Bitfield(bigroom
, 1);
227 Bitfield(castletune
, 1); /* add tune hint to castle annotation */
230 Bitfield(msanctum
, 1);
232 Bitfield(roguelevel
, 1);
233 /* quest annotations: quest_summons is for main dungeon level
234 with entry portal and is reset once quest has been finished;
235 questing is for quest home (level 1) */
236 Bitfield(quest_summons
, 1); /* heard summons from leader */
237 Bitfield(questing
, 1); /* quest leader has unlocked quest stairs */
242 struct mapseen_rooms
{
244 Bitfield(untended
, 1); /* flag for shop without shk */
245 } msrooms
[(MAXNROFROOMS
+ 1) * 2]; /* same size as rooms[] */
246 /* dead heroes; might not have graves or ghosts */
247 struct cemetery
*final_resting_place
; /* same as level.bonesinfo */
250 #endif /* DUNGEON_H */