1/* SCCS Id: @(#)hack.h 3.4 2001/04/12 */ 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 /* Burdened */ 28#define MOD_ENCUMBER 2 /* Stressed */ 29#define HVY_ENCUMBER 3 /* Strained */ 30#define EXT_ENCUMBER 4 /* Overtaxed */ 31#define OVERLOADED 5 /* Overloaded */ 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_BONES 5 47#define DISMOUNT_BYCHOICE 6 48#endif 49 50/* Special returns from mapglyph() */ 51#define MG_CORPSE 0x01 52#define MG_INVIS 0x02 53#define MG_DETECT 0x04 54#define MG_PET 0x08 55#define MG_RIDDEN 0x10 56 57/* sellobj_state() states */ 58#define SELL_NORMAL (0) 59#define SELL_DELIBERATE (1) 60#define SELL_DONTSELL (2) 61 62/* 63 * This is the way the game ends. If these are rearranged, the arrays 64 * in end.c and topten.c will need to be changed. Some parts of the 65 * code assume that PANIC separates the deaths from the non-deaths. 66 */ 67#define DIED 0 68#define CHOKING 1 69#define POISONING 2 70#define STARVING 3 71#define DROWNING 4 72#define BURNING 5 73#define DISSOLVED 6 74#define CRUSHING 7 75#define STONING 8 76#define TURNED_SLIME 9 77#define GENOCIDED 10 78#define PANICKED 11 79#define TRICKED 12 80#define QUIT 13 81#define ESCAPED 14 82#define ASCENDED 15 83 84#include "align.h" 85#include "dungeon.h" 86#include "monsym.h" 87#include "mkroom.h" 88#include "objclass.h" 89#include "youprop.h" 90#include "wintype.h" 91#include "decl.h" 92#include "timeout.h" 93 94NEARDATA extern coord bhitpos; /* place where throw or zap hits or stops */ 95 96/* types of calls to bhit() */ 97#define ZAPPED_WAND 0 98#define THROWN_WEAPON 1 99#define KICKED_WEAPON 2 100#define FLASHED_LIGHT 3 101#define INVIS_BEAM 4 102 103#define MATCH_WARN_OF_MON(mon) (Warn_of_mon && flags.warntype && \ 104 (flags.warntype & (mon)->data->mflags2)) 105 106#include "trap.h" 107#include "flag.h" 108#include "rm.h" 109#include "vision.h" 110#include "display.h" 111#include "engrave.h" 112#include "rect.h" 113#include "region.h" 114 115#ifdef USE_TRAMPOLI /* This doesn't belong here, but we have little choice */ 116#undef NDECL 117#define NDECL(f) f() 118#endif 119 120#include "extern.h" 121#include "winprocs.h" 122 123#ifdef USE_TRAMPOLI 124#include "wintty.h" 125#undef WINTTY_H 126#include "trampoli.h" 127#undef EXTERN_H 128#include "extern.h" 129#endif /* USE_TRAMPOLI */ 130 131#define NO_SPELL 0 132 133/* flags to control makemon() */ 134#define NO_MM_FLAGS 0x00 /* use this rather than plain 0 */ 135#define NO_MINVENT 0x01 /* suppress minvent when creating mon */ 136#define MM_NOWAIT 0x02 /* don't set STRAT_WAITMASK flags */ 137#define MM_EDOG 0x04 /* add edog structure */ 138#define MM_EMIN 0x08 /* add emin structure */ 139#define MM_ANGRY 0x10 /* monster is created angry */ 140#define MM_NONAME 0x20 /* monster is not christened */ 141#define MM_NOCOUNTBIRTH 0x40 /* don't increment born counter (for revival) */ 142#define MM_IGNOREWATER 0x80 /* ignore water when positioning */ 143#define MM_ADJACENTOK 0x100 /* it is acceptable to use adjacent coordinates */ 144 145/* special mhpmax value when loading bones monster to flag as extinct or genocided */ 146#define DEFUNCT_MONSTER (-100) 147 148/* flags for special ggetobj status returns */ 149#define ALL_FINISHED 0x01 /* called routine already finished the job */ 150 151/* flags to control query_objlist() */ 152#define BY_NEXTHERE 0x1 /* follow objlist by nexthere field */ 153#define AUTOSELECT_SINGLE 0x2 /* if only 1 object, don't ask */ 154#define USE_INVLET 0x4 /* use object's invlet */ 155#define INVORDER_SORT 0x8 /* sort objects by packorder */ 156#define SIGNAL_NOMENU 0x10 /* return -1 rather than 0 if none allowed */ 157#define FEEL_COCKATRICE 0x20 /* engage cockatrice checks and react */ 158 159/* Flags to control query_category() */ 160/* BY_NEXTHERE used by query_category() too, so skip 0x01 */ 161#define UNPAID_TYPES 0x02 162#define GOLD_TYPES 0x04 163#define WORN_TYPES 0x08 164#define ALL_TYPES 0x10 165#define BILLED_TYPES 0x20 166#define CHOOSE_ALL 0x40 167#define BUC_BLESSED 0x80 168#define BUC_CURSED 0x100 169#define BUC_UNCURSED 0x200 170#define BUC_UNKNOWN 0x400 171#define BUC_ALLBKNOWN (BUC_BLESSED|BUC_CURSED|BUC_UNCURSED) 172#define ALL_TYPES_SELECTED -2 173 174/* Flags to control find_mid() */ 175#define FM_FMON 0x01 /* search the fmon chain */ 176#define FM_MIGRATE 0x02 /* search the migrating monster chain */ 177#define FM_MYDOGS 0x04 /* search mydogs */ 178#define FM_EVERYWHERE (FM_FMON | FM_MIGRATE | FM_MYDOGS) 179 180/* Flags to control pick_[race,role,gend,align] routines in role.c */ 181#define PICK_RANDOM 0 182#define PICK_RIGID 1 183 184/* Flags to control dotrap() in trap.c */ 185#define NOWEBMSG 0x01 /* suppress stumble into web message */ 186#define FORCEBUNGLE 0x02 /* adjustments appropriate for bungling */ 187#define RECURSIVETRAP 0x04 /* trap changed into another type this same turn */ 188 189/* Flags to control test_move in hack.c */ 190#define DO_MOVE 0 /* really doing the move */ 191#define TEST_MOVE 1 /* test a normal move (move there next) */ 192#define TEST_TRAV 2 /* test a future travel location */ 193 194/*** some utility macros ***/ 195#define yn(query) yn_function(query,ynchars, 'n') 196#define ynq(query) yn_function(query,ynqchars, 'q') 197#define ynaq(query) yn_function(query,ynaqchars, 'y') 198#define nyaq(query) yn_function(query,ynaqchars, 'n') 199#define nyNaq(query) yn_function(query,ynNaqchars, 'n') 200#define ynNaq(query) yn_function(query,ynNaqchars, 'y') 201 202/* Macros for scatter */ 203#define VIS_EFFECTS 0x01 /* display visual effects */ 204#define MAY_HITMON 0x02 /* objects may hit monsters */ 205#define MAY_HITYOU 0x04 /* objects may hit you */ 206#define MAY_HIT (MAY_HITMON|MAY_HITYOU) 207#define MAY_DESTROY 0x08 /* objects may be destroyed at random */ 208#define MAY_FRACTURE 0x10 /* boulders & statues may fracture */ 209 210/* Macros for launching objects */ 211#define ROLL 0x01 /* the object is rolling */ 212#define FLING 0x02 /* the object is flying thru the air */ 213#define LAUNCH_UNSEEN 0x40 /* hero neither caused nor saw it */ 214#define LAUNCH_KNOWN 0x80 /* the hero caused this by explicit action */ 215 216/* Macros for explosion types */ 217#define EXPL_DARK 0 218#define EXPL_NOXIOUS 1 219#define EXPL_MUDDY 2 220#define EXPL_WET 3 221#define EXPL_MAGICAL 4 222#define EXPL_FIERY 5 223#define EXPL_FROSTY 6 224#define EXPL_MAX 7 225 226/* Macros for messages referring to hands, eyes, feet, etc... */ 227#define ARM 0 228#define EYE 1 229#define FACE 2 230#define FINGER 3 231#define FINGERTIP 4 232#define FOOT 5 233#define HAND 6 234#define HANDED 7 235#define HEAD 8 236#define LEG 9 237#define LIGHT_HEADED 10 238#define NECK 11 239#define SPINE 12 240#define TOE 13 241#define HAIR 14 242#define BLOOD 15 243#define LUNG 16 244#define NOSE 17 245#define STOMACH 18 246 247/* Flags to control menus */ 248#define MENUTYPELEN sizeof("traditional ") 249#define MENU_TRADITIONAL 0 250#define MENU_COMBINATION 1 251#define MENU_PARTIAL 2 252#define MENU_FULL 3 253 254#define MENU_SELECTED TRUE 255#define MENU_UNSELECTED FALSE 256 257/* 258 * Option flags 259 * Each higher number includes the characteristics of the numbers 260 * below it. 261 */ 262#define SET_IN_FILE 0 /* config file option only */ 263#define SET_VIA_PROG 1 /* may be set via extern program, not seen in game */ 264#define DISP_IN_GAME 2 /* may be set via extern program, displayed in game */ 265#define SET_IN_GAME 3 /* may be set via extern program or set in the game */ 266 267#define FEATURE_NOTICE_VER(major,minor,patch) (((unsigned long)major << 24) | \ 268 ((unsigned long)minor << 16) | \ 269 ((unsigned long)patch << 8) | \ 270 ((unsigned long)0)) 271 272#define FEATURE_NOTICE_VER_MAJ (flags.suppress_alert >> 24) 273#define FEATURE_NOTICE_VER_MIN (((unsigned long)(0x0000000000FF0000L & flags.suppress_alert)) >> 16) 274#define FEATURE_NOTICE_VER_PATCH (((unsigned long)(0x000000000000FF00L & flags.suppress_alert)) >> 8) 275 276#ifndef max 277#define max(a,b) ((a) > (b) ? (a) : (b)) 278#endif 279#ifndef min 280#define min(x,y) ((x) < (y) ? (x) : (y)) 281#endif 282#define plur(x) (((x) == 1) ? "" : "s") 283 284#define ARM_BONUS(obj) (objects[(obj)->otyp].a_ac + (obj)->spe \ 285 - min((int)greatest_erosion(obj),objects[(obj)->otyp].a_ac)) 286 287#define makeknown(x) discover_object((x),TRUE,TRUE) 288#define distu(xx,yy) dist2((int)(xx),(int)(yy),(int)u.ux,(int)u.uy) 289#define onlineu(xx,yy) online2((int)(xx),(int)(yy),(int)u.ux,(int)u.uy) 290 291#define rn1(x,y) (rn2(x)+(y)) 292 293/* negative armor class is randomly weakened to prevent invulnerability */ 294#define AC_VALUE(AC) ((AC) >= 0 ? (AC) : -rnd(-(AC))) 295 296#if defined(MICRO) && !defined(__DJGPP__) 297#define getuid() 1 298#define getlogin() ((char *)0) 299#endif /* MICRO */ 300 301#if defined(OVERLAY)&&(defined(OVL0)||defined(OVL1)||defined(OVL2)||defined(OVL3)||defined(OVLB)) 302# define USE_OVLx 303# define STATIC_DCL extern 304# define STATIC_OVL 305# ifdef OVLB 306# define STATIC_VAR 307# else 308# define STATIC_VAR extern 309# endif 310 311#else /* !OVERLAY || (!OVL0 && !OVL1 && !OVL2 && !OVL3 && !OVLB) */ 312# define STATIC_DCL static 313# define STATIC_OVL static 314# define STATIC_VAR static 315 316/* If not compiling an overlay, compile everything. */ 317# define OVL0 /* highest priority */ 318# define OVL1 319# define OVL2 320# define OVL3 /* lowest specified priority */ 321# define OVLB /* the base overlay segment */ 322#endif /* OVERLAY && (OVL0 || OVL1 || OVL2 || OVL3 || OVLB) */ 323 324/* Macro for a few items that are only static if we're not overlaid.... */ 325#if defined(USE_TRAMPOLI) || defined(USE_OVLx) 326# define STATIC_PTR 327#else 328# define STATIC_PTR static 329#endif 330 331/* The function argument to qsort() requires a particular 332 * calling convention under WINCE which is not the default 333 * in that environment. 334 */ 335#if defined(WIN_CE) 336# define CFDECLSPEC __cdecl 337#else 338# define CFDECLSPEC 339#endif 340 341#endif /* HACK_H */ 342