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 */ 170