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