1 | /* SCCS Id: @(#)hack.h 3.3 2000/01/28 */ 2 | /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3 | /* NetHack may be freely redistributed. See license for details. */ 4 | 5 | #ifndef HACK_H 6 | #define HACK_H 7 | 8 | #ifndef CONFIG_H 9 | #include "config.h" 10 | #endif 11 | 12 | /* For debugging beta code. */ 13 | #ifdef BETA 14 | #define Dpline pline 15 | #endif 16 | 17 | #define TELL 1 18 | #define NOTELL 0 19 | #define ON 1 20 | #define OFF 0 21 | #define BOLT_LIM 8 /* from this distance ranged attacks will be made */ 22 | #define MAX_CARR_CAP 1000 /* so that boulders can be heavier */ 23 | #define DUMMY { 0 } 24 | 25 | /* symbolic names for capacity levels */ 26 | #define UNENCUMBERED 0 27 | #define SLT_ENCUMBER 1 28 | #define MOD_ENCUMBER 2 29 | #define HVY_ENCUMBER 3 30 | #define EXT_ENCUMBER 4 31 | #define OVERLOADED 5 32 | 33 | /* Macros for how a rumor was delivered in outrumor() */ 34 | #define BY_ORACLE 0 35 | #define BY_COOKIE 1 36 | #define BY_PAPER 2 37 | #define BY_OTHER 9 38 | 39 | #ifdef STEED 40 | /* Macros for why you are no longer riding */ 41 | #define DISMOUNT_GENERIC 0 42 | #define DISMOUNT_FELL 1 43 | #define DISMOUNT_THROWN 2 44 | #define DISMOUNT_POLY 3 45 | #define DISMOUNT_ENGULFED 4 46 | #define DISMOUNT_BYCHOICE 5 47 | #endif 48 | 49 | /* 50 | * This is the way the game ends. If these are rearranged, the arrays 51 | * in end.c and topten.c will need to be changed. Some parts of the 52 | * code assume that PANIC separates the deaths from the non-deaths. 53 | */ 54 | #define DIED 0 55 | #define CHOKING 1 56 | #define POISONING 2 57 | #define STARVING 3 58 | #define DROWNING 4 59 | #define BURNING 5 60 | #define DISSOLVED 6 61 | #define CRUSHING 7 62 | #define STONING 8 63 | #define TURNED_SLIME 9 64 | #define GENOCIDED 10 65 | #define PANICKED 11 66 | #define TRICKED 12 67 | #define QUIT 13 68 | #define ESCAPED 14 69 | #define ASCENDED 15 70 | 71 | #include "align.h" 72 | #include "dungeon.h" 73 | #include "monsym.h" 74 | #include "mkroom.h" 75 | #include "objclass.h" 76 | #include "youprop.h" 77 | #include "wintype.h" 78 | #include "decl.h" 79 | #include "timeout.h" 80 | 81 | NEARDATA extern coord bhitpos; /* place where throw or zap hits or stops */ 82 | 83 | /* types of calls to bhit() */ 84 | #define ZAPPED_WAND 0 85 | #define THROWN_WEAPON 1 86 | #define KICKED_WEAPON 2 87 | #define FLASHED_LIGHT 3 88 | #define INVIS_BEAM 4 89 | 90 | #define MATCH_WARN_OF_MON(mon) (Warn_of_mon && flags.warntype && \ 91 | (flags.warntype & (mon)->data->mflags2)) 92 | 93 | #include "trap.h" 94 | #include "flag.h" 95 | #include "rm.h" 96 | #include "vision.h" 97 | #include "display.h" 98 | #include "engrave.h" 99 | #include "rect.h" 100 | #include "region.h" 101 | 102 | #ifdef USE_TRAMPOLI /* This doesn't belong here, but we have little choice */ 103 | #undef NDECL 104 | #define NDECL(f) f() 105 | #endif 106 | 107 | #include "extern.h" 108 | #include "winprocs.h" 109 | 110 | #ifdef USE_TRAMPOLI 111 | #include "wintty.h" 112 | #undef WINTTY_H 113 | #include "trampoli.h" 114 | #undef EXTERN_H 115 | #include "extern.h" 116 | #endif /* USE_TRAMPOLI */ 117 | 118 | #define NO_SPELL 0 119 | 120 | /* flags to control makemon() */ 121 | #define NO_MM_FLAGS 0x00 /* use this rather than plain 0 */ 122 | #define NO_MINVENT 0x01 /* suppress minvent when creating mon */ 123 | #define MM_NOWAIT 0x02 /* don't set STRAT_WAITMASK flags */ 124 | #define MM_EDOG 0x04 /* add edog structure */ 125 | #define MM_EMIN 0x08 /* add emin structure */ 126 | #define MM_ANGRY 0x10 /* monster is created angry */ 127 | #define MM_NONAME 0x20 /* monster is not christened */ 128 | 129 | /* flags to control query_objlist() */ 130 | #define BY_NEXTHERE 0x1 /* follow objlist by nexthere field */ 131 | #define AUTOSELECT_SINGLE 0x2 /* if only 1 object, don't ask */ 132 | #define USE_INVLET 0x4 /* use object's invlet */ 133 | #define INVORDER_SORT 0x8 /* sort objects by packorder */ 134 | #define SIGNAL_NOMENU 0x10 /* return -1 rather than 0 if none allowed */ 135 | 136 | /* Flags to control query_category() */ 137 | /* BY_NEXTHERE used by query_category() too, so skip 0x01 */ 138 | #define UNPAID_TYPES 0x02 139 | #define GOLD_TYPES 0x04 140 | #define WORN_TYPES 0x08 141 | #define ALL_TYPES 0x10 142 | #define BILLED_TYPES 0x20 143 | #define CHOOSE_ALL 0x40 144 | #define ALL_TYPES_SELECTED -2 145 | 146 | /* Flags to control find_mid() */ 147 | #define FM_FMON 0x01 /* search the fmon chain */ 148 | #define FM_MIGRATE 0x02 /* search the migrating monster chain */ 149 | #define FM_MYDOGS 0x04 /* search mydogs */ 150 | #define FM_EVERYWHERE (FM_FMON | FM_MIGRATE | FM_MYDOGS) 151 | 152 | /*** some utility macros ***/ 153 | #define yn(query) yn_function(query,ynchars, 'n') 154 | #define ynq(query) yn_function(query,ynqchars, 'q') 155 | #define ynaq(query) yn_function(query,ynaqchars, 'y') 156 | #define nyaq(query) yn_function(query,ynaqchars, 'n') 157 | #define nyNaq(query) yn_function(query,ynNaqchars, 'n') 158 | #define ynNaq(query) yn_function(query,ynNaqchars, 'y') 159 | 160 | /* Macros for scatter */ 161 | #define VIS_EFFECTS 0x01 /* display visual effects */ 162 | #define MAY_HITMON 0x02 /* objects may hit monsters */ 163 | #define MAY_HITYOU 0x04 /* objects may hit you */ 164 | #define MAY_HIT (MAY_HITMON|MAY_HITYOU) 165 | #define MAY_DESTROY 0x08 /* objects may be destroyed at random */ 166 | #define MAY_FRACTURE 0x10 /* boulders & statues may fracture */ 167 | 168 | /* Macros for launching objects */ 169 | #define ROLL 1 170 | #define FLING 2 171 | 172 | /* Macros for messages referring to hands, eyes, feet, etc... */ 173 | #define ARM 0 174 | #define EYE 1 175 | #define FACE 2 176 | #define FINGER 3 177 | #define FINGERTIP 4 178 | #define FOOT 5 179 | #define HAND 6 180 | #define HANDED 7 181 | #define HEAD 8 182 | #define LEG 9 183 | #define LIGHT_HEADED 10 184 | #define NECK 11 185 | #define SPINE 12 186 | #define TOE 13 187 | #define HAIR 14 188 | #define BLOOD 15 189 | #define LUNG 16 190 | 191 | /* Flags to control menus */ 192 | #define MENUTYPELEN sizeof("traditional ") 193 | #define MENU_TRADITIONAL 0 194 | #define MENU_COMBINATION 1 195 | #define MENU_PARTIAL 2 196 | #define MENU_FULL 3 197 | 198 | #define MENU_SELECTED TRUE 199 | #define MENU_UNSELECTED FALSE 200 | 201 | #define FEATURE_NOTICE_VER(major,minor,patch) (((unsigned long)major << 24) | \ 202 | ((unsigned long)minor << 16) | \ 203 | ((unsigned long)patch << 8) | \ 204 | ((unsigned long)0)) 205 | 206 | #define FEATURE_NOTICE_VER_MAJ (flags.suppress_alert >> 24) 207 | #define FEATURE_NOTICE_VER_MIN (((unsigned long)(0x0000000000FF0000L & flags.suppress_alert)) >> 16) 208 | #define FEATURE_NOTICE_VER_PATCH (((unsigned long)(0x000000000000FF00L & flags.suppress_alert)) >> 8) 209 | 210 | #ifndef max 211 | #define max(a,b) ((a) > (b) ? (a) : (b)) 212 | #endif 213 | #ifndef min 214 | #define min(x,y) ((x) < (y) ? (x) : (y)) 215 | #endif 216 | #define plur(x) (((x) == 1) ? "" : "s") 217 | 218 | #define ARM_BONUS(obj) (objects[(obj)->otyp].a_ac + (obj)->spe \ 219 | - min((int)greatest_erosion(obj),objects[(obj)->otyp].a_ac)) 220 | 221 | #define makeknown(x) discover_object((x),TRUE,TRUE) 222 | #define distu(xx,yy) dist2((int)(xx),(int)(yy),(int)u.ux,(int)u.uy) 223 | #define onlineu(xx,yy) online2((int)(xx),(int)(yy),(int)u.ux,(int)u.uy) 224 | 225 | #define rn1(x,y) (rn2(x)+(y)) 226 | 227 | /* negative armor class is randomly weakened to prevent invulnerability */ 228 | #define AC_VALUE(AC) ((AC) >= 0 ? (AC) : -rnd(-(AC))) 229 | 230 | #if defined(MICRO) && !defined(__DJGPP__) 231 | #define getuid() 1 232 | #define getlogin() ((char *)0) 233 | #endif /* MICRO */ 234 | 235 | #if defined(OVERLAY)&&(defined(OVL0)||defined(OVL1)||defined(OVL2)||defined(OVL3)||defined(OVLB)) 236 | # define USE_OVLx 237 | # define STATIC_DCL extern 238 | # define STATIC_OVL 239 | # ifdef OVLB 240 | # define STATIC_VAR 241 | # else 242 | # define STATIC_VAR extern 243 | # endif 244 | 245 | #else /* !OVERLAY || (!OVL0 && !OVL1 && !OVL2 && !OVL3 && !OVLB) */ 246 | # define STATIC_DCL static 247 | # define STATIC_OVL static 248 | # define STATIC_VAR static 249 | 250 | /* If not compiling an overlay, compile everything. */ 251 | # define OVL0 /* highest priority */ 252 | # define OVL1 253 | # define OVL2 254 | # define OVL3 /* lowest specified priority */ 255 | # define OVLB /* the base overlay segment */ 256 | #endif /* OVERLAY && (OVL0 || OVL1 || OVL2 || OVL3 || OVLB) */ 257 | 258 | /* Macro for a few items that are only static if we're not overlaid.... */ 259 | #if defined(USE_TRAMPOLI) || defined(USE_OVLx) 260 | # define STATIC_PTR 261 | #else 262 | # define STATIC_PTR static 263 | #endif 264 | 265 | #endif /* HACK_H */