debug-mode featuring backscrolling! Split up of st_setup.
[supertux.git] / src / menu.c
1 /*
2   menu.c
3   
4   Super Tux - Menu
5   
6   by Tobias Glaesser
7   tobi.web@gmx.de
8   http://www.newbreedsoftware.com/supertux/
9   
10   December 20, 2003
11 */
12
13 #ifdef LINUX
14 #include <pwd.h>
15 #include <sys/types.h>
16 #include <ctype.h>
17 #endif
18
19 #include "defines.h"
20 #include "globals.h"
21 #include "menu.h"
22 #include "screen.h"
23 #include "setup.h"
24 #include "sound.h"
25
26
27 /* Set defaults */
28 void initmenu(void)
29 {
30   menu_change = NO;
31   show_menu = NO;
32   menuitem = 0;
33   menumenu = 0;
34   menuaction = -1;
35 }
36
37 /* ---- Menu Options - Item Sound On/off ----*/
38 void menu_option_sound()
39 {
40   if (audio_device == YES) {
41     if(menuitem == 1) {
42        if(use_sound == YES) {
43          drawcenteredtext("Sound ON", 224, letters_red, NO_UPDATE);
44        }
45        else {
46          drawcenteredtext("Sound OFF", 224, letters_red, NO_UPDATE);
47        }
48
49        if(menuaction == MN_HIT) { /* Disable/Enable sound */
50          if(use_sound == YES) {
51            use_sound = NO;
52          }
53          else {
54            use_sound = YES;
55          }
56          menu_change = YES;
57        }
58     }
59     else {
60       if(use_sound == YES)
61         drawcenteredtext("Sound ON", 224, letters_blue, NO_UPDATE);
62       else
63         drawcenteredtext("Sound OFF", 224, letters_blue, NO_UPDATE);
64     }
65   }
66   else { /* if audio_device != YES */
67     /* let the user move over the deactivated option */
68     if (menuitem == 1) {
69       drawcenteredtext("Sound OFF", 224, letters_red, NO_UPDATE);
70     }
71     else {
72       drawcenteredtext("Sound OFF", 224, letters_black, NO_UPDATE);
73     }
74   }
75 }
76
77
78 /* ---- Menu Options - Item Music On/off ----*/
79 void menu_option_music()
80 {
81   if (audio_device == YES) {
82     if(menuitem == 2) {
83       if(use_music == YES) {
84         drawcenteredtext("Music ON", 256, letters_red, NO_UPDATE);
85       }
86      else {
87         drawcenteredtext("Music OFF", 256, letters_red, NO_UPDATE);
88       }
89       if(menuaction == MN_HIT) { /* Disable/Enable music */
90         if(use_music == YES) {  /* In the menu no music is played, so we have to check only use_music */
91              if(playing_music()) 
92               halt_music();
93              use_music = NO;
94         }
95         else {
96           use_music = YES;
97           if (!playing_music()) {
98             switch (current_music) {
99               case LEVEL_MUSIC:
100                 play_music(level_song, 1);
101                 break;
102               case HERRING_MUSIC:
103                 play_music(herring_song, 1);
104                 break;
105               case HURRYUP_MUSIC: // keep the compiler happy
106               case NO_MUSIC:      // keep the compiler happy for the moment :-)
107               {}
108                /*default:*/
109             }
110           }
111         }
112         menu_change = YES;
113       }
114     } /* if menuitem != 2 : print normal blue font */
115     else {
116       if(use_music == YES) {
117         drawcenteredtext("Music ON", 256, letters_blue, NO_UPDATE);
118       }
119       else {
120         drawcenteredtext("Music OFF", 256, letters_blue, NO_UPDATE);
121       }
122     }
123   }
124   else { /* if audio_device != YES */
125    /* let the user move over the deactivated option */
126     if (menuitem == 2) {
127       drawcenteredtext("Music OFF", 256, letters_red, NO_UPDATE);
128     }
129     else {
130       drawcenteredtext("Music OFF", 256, letters_black, NO_UPDATE);
131     }
132   }
133 }
134
135 /* --- MENU --- */
136 /* Draw the menu and execute the (menu)events */
137 int drawmenu(void)
138 {
139   int quit = 0;
140
141   menu_change = NO;
142
143
144   if(menuaction == MN_UP)
145     {
146       /* Go one menu-item up, if possible */
147       if(menuitem > 0)
148         --menuitem;
149     }
150   else if(menuaction == MN_DOWN)
151     ++menuitem; /* Go one menu-item down */
152
153
154   if(menumenu == MENU_MAIN)
155     {
156       /* Does the menu item exist? If not, we reset to the most down item */
157       if(menuitem >= MENU_MAIN_ITEM_MAX)
158         menuitem = MENU_MAIN_ITEM_MAX - 1;
159
160       /*The menu looks different, when the game is started */
161       if(game_started)
162         {
163           if(menuitem == 0)
164             {
165               drawcenteredtext("Return To Game", 192, letters_red, NO_UPDATE);
166               if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
167                 show_menu = 0;
168             }
169           else
170             drawcenteredtext("Return To Game", 192, letters_blue, NO_UPDATE);
171         }
172       else
173         {
174           if(menuitem == 0)
175             {
176               drawcenteredtext("Start Game", 192, letters_red, NO_UPDATE);
177               if(menuaction == MN_HIT) /* we are ready to start the game, if this item got hit */
178                 {
179                   game_started = 1;
180                   show_menu = 0;
181                 }
182             }
183           else
184             drawcenteredtext("Start Game", 192, letters_blue, NO_UPDATE);
185         }
186
187       if(menuitem == 1)
188         {
189           drawcenteredtext("Options", 224, letters_red, NO_UPDATE);
190           if(menuaction == MN_HIT) /* Switch to the 'Options' menu */
191             {
192               menumenu = MENU_OPTIONS;
193               menu_change = YES;
194             }
195         }
196       else
197         drawcenteredtext("Options", 224, letters_blue, NO_UPDATE);
198
199       if(menuitem == 2)
200         {
201           if(game_started)
202             drawcenteredtext("Quit Game", 256, letters_red, NO_UPDATE);
203           else
204             drawcenteredtext("Quit", 256, letters_red, NO_UPDATE);
205           if(menuaction == MN_HIT) /* Quit a running game or the application */
206             {
207               quit = 1;
208             }
209         }
210       else
211         {
212           if(game_started)
213             drawcenteredtext("Quit Game", 256, letters_blue, NO_UPDATE);
214           else
215             drawcenteredtext("Quit", 256, letters_blue, NO_UPDATE);
216         }
217
218     }
219   else if(menumenu == MENU_OPTIONS)
220     {
221       if(menuitem >= MENU_OPTIONS_ITEM_MAX )
222         menuitem = MENU_OPTIONS_ITEM_MAX - 1;
223
224       if(menuitem == 0)
225         {
226           if(use_fullscreen)
227             drawcenteredtext("Fullscreen ON", 192, letters_red, NO_UPDATE);
228           else
229             drawcenteredtext("Fullscreen OFF", 192, letters_red, NO_UPDATE);
230           if(menuaction == MN_HIT) /* Disable/Enable fullscreen */
231             {
232               if(use_fullscreen)
233                 use_fullscreen = 0;
234               else
235                 use_fullscreen = 1;
236               st_video_setup();
237               menu_change = YES;
238             }
239         }
240       else
241         {
242           if(use_fullscreen)
243             drawcenteredtext("Fullscreen ON", 192, letters_blue, NO_UPDATE);
244           else
245             drawcenteredtext("Fullscreen OFF", 192, letters_blue, NO_UPDATE);
246         }
247
248       /* handle menu sound on/off option */
249       menu_option_sound();     
250
251       /* handle menu music on/off option */
252       menu_option_music();
253    
254       if(menuitem == 3)
255         {
256           drawcenteredtext("Back", 288, letters_red, NO_UPDATE);
257           if(menuaction == MN_HIT) /* Go back to main menu. */
258             {
259               menumenu = MENU_MAIN;
260               menu_change = YES;
261             }
262         }
263       else
264         drawcenteredtext("Back", 288, letters_blue, NO_UPDATE);
265
266     }
267
268   menuaction = -1;
269
270   SDL_Flip(screen);
271
272   return quit;
273 }
274
275 /* Check for menu event */
276 void menu_event(SDLKey key)
277 {
278
279
280   if (key == SDLK_UP)
281     {
282       /* Menu Up */
283
284       menuaction = MN_UP;
285       menu_change = YES;
286     }
287   else if (key == SDLK_DOWN)
288     {
289       /* Menu Down */
290
291       menuaction = MN_DOWN;
292       menu_change = YES;
293     }
294   else if (key == SDLK_SPACE || key == SDLK_RETURN)
295     {
296       /* Menu Hit */
297
298       menuaction = MN_HIT;
299       menu_change = YES;
300     }
301
302   /* FIXME: NO JOYSTICK SUPPORT */
303   /*#ifdef JOY_YES
304   else if (event.type == SDL_JOYBUTTONDOWN)
305    {
306       Joystick button: Continue: 
307      
308      done = 1;
309    }
310   #endif*/
311
312 }
313