b2473acf4fb313675c9b733bf36dd76969ba6441
[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 #include "leveleditor.h"
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          drawshadedcenteredtext("Sound ON", 224, letters_red, NO_UPDATE);
44        }
45        else {
46          drawshadedcenteredtext("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         drawshadedcenteredtext("Sound ON", 224, letters_blue, NO_UPDATE);
62       else
63         drawshadedcenteredtext("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       drawshadedcenteredtext("Sound OFF", 224, letters_red, NO_UPDATE);
70     }
71     else {
72       drawshadedcenteredtext("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         drawshadedcenteredtext("Music ON", 256, letters_red, NO_UPDATE);
85       }
86      else {
87         drawshadedcenteredtext("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         drawshadedcenteredtext("Music ON", 256, letters_blue, NO_UPDATE);
118       }
119       else {
120         drawshadedcenteredtext("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       drawshadedcenteredtext("Music OFF", 256, letters_red, NO_UPDATE);
128     }
129     else {
130       drawshadedcenteredtext("Music OFF", 256, letters_black, NO_UPDATE);
131     }
132   }
133 }
134
135 int menu_main(void)
136 {
137     /* Does the menu item exist? If not, we reset to the most down item */
138       if(menuitem > MENU_MAIN_ITEM_MAX)
139         menuitem =0;
140      else if(menuitem < 0)
141        menuitem = MENU_MAIN_ITEM_MAX;
142        
143       /*The menu looks different, when the game is started */
144           if(menuitem == 0)
145             {
146               drawshadedcenteredtext("Start Game", 192, letters_red, NO_UPDATE);
147               if(menuaction == MN_HIT) /* we are ready to start the game, if this item got hit */
148                 {
149                   game_started = 1;
150                   show_menu = 0;
151                 }
152             }
153           else
154             drawshadedcenteredtext("Start Game", 192, letters_blue, NO_UPDATE);
155
156       if(menuitem == 1)
157         {
158           drawshadedcenteredtext("Options", 224, letters_red, NO_UPDATE);
159           if(menuaction == MN_HIT) /* Switch to the 'Options' menu */
160             {
161               menumenu = MENU_OPTIONS;
162               menu_change = YES;
163             }
164         }
165       else
166         drawshadedcenteredtext("Options", 224, letters_blue, NO_UPDATE);
167
168       if(menuitem == 2)
169         {
170           drawshadedcenteredtext("Level editor", 256, letters_red, NO_UPDATE);
171           if(menuaction == MN_HIT) /* Set variables, so that the level editor is executed */
172             {
173                level_editor_started = YES;
174                show_menu = 0;
175             }
176         }
177       else
178         drawshadedcenteredtext("Level editor", 256, letters_blue, NO_UPDATE);
179         
180       if(menuitem == 3)
181         {
182             drawshadedcenteredtext("Quit", 288, letters_red, NO_UPDATE);
183           if(menuaction == MN_HIT) /* Quit a running game or the application */
184             {
185                 return 1;
186             }
187         }
188       else
189         {
190             drawshadedcenteredtext("Quit", 288, letters_blue, NO_UPDATE);
191         }
192
193 return 0;
194 }
195
196 int menu_game(void)
197 {
198     /* Does the menu item exist? If not, we reset to the most down item */
199       if(menuitem > MENU_GAME_ITEM_MAX)
200         menuitem = 0;
201      else if(menuitem < 0)
202        menuitem = MENU_GAME_ITEM_MAX;
203
204       /*The menu looks different, when the game is started */
205           if(menuitem == 0)
206             {
207               drawshadedcenteredtext("Return To Game", 192, letters_red, NO_UPDATE);
208               if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
209                 show_menu = 0;
210             }
211           else
212             drawshadedcenteredtext("Return To Game", 192, letters_blue, NO_UPDATE);
213
214       if(menuitem == 1)
215         {
216           drawshadedcenteredtext("Options", 224, letters_red, NO_UPDATE);
217           if(menuaction == MN_HIT) /* Switch to the 'Options' menu */
218             {
219               menumenu = MENU_OPTIONS;
220               menu_change = YES;
221             }
222         }
223       else
224         drawshadedcenteredtext("Options", 224, letters_blue, NO_UPDATE);
225
226       if(menuitem == 2)
227         {
228             drawshadedcenteredtext("Quit Game", 256, letters_red, NO_UPDATE);
229           if(menuaction == MN_HIT) /* Quit a running game */
230                 return 1;
231         }
232       else
233         {
234             drawshadedcenteredtext("Quit Game", 256, letters_blue, NO_UPDATE);
235         }
236
237 return 0;
238 }
239
240 int menu_options(void)
241 {
242       if(menuitem > MENU_OPTIONS_ITEM_MAX )
243         menuitem = 0;
244      else if(menuitem < 0)
245        menuitem = MENU_OPTIONS_ITEM_MAX;
246        
247       if(menuitem == 0)
248         {
249           if(use_fullscreen)
250             drawshadedcenteredtext("Fullscreen ON", 192, letters_red, NO_UPDATE);
251           else
252             drawshadedcenteredtext("Fullscreen OFF", 192, letters_red, NO_UPDATE);
253           if(menuaction == MN_HIT) /* Disable/Enable fullscreen */
254             {
255               if(use_fullscreen)
256                 use_fullscreen = 0;
257               else
258                 use_fullscreen = 1;
259               st_video_setup();
260               menu_change = YES;
261             }
262         }
263       else
264         {
265           if(use_fullscreen)
266             drawshadedcenteredtext("Fullscreen ON", 192, letters_blue, NO_UPDATE);
267           else
268             drawshadedcenteredtext("Fullscreen OFF", 192, letters_blue, NO_UPDATE);
269        }
270
271       /* handle menu sound on/off option */
272       menu_option_sound();     
273
274       /* handle menu music on/off option */
275       menu_option_music();
276    
277       if(menuitem == 3)
278         {
279           drawshadedcenteredtext("Back", 288, letters_red, NO_UPDATE);
280           if(menuaction == MN_HIT) /* Go back to main menu. */
281             {
282               if(game_started)
283               menumenu = MENU_GAME;
284               else
285               menumenu = MENU_MAIN;
286               menu_change = YES;
287             }
288         }
289       else
290         drawshadedcenteredtext("Back", 288, letters_blue, NO_UPDATE);
291         
292 return 0;
293 }
294
295 /* Menu LevelEditor */
296 int menu_leveleditor(void)
297 {
298         if(menuitem > MENU_LEVELEDITOR_ITEM_MAX )
299         menuitem = 0;
300      else if(menuitem < 0)
301        menuitem = MENU_LEVELEDITOR_ITEM_MAX;
302        
303           if(menuitem == 0)
304             {
305               drawshadedcenteredtext("Return To Level Editor", 192, letters_red, NO_UPDATE);
306               if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
307                 show_menu = 0;
308             }
309           else
310             drawshadedcenteredtext("Return To Level Editor", 192, letters_blue, NO_UPDATE);
311         
312           if(menuitem == 1)
313             {
314               drawshadedcenteredtext("New Level", 224, letters_red, NO_UPDATE);
315               if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
316                 {
317                 show_menu = 0;
318                 newlevel();
319                 }
320             }
321           else
322             drawshadedcenteredtext("New Level", 224, letters_blue, NO_UPDATE);
323       if(menuitem == 2)
324         {
325             drawshadedcenteredtext("Load Level", 256, letters_red, NO_UPDATE);
326           if(menuaction == MN_HIT) /* Quit a running game or the application */
327             {
328             show_menu = 0;
329             selectlevel();
330             }
331         }
332         else
333         drawshadedcenteredtext("Load Level", 256, letters_blue, NO_UPDATE);
334       if(menuitem == 3)
335         {
336             drawshadedcenteredtext("Save Level", 288, letters_red, NO_UPDATE);
337           if(menuaction == MN_HIT) /* Quit a running game or the application */
338             {
339             show_menu = 0;
340             savelevel();
341             }
342         }
343         else
344         drawshadedcenteredtext("Save Level", 288, letters_blue, NO_UPDATE);
345
346       if(menuitem == 4)
347         {
348             drawshadedcenteredtext("Quit Level Editor", 320, letters_red, NO_UPDATE);
349           if(menuaction == MN_HIT) /* Quit a running game or the application */
350             {
351               return 1;
352             }
353         }
354         else
355         drawshadedcenteredtext("Quit Level Editor", 320, letters_blue, NO_UPDATE);
356
357 return 0;
358 }
359
360 /* --- MENU --- */
361 /* Draw the menu and execute the (menu)events */
362 int drawmenu(void)
363 {
364   int quit = 0;
365
366   menu_change = NO;
367
368
369   if(menuaction == MN_UP)
370     {
371       /* Go one menu-item up */
372         --menuitem;
373     }
374   else if(menuaction == MN_DOWN)
375     ++menuitem; /* Go one menu-item down */
376
377
378   if(menumenu == MENU_MAIN)
379     {
380       quit = menu_main();
381     }
382   else if(menumenu == MENU_GAME)
383     {
384       quit = menu_game();
385     }
386   else if(menumenu == MENU_OPTIONS)
387     {
388       quit = menu_options();
389     }
390     else if(menumenu == MENU_LEVELEDITOR)
391     {
392         quit = menu_leveleditor();
393     }
394
395   menuaction = -1;
396
397   return quit;
398 }
399
400 /* Check for menu event */
401 void menu_event(SDLKey key)
402 {
403
404
405   if (key == SDLK_UP)
406     {
407       /* Menu Up */
408
409       menuaction = MN_UP;
410       menu_change = YES;
411     }
412   else if (key == SDLK_DOWN)
413     {
414       /* Menu Down */
415
416       menuaction = MN_DOWN;
417       menu_change = YES;
418     }
419   else if (key == SDLK_SPACE || key == SDLK_RETURN)
420     {
421       /* Menu Hit */
422
423       menuaction = MN_HIT;
424       menu_change = YES;
425     }
426
427   /* FIXME: NO JOYSTICK SUPPORT */
428   /*#ifdef JOY_YES
429   else if (event.type == SDL_JOYBUTTONDOWN)
430    {
431       Joystick button: Continue: 
432      
433      done = 1;
434    }
435   #endif*/
436
437 }
438