Fixed parse errors.
[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 - December 30, 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 #include "gameloop.h"
27
28 /* Set defaults */
29 void initmenu(void)
30 {
31   menu_change = NO;
32   show_menu = NO;
33   menuitem = 0;
34   menumenu = 0;
35   menuaction = -1;
36 }
37
38 /* ---- Menu Options - Item Sound On/off ----*/
39 void menu_option_sound()
40 {
41   if (audio_device == YES)
42     {
43       if(menuitem == 1)
44         {
45           if(use_sound == YES)
46             {
47               drawcenteredtext("Sound ON", 224, letters_red, NO_UPDATE, 2);
48             }
49           else
50             {
51               drawcenteredtext("Sound OFF", 224, letters_red, NO_UPDATE, 2);
52             }
53
54           if(menuaction == MN_HIT)
55             { /* Disable/Enable sound */
56               if(use_sound == YES)
57                 {
58                   use_sound = NO;
59                 }
60               else
61                 {
62                   use_sound = YES;
63                 }
64               menu_change = YES;
65             }
66         }
67       else
68         {
69           if(use_sound == YES)
70             drawcenteredtext("Sound ON", 224, letters_blue, NO_UPDATE, 2);
71           else
72             drawcenteredtext("Sound OFF", 224, letters_blue, NO_UPDATE, 2);
73         }
74     }
75   else
76     { /* if audio_device != YES */
77       /* let the user move over the deactivated option */
78       if (menuitem == 1)
79         {
80           drawcenteredtext("Sound OFF", 224, letters_red, NO_UPDATE, 2);
81         }
82       else
83         {
84           drawcenteredtext("Sound OFF", 224, letters_black, NO_UPDATE, 2);
85         }
86     }
87 }
88
89
90 /* ---- Menu Options - Item Music On/off ----*/
91 void menu_option_music()
92 {
93   if (audio_device == YES)
94     {
95       if(menuitem == 2)
96         {
97           if(use_music == YES)
98             {
99               drawcenteredtext("Music ON", 256, letters_red, NO_UPDATE, 2);
100             }
101           else
102             {
103               drawcenteredtext("Music OFF", 256, letters_red, NO_UPDATE, 2);
104             }
105           if(menuaction == MN_HIT)
106             { /* Disable/Enable music */
107               if(use_music == YES)
108                 {  /* In the menu no music is played, so we have to check only use_music */
109                   if(playing_music())
110                     halt_music();
111                   use_music = NO;
112                 }
113               else
114                 {
115                   use_music = YES;
116                   if (!playing_music())
117                     {
118                       switch (current_music)
119                         {
120                         case LEVEL_MUSIC:
121                           play_music(level_song, 2);
122                           break;
123                         case HERRING_MUSIC:
124                           play_music(herring_song, 2);
125                           break;
126                         case HURRYUP_MUSIC: // keep the compiler happy
127                         case NO_MUSIC:      // keep the compiler happy for the moment :-)
128                         {}
129                           /*default:*/
130                         }
131                     }
132                 }
133               menu_change = YES;
134             }
135         } /* if menuitem != 2 : print normal blue font */
136       else
137         {
138           if(use_music == YES)
139             {
140               drawcenteredtext("Music ON", 256, letters_blue, NO_UPDATE, 2);
141             }
142           else
143             {
144               drawcenteredtext("Music OFF", 256, letters_blue, NO_UPDATE, 2);
145             }
146         }
147     }
148   else
149     { /* if audio_device != YES */
150       /* let the user move over the deactivated option */
151       if (menuitem == 2)
152         {
153           drawcenteredtext("Music OFF", 256, letters_red, NO_UPDATE, 2);
154         }
155       else
156         {
157           drawcenteredtext("Music OFF", 256, letters_black, NO_UPDATE, 2);
158         }
159     }
160 }
161
162 int menu_main(void)
163 {
164   /* Does the menu item exist? If not, we reset to the most down item */
165   if(menuitem > MENU_MAIN_ITEM_MAX)
166     menuitem =0;
167   else if(menuitem < 0)
168     menuitem = MENU_MAIN_ITEM_MAX;
169
170   /*The menu looks different, when the game is started */
171   if(menuitem == 0)
172     {
173       drawcenteredtext("Start Game", 192, letters_red, NO_UPDATE, 2);
174       if(menuaction == MN_HIT) /* we are ready to start the game, if this item got hit */
175         {
176           game_started = 1;
177           show_menu = 0;
178         }
179     }
180   else
181     drawcenteredtext("Start Game", 192, letters_blue, NO_UPDATE, 2);
182
183   if(menuitem == 1)
184     {
185       drawcenteredtext("Options", 224, letters_red, NO_UPDATE, 2);
186       if(menuaction == MN_HIT) /* Switch to the 'Options' menu */
187         {
188           menumenu = MENU_OPTIONS;
189           menu_change = YES;
190         }
191     }
192   else
193     drawcenteredtext("Options", 224, letters_blue, NO_UPDATE, 2);
194
195   if(menuitem == 2)
196     {
197       drawcenteredtext("Level editor", 256, letters_red, NO_UPDATE, 2);
198       if(menuaction == MN_HIT) /* Set variables, so that the level editor is executed */
199         {
200           level_editor_started = YES;
201           show_menu = 0;
202         }
203     }
204   else
205     drawcenteredtext("Level editor", 256, letters_blue, NO_UPDATE, 2);
206
207   if(menuitem == 3)
208     {
209       drawcenteredtext("Quit", 288, letters_red, NO_UPDATE, 2);
210       if(menuaction == MN_HIT) /* Quit a running game or the application */
211         {
212           return 1;
213         }
214     }
215   else
216     {
217       drawcenteredtext("Quit", 288, letters_blue, NO_UPDATE, 2);
218     }
219
220   return 0;
221 }
222
223 int menu_game(void)
224 {
225   /* Does the menu item exist? If not, we reset to the most down item */
226   if(menuitem > MENU_GAME_ITEM_MAX)
227     menuitem = 0;
228   else if(menuitem < 0)
229     menuitem = MENU_GAME_ITEM_MAX;
230
231   /*The menu looks different, when the game is started */
232   if(menuitem == 0)
233     {
234       drawcenteredtext("Return To Game", 192, letters_red, NO_UPDATE, 2);
235       if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
236         show_menu = 0;
237     }
238   else
239     drawcenteredtext("Return To Game", 192, letters_blue, NO_UPDATE, 2);
240     
241   if(menuitem == 1)
242     {
243       drawcenteredtext("Save Game", 224, letters_red, NO_UPDATE, 2);
244       if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
245       {
246         show_menu = 0;
247         savegame();
248       }
249     }
250   else
251     drawcenteredtext("Save Game", 224, letters_blue, NO_UPDATE, 2);
252     
253   if(menuitem == 2)
254     {
255       drawcenteredtext("Load Game", 256, letters_red, NO_UPDATE, 2);
256       if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
257       {
258         char *x = NULL;  /* In C, you can do this... */
259
260         show_menu = 0;
261         loadgame(x);
262       }
263     }
264   else
265     drawcenteredtext("Load Game", 256, letters_blue, NO_UPDATE, 2);
266     
267   if(menuitem == 3)
268     {
269       drawcenteredtext("Options", 288, letters_red, NO_UPDATE, 2);
270       if(menuaction == MN_HIT) /* Switch to the 'Options' menu */
271         {
272           menumenu = MENU_OPTIONS;
273           menu_change = YES;
274         }
275     }
276   else
277     drawcenteredtext("Options", 288, letters_blue, NO_UPDATE, 2);
278
279   if(menuitem == 4)
280     {
281       drawcenteredtext("Quit Game", 320, letters_red, NO_UPDATE, 2);
282       if(menuaction == MN_HIT) /* Quit a running game */
283         return 1;
284     }
285   else
286     {
287       drawcenteredtext("Quit Game", 320, letters_blue, NO_UPDATE, 2);
288     }
289
290   return 0;
291 }
292
293 int menu_options(void)
294 {
295   if(menuitem > MENU_OPTIONS_ITEM_MAX )
296     menuitem = 0;
297   else if(menuitem < 0)
298     menuitem = MENU_OPTIONS_ITEM_MAX;
299
300   if(menuitem == 0)
301     {
302       if(use_fullscreen)
303         drawcenteredtext("Fullscreen ON", 192, letters_red, NO_UPDATE, 2);
304       else
305         drawcenteredtext("Fullscreen OFF", 192, letters_red, NO_UPDATE, 2);
306       if(menuaction == MN_HIT) /* Disable/Enable fullscreen */
307         {
308           if(use_fullscreen)
309             use_fullscreen = 0;
310           else
311             use_fullscreen = 1;
312           st_video_setup();
313           menu_change = YES;
314         }
315     }
316   else
317     {
318       if(use_fullscreen)
319         drawcenteredtext("Fullscreen ON", 192, letters_blue, NO_UPDATE, 2);
320       else
321         drawcenteredtext("Fullscreen OFF", 192, letters_blue, NO_UPDATE, 2);
322     }
323
324   /* handle menu sound on/off option */
325   menu_option_sound();
326
327   /* handle menu music on/off option */
328   menu_option_music();
329
330   if(menuitem == 3)
331     {
332       drawcenteredtext("Back", 288, letters_red, NO_UPDATE, 2);
333       if(menuaction == MN_HIT) /* Go back to main menu. */
334         {
335           if(game_started)
336             menumenu = MENU_GAME;
337           else
338             menumenu = MENU_MAIN;
339           menu_change = YES;
340         }
341     }
342   else
343     drawcenteredtext("Back", 288, letters_blue, NO_UPDATE, 2);
344
345   return 0;
346 }
347
348 /* Menu LevelEditor */
349 int menu_leveleditor(void)
350 {
351   if(menuitem > MENU_LEVELEDITOR_ITEM_MAX )
352     menuitem = 0;
353   else if(menuitem < 0)
354     menuitem = MENU_LEVELEDITOR_ITEM_MAX;
355
356   if(menuitem == 0)
357     {
358       drawcenteredtext("Return To Level Editor", 192, letters_red, NO_UPDATE, 2);
359       if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
360         show_menu = 0;
361     }
362   else
363     drawcenteredtext("Return To Level Editor", 192, letters_blue, NO_UPDATE, 2);
364
365   if(menuitem == 1)
366     {
367       drawcenteredtext("New Level", 224, letters_red, NO_UPDATE, 2);
368       if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
369         {
370           show_menu = 0;
371           newlevel();
372         }
373     }
374   else
375     drawcenteredtext("New Level", 224, letters_blue, NO_UPDATE, 2);
376   if(menuitem == 2)
377     {
378       drawcenteredtext("Load Level", 256, letters_red, NO_UPDATE, 2);
379       if(menuaction == MN_HIT) /* Create a new Level and load it into the level-editor. */
380         {
381           show_menu = 0;
382           selectlevel();
383         }
384     }
385   else
386     drawcenteredtext("Load Level", 256, letters_blue, NO_UPDATE, 2);
387   if(menuitem == 3)
388     {
389       drawcenteredtext("Save Level", 288, letters_red, NO_UPDATE, 2);
390       if(menuaction == MN_HIT) /* Save the current level in the level-editor. */
391         {
392           show_menu = 0;
393           savelevel();
394         }
395     }
396   else
397     drawcenteredtext("Save Level", 288, letters_blue, NO_UPDATE, 2);
398
399   if(menuitem == 4)
400     {
401       drawcenteredtext("Quit Level Editor", 320, letters_red, NO_UPDATE, 2);
402       if(menuaction == MN_HIT) /* Quit the level-editor. (to the main-menu) */
403         {
404           return 1;
405         }
406     }
407   else
408     drawcenteredtext("Quit Level Editor", 320, letters_blue, NO_UPDATE, 2);
409
410   return 0;
411 }
412
413 /* --- MENU --- */
414 /* Draw the menu and execute the (menu)events */
415 int drawmenu(void)
416 {
417   int quit = 0;
418
419   menu_change = NO;
420
421
422   if(menuaction == MN_UP)
423     {
424       /* Go one menu-item up */
425       --menuitem;
426     }
427   else if(menuaction == MN_DOWN)
428     ++menuitem; /* Go one menu-item down */
429
430
431   if(menumenu == MENU_MAIN)
432     {
433       quit = menu_main();
434     }
435   else if(menumenu == MENU_GAME)
436     {
437       quit = menu_game();
438     }
439   else if(menumenu == MENU_OPTIONS)
440     {
441       quit = menu_options();
442     }
443   else if(menumenu == MENU_LEVELEDITOR)
444     {
445       quit = menu_leveleditor();
446     }
447
448   menuaction = -1;
449
450   return quit;
451 }
452
453 /* Check for menu event */
454 void menu_event(SDLKey key)
455 {
456
457
458   if (key == SDLK_UP)
459     {
460       /* Menu Up */
461
462       menuaction = MN_UP;
463       menu_change = YES;
464     }
465   else if (key == SDLK_DOWN)
466     {
467       /* Menu Down */
468
469       menuaction = MN_DOWN;
470       menu_change = YES;
471     }
472   else if (key == SDLK_SPACE || key == SDLK_RETURN)
473     {
474       /* Menu Hit */
475
476       menuaction = MN_HIT;
477       menu_change = YES;
478     }
479
480   /* FIXME: NO JOYSTICK SUPPORT */
481   /*#ifdef JOY_YES
482   else if (event.type == SDL_JOYBUTTONDOWN)
483    {
484       Joystick button: Continue: 
485      
486      done = 1;
487    }
488   #endif*/
489
490 }
491