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