1 /* NetHack 3.7	flag.h	$NHDT-Date: 1600933440 2020/09/24 07:44:00 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.185 $ */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /*-Copyright (c) Michael Allison, 2006. */
4 /* NetHack may be freely redistributed.  See license for details. */
5 
6 /* If you change the flag structure make sure you increment EDITLEVEL in   */
7 /* patchlevel.h if needed.  Changing the instance_flags structure does     */
8 /* not require incrementing EDITLEVEL.                                     */
9 
10 #ifndef FLAG_H
11 #define FLAG_H
12 
13 /*
14  * Persistent flags that are saved and restored with the game.
15  *
16  */
17 
18 struct flag {
19     boolean acoustics;       /* allow dungeon sound messages */
20     boolean autodig;         /* MRKR: Automatically dig */
21     boolean autoquiver;      /* Automatically fill quiver */
22     boolean autoopen;        /* open doors by walking into them */
23     boolean autounlock;      /* automatically apply unlocking tools */
24     boolean beginner;        /* True early in each game; affects feedback */
25     boolean biff;            /* enable checking for mail */
26     boolean bones;           /* allow saving/loading bones */
27     boolean confirm;         /* confirm before hitting tame monsters */
28     boolean dark_room;       /* show shadows in lit rooms */
29     boolean debug;           /* in debugging mode (aka wizard mode) */
30 #define wizard flags.debug
31     boolean end_own;         /* list all own scores */
32     boolean explore;         /* in exploration mode (aka discover mode) */
33 #define discover flags.explore
34     boolean female;
35     xchar orientation; /* index into orientations[] */
36 #define ORIENT_STRAIGHT 0
37 #define ORIENT_GAY 1
38 #define ORIENT_BISEXUAL 2
39     boolean friday13;        /* it's Friday the 13th */
40     boolean goldX;           /* for BUCX filtering, whether gold is X or U */
41     boolean help;            /* look in data file for info about stuff */
42     boolean ignintr;         /* ignore interrupts */
43     boolean implicit_uncursed; /* maybe omit "uncursed" status in inventory */
44     boolean ins_chkpt;       /* checkpoint as appropriate; INSURANCE */
45     boolean invlet_constant; /* let objects keep their inventory symbol */
46     boolean legacy;          /* print game entry "story" */
47     boolean lit_corridor;    /* show a dark corr as lit if it is in sight */
48     boolean mention_decor;   /* give feedback for unobscured furniture */
49     boolean mention_walls;   /* give feedback when bumping walls */
50     boolean nap;             /* `timed_delay' option for display effects */
51     boolean null;            /* OK to send nulls to the terminal */
52     boolean pickup;          /* whether you pickup or move and look */
53     boolean pickup_thrown;   /* auto-pickup items you threw */
54     boolean pushweapon; /* When wielding, push old weapon into second slot */
55     boolean quick_farsight;  /* True disables map browsing during random
56                               * clairvoyance */
57     boolean rest_on_space;   /* space means rest */
58     boolean safe_dog;        /* give complete protection to the dog */
59     boolean safe_wait;       /* prevent wait or search next to hostile */
60     boolean showexp;         /* show experience points */
61     boolean showscore;       /* show score */
62     boolean silent;          /* whether the bell rings or not */
63     boolean sortpack;        /* sorted inventory */
64     boolean sparkle;         /* show "resisting" special FX (Scott Bigham) */
65     boolean standout;        /* use standout for --More-- */
66     boolean time;            /* display elapsed 'time' */
67     boolean tombstone;       /* print tombstone */
68     boolean verbose;         /* max battle info */
69     int end_top, end_around; /* describe desired score list */
70     unsigned moonphase;
71     unsigned long suppress_alert;
72 #define NEW_MOON 0
73 #define FULL_MOON 4
74     unsigned paranoia_bits; /* alternate confirmation prompting */
75 #define PARANOID_CONFIRM    0x0001
76 #define PARANOID_QUIT       0x0002
77 #define PARANOID_DIE        0x0004
78 #define PARANOID_BONES      0x0008
79 #define PARANOID_HIT        0x0010
80 #define PARANOID_PRAY       0x0020
81 #define PARANOID_REMOVE     0x0040
82 #define PARANOID_BREAKWAND  0x0080
83 #define PARANOID_WERECHANGE 0x0100
84 #define PARANOID_EATING     0x0200
85 #define PARANOID_SWIM       0x0400
86 #define PARANOID_TRAP       0x0800
87 #define PARANOID_THROW      0x1000
88     int pickup_burden; /* maximum burden before prompt */
89     int pile_limit;    /* controls feedback when walking over objects */
90     char discosort;    /* order of dodiscovery/doclassdisco output: o,s,c,a */
91     char sortloot; /* 'n'=none, 'l'=loot (pickup), 'f'=full ('l'+invent) */
92     char inv_order[MAXOCLASSES];
93     char pickup_types[MAXOCLASSES];
94 #define NUM_DISCLOSURE_OPTIONS 6 /* i,a,v,g,c,o (decl.c) */
95 #define DISCLOSE_PROMPT_DEFAULT_YES 'y'
96 #define DISCLOSE_PROMPT_DEFAULT_NO 'n'
97 #define DISCLOSE_PROMPT_DEFAULT_SPECIAL '?' /* v, default a */
98 #define DISCLOSE_YES_WITHOUT_PROMPT '+'
99 #define DISCLOSE_NO_WITHOUT_PROMPT '-'
100 #define DISCLOSE_SPECIAL_WITHOUT_PROMPT '#' /* v, use a */
101     char end_disclose[NUM_DISCLOSURE_OPTIONS + 1]; /* disclose various
102                                                       info upon exit */
103     char menu_style;    /* User interface style setting */
104     boolean made_fruit; /* don't easily let user overflow fruit limit */
105 
106     /* KMH, role patch -- Variables used during startup.
107      *
108      * If the user wishes to select a role, race, gender, and/or alignment
109      * during startup, the choices should be recorded here.  This
110      * might be specified through command-line options, environmental
111      * variables, a popup dialog box, menus, etc.
112      *
113      * These values are each an index into an array.  They are not
114      * characters or letters, because that limits us to 26 roles.
115      * They are not booleans, because someday someone may need a neuter
116      * gender.  Negative values are used to indicate that the user
117      * hasn't yet specified that particular value.  If you determine
118      * that the user wants a random choice, then you should set an
119      * appropriate random value; if you just left the negative value,
120      * the user would be asked again!
121      *
122      * These variables are stored here because the u structure is
123      * cleared during character initialization, and because the
124      * flags structure is restored for saved games.  Thus, we can
125      * use the same parameters to build the role entry for both
126      * new and restored games.
127      *
128      * These variables should not be referred to after the character
129      * is initialized or restored (specifically, after role_init()
130      * is called).
131      */
132     int initrole;      /* starting role      (index into roles[])   */
133     int initrace;      /* starting race      (index into races[])   */
134     int initgend;      /* starting gender    (index into genders[]) */
135     int initalign;     /* starting alignment (index into aligns[])  */
136     int randomall;     /* randomly assign everything not specified */
137     int pantheon;      /* deity selection for priest character */
138     int polyinit_mnum; /* polyinit to this monster, -1 = no polyinit */
139     /* Items which were in iflags in 3.4.x to preserve savefile compatibility
140      */
141     boolean lootabc;   /* use "a/b/c" rather than "o/i/b" when looting */
142     boolean showrace;  /* show hero glyph by race rather than by role */
143     boolean travelcmd; /* allow travel command */
144     int runmode;       /* update screen display during run moves */
145 };
146 
147 /*
148  * Flags that are set each time the game is started.
149  * These are not saved with the game.
150  *
151  */
152 
153 /* values for iflags.getpos_coords */
154 #define GPCOORDS_NONE    'n'
155 #define GPCOORDS_MAP     'm'
156 #define GPCOORDS_COMPASS 'c'
157 #define GPCOORDS_COMFULL 'f'
158 #define GPCOORDS_SCREEN  's'
159 
160 enum getloc_filters {
161     GFILTER_NONE = 0,
162     GFILTER_VIEW,
163     GFILTER_AREA,
164 
165     NUM_GFILTER
166 };
167 
168 struct debug_flags {
169     boolean test;
170 #ifdef TTY_GRAPHICS
171     boolean ttystatus;
172 #endif
173 #ifdef WIN32
174     boolean immediateflips;
175 #endif
176 };
177 
178 struct instance_flags {
179     /* stuff that really isn't option or platform related. They are
180      * set and cleared during the game to control the internal
181      * behaviour of various NetHack functions and probably warrant
182      * a structure of their own elsewhere some day.
183      */
184     boolean debug_fuzzer;  /* fuzz testing */
185     boolean in_lua;        /* executing a lua script */
186     boolean defer_plname;  /* X11 hack: askname() might not set g.plname */
187     boolean herecmd_menu;  /* use menu when mouseclick on yourself */
188     boolean invis_goldsym; /* gold symbol is ' '? */
189     boolean sad_feeling;   /* unseen pet is dying */
190     int at_midnight;       /* only valid during end of game disclosure */
191     int at_night;          /* also only valid during end of game disclosure */
192     int failing_untrap;    /* move_into_trap() -> spoteffects() -> dotrap() */
193     int in_lava_effects;   /* hack for Boots_off() */
194     int last_msg;          /* indicator of last message player saw */
195     int override_ID;       /* true to force full identification of objects */
196     int parse_config_file_src;  /* hack for parse_config_line() */
197     int purge_monsters;    /* # of dead monsters still on fmon list */
198     int suppress_price;    /* controls doname() for unpaid objects */
199     int terrainmode; /* for getpos()'s autodescribe when #terrain is active */
200 #define TER_MAP    0x01
201 #define TER_TRP    0x02
202 #define TER_OBJ    0x04
203 #define TER_MON    0x08
204 #define TER_DETECT 0x10    /* detect_foo magic rather than #terrain */
205     boolean getloc_travelmode;
206     int getloc_filter;     /* GFILTER_foo */
207     boolean getloc_usemenu;
208     boolean getloc_moveskip;
209     coord travelcc;        /* coordinates for travel_cache */
210     boolean trav_debug;    /* display travel path (#if DEBUG only) */
211     boolean window_inited; /* true if init_nhwindows() completed */
212     boolean vision_inited; /* true if vision is ready */
213     boolean sanity_check;  /* run sanity checks */
214     boolean mon_polycontrol; /* debug: control monster polymorphs */
215     boolean in_dumplog;    /* doing the dumplog right now? */
216     boolean in_parse;      /* is a command being parsed? */
217      /* suppress terminate during options parsing, for --showpaths */
218     boolean initoptions_noterminate;
219 
220     /* stuff that is related to options and/or user or platform preferences
221      */
222     unsigned msg_history; /* hint: # of top lines to save */
223     int getpos_coords;    /* show coordinates when getting cursor position */
224     int menuinvertmode;  /* 0 = invert toggles every item;
225                             1 = invert skips 'all items' item */
226     int menu_headings;    /* ATR for menu headings */
227 #ifdef ALTMETA
228     boolean altmeta;      /* Alt-c sends ESC c rather than M-c */
229 #endif
230     boolean autodescribe;     /* autodescribe mode in getpos() */
231     boolean cbreak;           /* in cbreak mode, rogue format */
232     boolean deferred_X;       /* deferred entry into explore mode */
233     boolean defer_decor;      /* terrain change message vs slipping on ice */
234     boolean echo;             /* 1 to echo characters */
235     boolean force_invmenu;    /* always menu when handling inventory */
236     boolean hilite_pile;      /* mark piles of objects with a hilite */
237     boolean hilite_hidden_stairs; /* mark hidden stairs with a hilite */
238     boolean menu_head_objsym; /* Show obj symbol in menu headings */
239     boolean menu_overlay;     /* Draw menus over the map */
240     boolean menu_requested;   /* Flag for overloaded use of 'm' prefix
241                                * on some non-move commands */
242     boolean menu_tab_sep;     /* Use tabs to separate option menu fields */
243     boolean news;             /* print news */
244     boolean num_pad;          /* use numbers for movement commands */
245     boolean perm_invent;      /* keep full inventories up until dismissed */
246     boolean renameallowed;    /* can change hero name during role selection */
247     boolean renameinprogress; /* we are changing hero name */
248     boolean status_updates;   /* allow updates to bottom status lines;
249                                * disable to avoid excessive noise when using
250                                * a screen reader (use ^X to review status) */
251     boolean toptenwin;        /* ending list in window instead of stdout */
252     boolean tux_penalty;      /* True iff hero is a monk and wearing a suit */
253     boolean use_background_glyph; /* use background glyph when appropriate */
254     boolean use_menu_color;   /* use color in menus; only if wc_color */
255 #ifdef STATUS_HILITES
256     long hilite_delta;        /* number of moves to leave a temp hilite lit */
257     long unhilite_deadline; /* time when oldest temp hilite should be unlit */
258 #endif
259     boolean zerocomp;         /* write zero-compressed save files */
260     boolean rlecomp;          /* alternative to zerocomp; run-length encoding
261                                * compression of levels when writing savefile */
262     schar prev_decor;         /* 'mention_decor' just mentioned this */
263     uchar num_pad_mode;
264     uchar bouldersym;         /* symbol for boulder display */
265     char prevmsg_window;      /* type of old message window to use */
266     boolean extmenu;          /* extended commands use menu interface */
267 #ifdef MICRO
268     boolean BIOS; /* use IBM or ST BIOS calls when appropriate */
269 #endif
270 #if defined(MICRO) || defined(WIN32)
271     boolean rawio; /* whether can use rawio (IOCTL call) */
272 #endif
273 #ifdef MAC_GRAPHICS_ENV
274     boolean MACgraphics; /* use Macintosh extended character set, as
275                             as defined in the special font HackFont */
276     unsigned use_stone;  /* use the stone ppats */
277 #endif
278 #if defined(MSDOS) || defined(WIN32)
279     boolean hassound;     /* has a sound card */
280     boolean usesound;     /* use the sound card */
281     boolean usepcspeaker; /* use the pc speaker */
282     boolean tile_view;
283     boolean over_view;
284     boolean traditional_view;
285 #endif
286 #ifdef MSDOS
287     boolean hasvga; /* has a vga adapter */
288     boolean usevga; /* use the vga adapter */
289     boolean hasvesa; /* has a VESA-capable VGA adapter */
290     boolean usevesa; /* use the VESA-capable VGA adapter */
291     boolean grmode; /* currently in graphics mode */
292 #endif
293 #ifdef LAN_FEATURES
294     boolean lan_mail;         /* mail is initialized */
295     boolean lan_mail_fetched; /* mail is awaiting display */
296 #endif
297 #ifdef TTY_TILES_ESCCODES
298     boolean vt_tiledata;     /* output console codes for tile support in TTY */
299 #endif
300 #ifdef TTY_SOUND_ESCCODES
301     boolean vt_sounddata;    /* output console codes for sound support in TTY*/
302 #endif
303     boolean clicklook;       /* allow right-clicking for look */
304     boolean cmdassist;       /* provide detailed assistance for some comnds */
305     boolean time_botl;       /* context.botl for 'time' (moves) only */
306     boolean wizmgender;      /* test gender info from core in window port */
307     boolean invweight;       /* display weights of items in inventory */
308     boolean msg_is_alert;    /* suggest windowport should grab player's attention
309                               * and request <TAB> acknowlegement */
310     /*
311      * Window capability support.
312      */
313     boolean wc_color;         /* use color graphics                  */
314     boolean wc_hilite_pet;    /* hilight pets                        */
315     boolean wc_underline_peacefuls; /* underline peaceful monsters   */
316     boolean wc_ascii_map;     /* show map using traditional ascii    */
317     boolean wc_tiled_map;     /* show map using tiles                */
318     boolean wc_preload_tiles; /* preload tiles into memory           */
319     int wc_tile_width;        /* tile width                          */
320     int wc_tile_height;       /* tile height                         */
321     char *wc_tile_file;       /* name of tile file;overrides default */
322     boolean wc_inverse;       /* use inverse video for some things   */
323     int wc_align_status;      /*  status win at top|bot|right|left   */
324     int wc_align_message;     /* message win at top|bot|right|left   */
325     int wc_vary_msgcount;     /* show more old messages at a time    */
326     char *wc_foregrnd_menu; /* points to foregrnd color name for menu win   */
327     char *wc_backgrnd_menu; /* points to backgrnd color name for menu win   */
328     char *wc_foregrnd_message; /* points to foregrnd color name for msg win */
329     char *wc_backgrnd_message; /* points to backgrnd color name for msg win */
330     char *wc_foregrnd_status; /* points to foregrnd color name for status   */
331     char *wc_backgrnd_status; /* points to backgrnd color name for status   */
332     char *wc_foregrnd_text; /* points to foregrnd color name for text win   */
333     char *wc_backgrnd_text; /* points to backgrnd color name for text win   */
334     char *wc_font_map;      /* points to font name for the map win */
335     char *wc_font_message;  /* points to font name for message win */
336     char *wc_font_status;   /* points to font name for status win  */
337     char *wc_font_menu;     /* points to font name for menu win    */
338     char *wc_font_text;     /* points to font name for text win    */
339     int wc_fontsiz_map;     /* font size for the map win           */
340     int wc_fontsiz_message; /* font size for the message window    */
341     int wc_fontsiz_status;  /* font size for the status window     */
342     int wc_fontsiz_menu;    /* font size for the menu window       */
343     int wc_fontsiz_text;    /* font size for text windows          */
344     int wc_scroll_amount;   /* scroll this amount at scroll_margin */
345     int wc_scroll_margin;   /* scroll map when this far from the edge */
346     int wc_map_mode;        /* specify map viewing options, mostly
347                              * for backward compatibility */
348     int wc_player_selection;    /* method of choosing character */
349 #if defined(MSDOS)
350     unsigned wc_video_width;    /* X resolution of screen */
351     unsigned wc_video_height;   /* Y resolution of screen */
352 #endif
353     boolean wc_splash_screen;   /* display an opening splash screen or not */
354     boolean wc_popup_dialog;    /* put queries in pop up dialogs instead of
355                                  * in the message window */
356     boolean wc_eight_bit_input; /* allow eight bit input               */
357     boolean wc2_fullscreen;     /* run fullscreen */
358     boolean wc2_softkeyboard;   /* use software keyboard */
359     boolean wc2_wraptext;       /* wrap text */
360     boolean wc2_selectsaved;    /* display a menu of user's saved games */
361     boolean wc2_darkgray;    /* try to use dark-gray color for black glyphs */
362     boolean wc2_hitpointbar;  /* show graphical bar representing hit points */
363     boolean wc2_guicolor;       /* allow colours in gui (outside map) */
364     int wc_mouse_support;       /* allow mouse support */
365     int wc2_term_cols;		/* terminal width, in characters */
366     int wc2_term_rows;		/* terminal height, in characters */
367     int wc2_statuslines;        /* default = 2, curses can handle 3 */
368     int wc2_windowborders;	/* display borders on NetHack windows */
369     int wc2_petattr;            /* text attributes for pet */
370 #ifdef WIN32
371 #define MAX_ALTKEYHANDLER 25
372     char altkeyhandler[MAX_ALTKEYHANDLER];
373 #endif
374     /* copies of values in struct u, used during detection when the
375        originals are temporarily cleared; kept here rather than
376        locally so that they can be restored during a hangup save */
377     Bitfield(save_uswallow, 1);
378     Bitfield(save_uinwater, 1);
379     Bitfield(save_uburied, 1);
380     struct debug_flags debug;
381     boolean windowtype_locked;  /* windowtype can't change from configfile */
382     boolean windowtype_deferred; /* pick a windowport and store it in
383                                     chosen_windowport[], but do not switch to
384                                     it in the midst of options processing */
385     genericptr_t returning_missile; /* 'struct obj *'; Mjollnir or aklys */
386     boolean obsolete;  /* obsolete options can point at this, it isn't used */
387 };
388 
389 /*
390  * Old deprecated names
391  */
392 #ifdef TTY_GRAPHICS
393 #define eight_bit_tty wc_eight_bit_input
394 #endif
395 #define use_color wc_color
396 #define hilite_pet wc_hilite_pet
397 #define underline_peacefuls wc_underline_peacefuls
398 #define use_inverse wc_inverse
399 #ifdef MAC_GRAPHICS_ENV
400 #define large_font obsolete
401 #endif
402 #ifdef MAC
403 #define popup_dialog wc_popup_dialog
404 #endif
405 #define preload_tiles wc_preload_tiles
406 
407 extern NEARDATA struct flag flags;
408 extern NEARDATA struct instance_flags iflags;
409 
410 /* last_msg values
411  * Usage:
412  *  pline("some message");
413  *    pline: vsprintf + putstr + iflags.last_msg = PLNMSG_UNKNOWN;
414  *  iflags.last_msg = PLNMSG_some_message;
415  * and subsequent code can adjust the next message if it is affected
416  * by some_message.  The next message will clear iflags.last_msg.
417  */
418 enum plnmsg_types {
419     PLNMSG_UNKNOWN = 0,         /* arbitrary */
420     PLNMSG_ONE_ITEM_HERE,       /* "you see <single item> here" */
421     PLNMSG_TOWER_OF_FLAME,      /* scroll of fire */
422     PLNMSG_CAUGHT_IN_EXPLOSION, /* explode() feedback */
423     PLNMSG_OBJ_GLOWS,           /* "the <obj> glows <color>" */
424     PLNMSG_OBJNAM_ONLY,         /* xname/doname only, for #tip */
425     PLNMSG_OK_DONT_DIE,         /* overriding death in explore/wizard mode */
426     PLNMSG_BACK_ON_GROUND,      /* leaving water */
427     PLNMSG_GROWL,               /* growl() gave some message */
428     PLNMSG_enum /* allows inserting new entries with unconditional trailing comma */
429 };
430 
431 /* runmode options */
432 enum runmode_types {
433     RUN_TPORT = 0, /* don't update display until movement stops */
434     RUN_LEAP,      /* update display every 7 steps */
435     RUN_STEP,      /* update display every single step */
436     RUN_CRAWL      /* walk w/ extra delay after each update */
437 };
438 
439 /* paranoid confirmation prompting */
440 /* any yes confirmations also require explicit no (or ESC) to reject */
441 #define ParanoidConfirm ((flags.paranoia_bits & PARANOID_CONFIRM) != 0)
442 /* quit: yes vs y for "Really quit?" and "Enter explore mode?" */
443 #define ParanoidQuit ((flags.paranoia_bits & PARANOID_QUIT) != 0)
444 /* die: yes vs y for "Die?" (dying in explore mode or wizard mode) */
445 #define ParanoidDie ((flags.paranoia_bits & PARANOID_DIE) != 0)
446 /* hit: yes vs y for "Save bones?" in wizard mode */
447 #define ParanoidBones ((flags.paranoia_bits & PARANOID_BONES) != 0)
448 /* hit: yes vs y for "Really attack <the peaceful monster>?" */
449 #define ParanoidHit ((flags.paranoia_bits & PARANOID_HIT) != 0)
450 /* pray: ask "Really pray?" (accepts y answer, doesn't require yes),
451    taking over for the old prayconfirm boolean option */
452 #define ParanoidPray ((flags.paranoia_bits & PARANOID_PRAY) != 0)
453 /* remove: remove ('R') and takeoff ('T') commands prompt for an inventory
454    item even when only one accessory or piece of armor is currently worn */
455 #define ParanoidRemove ((flags.paranoia_bits & PARANOID_REMOVE) != 0)
456 /* breakwand: Applying a wand */
457 #define ParanoidBreakwand ((flags.paranoia_bits & PARANOID_BREAKWAND) != 0)
458 /* werechange: accepting randomly timed werecreature change to transform
459    from human to creature or vice versa while having polymorph control */
460 #define ParanoidWerechange ((flags.paranoia_bits & PARANOID_WERECHANGE) != 0)
461 /* continue eating: prompt given _after_first_bite_ when eating something
462    while satiated */
463 #define ParanoidEating ((flags.paranoia_bits & PARANOID_EATING) != 0)
464 /* swim: walk (not fly or jump or levitate) into water or lava from a
465  * non-similar square */
466 #define ParanoidSwim ((flags.paranoia_bits & PARANOID_SWIM) != 0)
467 /* trap: move onto a trap that you know is there */
468 #define ParanoidTrap ((flags.paranoia_bits & PARANOID_TRAP) != 0)
469 /* throw: throw ammo without a corresponding launcher wielded */
470 #define ParanoidThrow ((flags.paranoia_bits & PARANOID_THROW) != 0)
471 
472 /* command parsing, mainly dealing with number_pad handling;
473    not saved and restored */
474 
475 #ifdef NHSTDC
476 /* forward declaration sufficient to declare pointers */
477 struct ext_func_tab; /* from func_tab.h */
478 #endif
479 
480 enum gloctypes {
481     GLOC_MONS = 0,
482     GLOC_OBJS,
483     GLOC_DOOR,
484     GLOC_EXPLORE,
485     GLOC_INTERESTING,
486     GLOC_VALID,
487 
488     NUM_GLOCS
489 };
490 
491 #endif /* FLAG_H */
492