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