1 /* Emacs style mode select   -*- C++ -*-
2  *-----------------------------------------------------------------------------
3  *
4  *
5  *  PrBoom: a Doom port merged with LxDoom and LSDLDoom
6  *  based on BOOM, a modified and improved DOOM engine
7  *  Copyright (C) 1999 by
8  *  id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman
9  *  Copyright (C) 1999-2000 by
10  *  Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze
11  *  Copyright 2005, 2006 by
12  *  Florian Schulze, Colin Phipps, Neil Stevens, Andrey Budko
13  *
14  *  This program is free software; you can redistribute it and/or
15  *  modify it under the terms of the GNU General Public License
16  *  as published by the Free Software Foundation; either version 2
17  *  of the License, or (at your option) any later version.
18  *
19  *  This program is distributed in the hope that it will be useful,
20  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  *  GNU General Public License for more details.
23  *
24  *  You should have received a copy of the GNU General Public License
25  *  along with this program; if not, write to the Free Software
26  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27  *  02111-1307, USA.
28  *
29  * DESCRIPTION:
30  *   Menu widget stuff, episode selection and such.
31  *
32  *-----------------------------------------------------------------------------*/
33 
34 #ifndef __M_MENU__
35 #define __M_MENU__
36 
37 #include "d_event.h"
38 
39 //
40 // MENUS
41 //
42 // Called by main loop,
43 // saves config file and calls I_Quit when user exits.
44 // Even when the menu is not displayed,
45 // this can resize the view and change game parameters.
46 // Does all the real work of the menu interaction.
47 
48 dboolean M_Responder (event_t *ev);
49 
50 // Called by main loop,
51 // only used for menu (skull cursor) animation.
52 
53 void M_Ticker (void);
54 
55 // Called by main loop,
56 // draws the menus directly into the screen buffer.
57 
58 void M_Drawer (void);
59 
60 // Called by D_DoomMain,
61 // loads the config file.
62 
63 void M_Init (void);
64 
65 // Called by intro code to force menu up upon a keypress,
66 // does nothing if menu is already up.
67 
68 void M_StartControlPanel (void);
69 
70 void M_ForcedLoadGame(const char *msg); // killough 5/15/98: forced loadgames
71 
72 void M_Trans(void);          // killough 11/98: reset translucency
73 
74 void M_ResetMenu(void);      // killough 11/98: reset main menu ordering
75 
76 void M_DrawCredits(void);    // killough 11/98
77 
78 /* killough 8/15/98: warn about changes not being committed until next game */
79 #define warn_about_changes(x) (warning_about_changes=(x), \
80              print_warning_about_changes = 2)
81 
82 extern int warning_about_changes, print_warning_about_changes;
83 
84 extern dboolean menu_background;
85 
86 /****************************
87  *
88  *  The following #defines are for the m_flags field of each item on every
89  *  Setup Screen. They can be OR'ed together where appropriate
90  */
91 
92 #define S_HILITE     0x1 // Cursor is sitting on this item
93 #define S_SELECT     0x2 // We're changing this item
94 #define S_TITLE      0x4 // Title item
95 #define S_YESNO      0x8 // Yes or No item
96 #define S_CRITEM    0x10 // Message color
97 #define S_COLOR     0x20 // Automap color
98 #define S_CHAT      0x40 // Chat String
99 #define S_RESET     0x80 // Reset to Defaults Button
100 #define S_PREV     0x100 // Previous menu exists
101 #define S_NEXT     0x200 // Next menu exists
102 #define S_KEY      0x400 // Key Binding
103 #define S_WEAP     0x800 // Weapon #
104 #define S_NUM     0x1000 // Numerical item
105 #define S_SKIP    0x2000 // Cursor can't land here
106 #define S_KEEP    0x4000 // Don't swap key out
107 #define S_END     0x8000 // Last item in list (dummy)
108 #define S_LEVWARN 0x10000// killough 8/30/98: Always warn about pending change
109 #define S_PRGWARN 0x20000// killough 10/98: Warn about change until next run
110 #define S_BADVAL  0x40000// killough 10/98: Warn about bad value
111 #define S_FILE    0x80000// killough 10/98: Filenames
112 #define S_LEFTJUST 0x100000 // killough 10/98: items which are left-justified
113 #define S_CREDIT  0x200000  // killough 10/98: credit
114 #define S_BADVID  0x400000  // killough 12/98: video mode change error
115 #define S_CHOICE  0x800000  // this item has several values
116 
117 //e6y
118 #define S_DISABLE  0x1000000
119 
120 /* S_SHOWDESC  = the set of items whose description should be displayed
121  * S_SHOWSET   = the set of items whose setting should be displayed
122  * S_STRING    = the set of items whose settings are strings -- killough 10/98:
123  * S_HASDEFPTR = the set of items whose var field points to default array
124  */
125 
126 #define S_SHOWDESC (S_TITLE|S_YESNO|S_CRITEM|S_COLOR|S_CHAT|S_RESET|S_PREV|S_NEXT|S_KEY|S_WEAP|S_NUM|S_FILE|S_CREDIT|S_CHOICE)
127 
128 #define S_SHOWSET  (S_YESNO|S_CRITEM|S_COLOR|S_CHAT|S_KEY|S_WEAP|S_NUM|S_FILE|S_CHOICE)
129 
130 #define S_STRING (S_CHAT|S_FILE)
131 
132 #define S_HASDEFPTR (S_STRING|S_YESNO|S_NUM|S_WEAP|S_COLOR|S_CRITEM|S_CHOICE)
133 
134 /****************************
135  *
136  * The setup_group enum is used to show which 'groups' keys fall into so
137  * that you can bind a key differently in each 'group'.
138  */
139 
140 typedef enum {
141   m_null,       // Has no meaning; not applicable
142   m_scrn,       // A key can not be assigned to more than one action
143   m_map,        // in the same group. A key can be assigned to one
144   m_menu,       // action in one group, and another action in another.
145 } setup_group;
146 
147 /****************************
148  *
149  * phares 4/17/98:
150  * State definition for each item.
151  * This is the definition of the structure for each setup item. Not all
152  * fields are used by all items.
153  *
154  * A setup screen is defined by an array of these items specific to
155  * that screen.
156  *
157  * killough 11/98:
158  *
159  * Restructured to allow simpler table entries,
160  * and to Xref with defaults[] array in m_misc.c.
161  * Moved from m_menu.c to m_menu.h so that m_misc.c can use it.
162  */
163 
164 typedef struct setup_menu_s
165 {
166   const char  *m_text;  /* text to display */
167   int         m_flags;  /* phares 4/17/98: flag bits S_* (defined above) */
168   setup_group m_group;  /* Group */
169   short       m_x;      /* screen x position (left is 0) */
170   short       m_y;      /* screen y position (top is 0) */
171 
172   union  /* killough 11/98: The first field is a union of several types */
173   {
174     const void          *var;   /* generic variable */
175     int                 *m_key; /* key value, or 0 if not shown */
176     const char          *name;  /* name */
177     struct default_s    *def;   /* default[] table entry */
178     struct setup_menu_s *menu;  /* next or prev menu */
179   } var;
180 
181   int         *m_mouse; /* mouse button value, or 0 if not shown */
182   int         *m_joy;   /* joystick button value, or 0 if not shown */
183   void (*action)(void); /* killough 10/98: function to call after changing */
184   const char **selectstrings; /* list of strings for choice value */
185 } setup_menu_t;
186 
187 #endif
188