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