OSDN Git Service

shrink mine
[nethackexpress/trunk.git] / include / dungeon.h
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
125 #define In_sokoban(x)           ((x)->dnum == sokoban_dnum)
126 #define Inhell                  In_hell(&u.uz)  /* now gehennom */
127 #define In_endgame(x)           ((x)->dnum == astral_level.dnum)
128
129 #define within_bounded_area(X,Y,LX,LY,HX,HY) \
130                 ((X) >= (LX) && (X) <= (HX) && (Y) >= (LY) && (Y) <= (HY))
131
132 /* monster and object migration codes */
133
134 #define MIGR_NOWHERE          (-1)      /* failure flag for down_gate() */
135 #define MIGR_RANDOM             0
136 #define MIGR_APPROX_XY          1       /* approximate coordinates */
137 #define MIGR_EXACT_XY           2       /* specific coordinates */
138 #define MIGR_STAIRS_UP          3
139 #define MIGR_STAIRS_DOWN        4
140 #define MIGR_LADDER_UP          5
141 #define MIGR_LADDER_DOWN        6
142 #define MIGR_SSTAIRS            7       /* dungeon branch */
143 #define MIGR_PORTAL             8       /* magic portal */
144 #define MIGR_NEAR_PLAYER        9       /* mon: followers; obj: trap door */
145
146 /* level information (saved via ledger number) */
147
148 struct linfo {
149         unsigned char   flags;
150 #define VISITED         0x01    /* hero has visited this level */
151 #define FORGOTTEN       0x02    /* hero will forget this level when reached */
152 #define LFILE_EXISTS    0x04    /* a level file exists for this level */
153 /*
154  * Note:  VISITED and LFILE_EXISTS are currently almost always set at the
155  * same time.  However they _mean_ different things.
156  */
157
158 #ifdef MFLOPPY
159 # define FROMPERM        1      /* for ramdisk use */
160 # define TOPERM          2      /* for ramdisk use */
161 # define ACTIVE          1
162 # define SWAPPED         2
163         int     where;
164         long    time;
165         long    size;
166 #endif /* MFLOPPY */
167 };
168
169 #endif /* DUNGEON_H */