2ac0fe370cde5bad1d56e3ef6827cbd2db7ce7c0
[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 29, 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         show_menu = 0;
259         char *x = NULL;
260         loadgame(x);
261       }
262     }
263   else
264     drawcenteredtext("Load Game", 256, letters_blue, NO_UPDATE, 2);
265     
266   if(menuitem == 3)
267     {
268       drawcenteredtext("Options", 288, letters_red, NO_UPDATE, 2);
269       if(menuaction == MN_HIT) /* Switch to the 'Options' menu */
270         {
271           menumenu = MENU_OPTIONS;
272           menu_change = YES;
273         }
274     }
275   else
276     drawcenteredtext("Options", 288, letters_blue, NO_UPDATE, 2);
277
278   if(menuitem == 4)
279     {
280       drawcenteredtext("Quit Game", 320, letters_red, NO_UPDATE, 2);
281       if(menuaction == MN_HIT) /* Quit a running game */
282         return 1;
283     }
284   else
285     {
286       drawcenteredtext("Quit Game", 320, letters_blue, NO_UPDATE, 2);
287     }
288
289   return 0;
290 }
291
292 int menu_options(void)
293 {
294   if(menuitem > MENU_OPTIONS_ITEM_MAX )
295     menuitem = 0;
296   else if(menuitem < 0)
297     menuitem = MENU_OPTIONS_ITEM_MAX;
298
299   if(menuitem == 0)
300     {
301       if(use_fullscreen)
302         drawcenteredtext("Fullscreen ON", 192, letters_red, NO_UPDATE, 2);
303       else
304         drawcenteredtext("Fullscreen OFF", 192, letters_red, NO_UPDATE, 2);
305       if(menuaction == MN_HIT) /* Disable/Enable fullscreen */
306         {
307           if(use_fullscreen)
308             use_fullscreen = 0;
309           else
310             use_fullscreen = 1;
311           st_video_setup();
312           menu_change = YES;
313         }
314     }
315   else
316     {
317       if(use_fullscreen)
318         drawcenteredtext("Fullscreen ON", 192, letters_blue, NO_UPDATE, 2);
319       else
320         drawcenteredtext("Fullscreen OFF", 192, letters_blue, NO_UPDATE, 2);
321     }
322
323   /* handle menu sound on/off option */
324   menu_option_sound();
325
326   /* handle menu music on/off option */
327   menu_option_music();
328
329   if(menuitem == 3)
330     {
331       drawcenteredtext("Back", 288, letters_red, NO_UPDATE, 2);
332       if(menuaction == MN_HIT) /* Go back to main menu. */
333         {
334           if(game_started)
335             menumenu = MENU_GAME;
336           else
337             menumenu = MENU_MAIN;
338           menu_change = YES;
339         }
340     }
341   else
342     drawcenteredtext("Back", 288, letters_blue, NO_UPDATE, 2);
343
344   return 0;
345 }
346
347 /* Menu LevelEditor */
348 int menu_leveleditor(void)
349 {
350   if(menuitem > MENU_LEVELEDITOR_ITEM_MAX )
351     menuitem = 0;
352   else if(menuitem < 0)
353     menuitem = MENU_LEVELEDITOR_ITEM_MAX;
354
355   if(menuitem == 0)
356     {
357       drawcenteredtext("Return To Level Editor", 192, letters_red, NO_UPDATE, 2);
358       if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
359         show_menu = 0;
360     }
361   else
362     drawcenteredtext("Return To Level Editor", 192, letters_blue, NO_UPDATE, 2);
363
364   if(menuitem == 1)
365     {
366       drawcenteredtext("New Level", 224, letters_red, NO_UPDATE, 2);
367       if(menuaction == MN_HIT) /* Don't show the menu anymore, if this item got hit */
368         {
369           show_menu = 0;
370           newlevel();
371         }
372     }
373   else
374     drawcenteredtext("New Level", 224, letters_blue, NO_UPDATE, 2);
375   if(menuitem == 2)
376     {
377       drawcenteredtext("Load Level", 256, letters_red, NO_UPDATE, 2);
378       if(menuaction == MN_HIT) /* Create a new Level and load it into the level-editor. */
379         {
380           show_menu = 0;
381           selectlevel();
382         }
383     }
384   else
385     drawcenteredtext("Load Level", 256, letters_blue, NO_UPDATE, 2);
386   if(menuitem == 3)
387     {
388       drawcenteredtext("Save Level", 288, letters_red, NO_UPDATE, 2);
389       if(menuaction == MN_HIT) /* Save the current level in the level-editor. */
390         {
391           show_menu = 0;
392           savelevel();
393         }
394     }
395   else
396     drawcenteredtext("Save Level", 288, letters_blue, NO_UPDATE, 2);
397
398   if(menuitem == 4)
399     {
400       drawcenteredtext("Quit Level Editor", 320, letters_red, NO_UPDATE, 2);
401       if(menuaction == MN_HIT) /* Quit the level-editor. (to the main-menu) */
402         {
403           return 1;
404         }
405     }
406   else
407     drawcenteredtext("Quit Level Editor", 320, letters_blue, NO_UPDATE, 2);
408
409   return 0;
410 }
411
412 /* --- MENU --- */
413 /* Draw the menu and execute the (menu)events */
414 int drawmenu(void)
415 {
416   int quit = 0;
417
418   menu_change = NO;
419
420
421   if(menuaction == MN_UP)
422     {
423       /* Go one menu-item up */
424       --menuitem;
425     }
426   else if(menuaction == MN_DOWN)
427     ++menuitem; /* Go one menu-item down */
428
429
430   if(menumenu == MENU_MAIN)
431     {
432       quit = menu_main();
433     }
434   else if(menumenu == MENU_GAME)
435     {
436       quit = menu_game();
437     }
438   else if(menumenu == MENU_OPTIONS)
439     {
440       quit = menu_options();
441     }
442   else if(menumenu == MENU_LEVELEDITOR)
443     {
444       quit = menu_leveleditor();
445     }
446
447   menuaction = -1;
448
449   return quit;
450 }
451
452 /* Check for menu event */
453 void menu_event(SDLKey key)
454 {
455
456
457   if (key == SDLK_UP)
458     {
459       /* Menu Up */
460
461       menuaction = MN_UP;
462       menu_change = YES;
463     }
464   else if (key == SDLK_DOWN)
465     {
466       /* Menu Down */
467
468       menuaction = MN_DOWN;
469       menu_change = YES;
470     }
471   else if (key == SDLK_SPACE || key == SDLK_RETURN)
472     {
473       /* Menu Hit */
474
475       menuaction = MN_HIT;
476       menu_change = YES;
477     }
478
479   /* FIXME: NO JOYSTICK SUPPORT */
480   /*#ifdef JOY_YES
481   else if (event.type == SDL_JOYBUTTONDOWN)
482    {
483       Joystick button: Continue: 
484      
485      done = 1;
486    }
487   #endif*/
488
489 }
490