Removed remaining SDL_mixer includes
[neverball] / ball / st_help.c
1 /*
2  * Copyright (C) 2003 Robert Kooima
3  *
4  * NEVERBALL is  free software; you can redistribute  it and/or modify
5  * it under the  terms of the GNU General  Public License as published
6  * by the Free  Software Foundation; either version 2  of the License,
7  * or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
11  * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
12  * General Public License for more details.
13  */
14
15 #include "gui.h"
16 #include "game.h"
17 #include "audio.h"
18 #include "config.h"
19 #include "demo.h"
20
21 #include "st_shared.h"
22 #include "st_title.h"
23 #include "st_help.h"
24
25 /*---------------------------------------------------------------------------*/
26
27 struct state st_help_demo;
28
29 /*---------------------------------------------------------------------------*/
30
31 #define HELP_BACK   0
32 #define HELP_RULE   1
33 #define HELP_CONT   2
34 #define HELP_MODE   3
35 #define HELP_TECH   4
36 #define HELP_DEMO_1 6
37 #define HELP_DEMO_2 7
38
39 static int tab = HELP_RULE;
40
41 /*---------------------------------------------------------------------------*/
42
43 static int help_action(int t)
44 {
45     audio_play(AUD_MENU, 1.0f);
46
47     switch (t)
48     {
49     case HELP_BACK:
50         tab = HELP_RULE;
51         return goto_state(&st_title);
52         break;
53
54     case HELP_DEMO_1:
55         demo_replay_init(config_data("gui/demo1.nbr"), NULL);
56         return goto_state(&st_help_demo);
57         break;
58
59     case HELP_DEMO_2:
60         demo_replay_init(config_data("gui/demo2.nbr"), NULL);
61         return goto_state(&st_help_demo);
62         break;
63
64     default:
65         tab = t;
66         return goto_state(&st_help);
67         break;
68     }
69     return 1;
70 }
71
72 /* -------------------------------------------------------------------------- */
73
74 static int help_button(int id, const char *text, int token)
75 {
76     int jd = gui_state(id, text, GUI_SML, token, (token == tab));
77
78     if (token == tab)
79         gui_focus(jd);
80
81     return jd;
82 }
83
84 static int help_menu(int id)
85 {
86     int jd;
87
88     gui_space(id);
89
90     if ((jd = gui_harray(id)))
91     {
92         help_button(jd, _("Techniques"), HELP_TECH);
93         help_button(jd, _("Modes"),      HELP_MODE);
94         help_button(jd, _("Controls"),   HELP_CONT);
95         help_button(jd, _("Rules"),      HELP_RULE);
96         help_button(jd, _("Back"),       HELP_BACK);
97     }
98     return jd;
99 }
100
101 /* -------------------------------------------------------------------------- */
102
103 static int help_rules(int id)
104 {
105     const char *s0 = _(
106         "Move the mouse or joystick\\"
107         "or use keyboard arrows to\\"
108         "tilt the floor causing the\\"
109         "ball to roll.\\");
110     const char *s1 = _(
111         "Roll over coins to collect\\"
112         "them.  Collect coins to\\"
113         "unlock the goal and finish\\"
114         "the level.\\");
115
116     int w = config_get_d(CONFIG_WIDTH);
117     int h = config_get_d(CONFIG_HEIGHT);
118
119     int jd, kd, ld;
120
121     if ((jd = gui_hstack(id)))
122     {
123         gui_filler(jd);
124
125         if ((kd = gui_varray(jd)))
126         {
127             if ((ld = gui_vstack(kd)))
128             {
129                 gui_space(ld);
130                 gui_multi(ld, s0, GUI_SML, GUI_ALL, gui_wht, gui_wht);
131                 gui_filler(ld);
132             }
133
134             if ((ld = gui_vstack(kd)))
135             {
136                 gui_space(ld);
137                 gui_multi(ld, s1, GUI_SML, GUI_ALL, gui_wht, gui_wht);
138                 gui_filler(ld);
139             }
140         }
141
142         gui_space(jd);
143
144         if ((kd = gui_varray(jd)))
145         {
146             if ((ld = gui_vstack(kd)))
147             {
148                 gui_space(ld);
149                 gui_image(ld, "gui/help1.jpg", 5 * w / 16, 5 * h / 16);
150                 gui_filler(ld);
151             }
152
153             if ((ld = gui_vstack(kd)))
154             {
155                 gui_space(ld);
156                 gui_image(ld, "gui/help2.jpg", 5 * w / 16, 5 * h / 16);
157                 gui_filler(ld);
158             }
159         }
160
161         gui_filler(jd);
162     }
163     return id;
164 }
165
166 static int help_controls(int id)
167 {
168     const char *s4 = _("Left and right mouse buttons rotate the view.");
169     const char *s5 = _("Hold Shift for faster view rotation.");
170     const char *s6 = _("Pause / Release Pointer");
171     const char *s7 = _("Exit / Cancel Menu");
172     const char *s8 = _("Chase View");
173     const char *s9 = _("Lazy View");
174     const char *sA = _("Manual View");
175     const char *sC = _("Screenshot");
176     const char *sD = _("Toggle Fullscreen");
177
178     const char *k0 = _(SDL_GetKeyName(config_get_d(CONFIG_KEY_PAUSE)));
179     const char *k1 = _("Escape");
180     const char *k2 = SDL_GetKeyName(config_get_d(CONFIG_KEY_CAMERA_1));
181     const char *k3 = SDL_GetKeyName(config_get_d(CONFIG_KEY_CAMERA_2));
182     const char *k4 = SDL_GetKeyName(config_get_d(CONFIG_KEY_CAMERA_3));
183     const char *k6 = SDL_GetKeyName(SDLK_F10);
184     const char *k7 = SDL_GetKeyName(SDLK_F11);
185
186     int jd;
187
188     gui_space(id);
189
190     if ((jd = gui_harray(id)))
191     {
192         gui_label(jd, s6, GUI_SML, GUI_NE, gui_wht, gui_wht);
193         gui_label(jd, k0, GUI_SML, GUI_NW, gui_yel, gui_yel);
194     }
195     if ((jd = gui_harray(id)))
196     {
197         gui_label(jd, s7, GUI_SML, 0,      gui_wht, gui_wht);
198         gui_label(jd, k1, GUI_SML, 0,      gui_yel, gui_yel);
199     }
200     if ((jd = gui_harray(id)))
201     {
202         gui_label(jd, s8, GUI_SML, 0,      gui_wht, gui_wht);
203         gui_label(jd, k2, GUI_SML, 0,      gui_yel, gui_yel);
204     }
205     if ((jd = gui_harray(id)))
206     {
207         gui_label(jd, s9, GUI_SML, 0,      gui_wht, gui_wht);
208         gui_label(jd, k3, GUI_SML, 0,      gui_yel, gui_yel);
209     }
210     if ((jd = gui_harray(id)))
211     {
212         gui_label(jd, sA, GUI_SML, 0,      gui_wht, gui_wht);
213         gui_label(jd, k4, GUI_SML, 0,      gui_yel, gui_yel);
214     }
215     if ((jd = gui_harray(id)))
216     {
217         gui_label(jd, sC, GUI_SML, 0,      gui_wht, gui_wht);
218         gui_label(jd, k6, GUI_SML, 0,      gui_yel, gui_yel);
219     }
220     if ((jd = gui_harray(id)))
221     {
222         gui_label(jd, sD, GUI_SML, GUI_SE, gui_wht, gui_wht);
223         gui_label(jd, k7, GUI_SML, GUI_SW, gui_yel, gui_yel);
224     }
225
226     gui_space(id);
227
228     gui_label(id, s4, GUI_SML, GUI_TOP, gui_wht, gui_wht);
229     gui_label(id, s5, GUI_SML, GUI_BOT, gui_wht, gui_wht);
230
231     return id;
232 }
233
234 static int help_modes(int id)
235 {
236     int jd, kd;
237
238     gui_space(id);
239
240     if ((jd = gui_hstack(id)))
241     {
242         gui_filler(jd);
243
244         if ((kd = gui_vstack(jd)))
245         {
246             gui_label(kd, _("Normal Mode"), GUI_SML, GUI_TOP, 0, 0);
247             gui_multi(kd,
248                       _("Finish a level before the time runs out.\\"
249                         "You need to collect coins in order to open the goal."),
250                       GUI_SML, GUI_BOT, gui_wht, gui_wht);
251
252             gui_space(kd);
253
254             gui_label(kd, _("Practice Mode"), GUI_SML, GUI_TOP, 0, 0);
255             gui_multi(kd,
256                       _("Play without time limit or coin constraint.\\"
257                         "Levels cannot be unlocked in this mode."),
258                       GUI_SML, GUI_BOT, gui_wht, gui_wht);
259
260             gui_space(kd);
261
262             gui_label(kd, _("Challenge Mode"), GUI_SML, GUI_TOP, 0, 0);
263             gui_multi(kd,
264                       _("Start playing from the first level of the set.\\"
265                         "You start with only four balls, do not lose them.\\"
266                         "Earn an extra ball for each 100 coins collected."),
267                       GUI_SML, GUI_BOT, gui_wht, gui_wht);
268         }
269
270         gui_filler(jd);
271     }
272     return id;
273 }
274
275 static int help_techniques(int id)
276 {
277     const char *s0 = _(
278         "Corners can be used to jump.\\"
279         "Get rolling and take aim\\"
280         "at the angle. You may be able\\"
281         "to reach new places.\\");
282     const char *s1 = _(
283         "Tilting in 2 directions increases\\"
284         "the slope. Use the manual view\\"
285         "and turn the camera by 45\\"
286         "degrees for best results.\\");
287
288     int w = config_get_d(CONFIG_WIDTH);
289     int h = config_get_d(CONFIG_HEIGHT);
290
291     int jd, kd, ld;
292
293     if ((jd = gui_hstack(id)))
294     {
295         gui_filler(jd);
296
297         if ((kd = gui_varray(jd)))
298         {
299             if ((ld = gui_vstack(kd)))
300             {
301                 gui_space(ld);
302                 gui_image(ld, "gui/help3.jpg", w / 4, h / 4);
303                 gui_state(ld, _("Watch demo"), GUI_SML, 0, 0);
304                 gui_filler(ld);
305
306                 gui_active(ld, HELP_DEMO_1, 0);
307             }
308
309             if ((ld = gui_vstack(kd)))
310             {
311                 gui_space(ld);
312                 gui_image(ld, "gui/help4.jpg", w / 4, h / 4);
313                 gui_state(ld, _("Watch demo"), GUI_SML, 0, 0);
314                 gui_filler(ld);
315
316                 gui_active(ld, HELP_DEMO_2, 0);
317             }
318         }
319
320         gui_space(jd);
321
322         if ((kd = gui_varray(jd)))
323         {
324             if ((ld = gui_vstack(kd)))
325             {
326                 gui_space(ld);
327                 gui_multi(ld, s0, GUI_SML, GUI_ALL, gui_wht, gui_wht);
328                 gui_filler(ld);
329             }
330
331             if ((ld = gui_vstack(kd)))
332             {
333                 gui_space(ld);
334                 gui_multi(ld, s1, GUI_SML, GUI_ALL, gui_wht, gui_wht);
335                 gui_filler(ld);
336             }
337         }
338
339         gui_filler(jd);
340     }
341     return id;
342 }
343
344 /* -------------------------------------------------------------------------- */
345
346 static int help_enter(void)
347 {
348     int id;
349
350     if ((id = gui_vstack(0)))
351     {
352         help_menu(id);
353
354         switch (tab)
355         {
356         case HELP_RULE: help_rules(id);      break;
357         case HELP_CONT: help_controls(id);   break;
358         case HELP_MODE: help_modes(id);      break;
359         case HELP_TECH: help_techniques(id); break;
360
361         default:
362             break;
363         }
364
365         gui_layout(id, 0, +1);
366     }
367     return id;
368 }
369
370 static int help_buttn(int b, int d)
371 {
372     if (d)
373     {
374         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
375             return help_action(gui_token(gui_click()));
376         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
377             return help_action(HELP_BACK);
378     }
379     return 1;
380 }
381
382 /*---------------------------------------------------------------------------*/
383
384 static float real_time;
385 static float demo_time;
386
387 static int help_demo_enter(void)
388 {
389     real_time = -1.f;
390     demo_time =  0.f;
391
392     game_set_fly(0.f);
393
394     return 0;
395 }
396
397 static void help_demo_leave(int id)
398 {
399     demo_replay_stop(0);
400 }
401
402 static void help_demo_paint(int id, float st)
403 {
404     game_draw(0, st);
405 }
406
407 static void help_demo_timer(int id, float dt)
408 {
409     float t;
410
411     real_time += dt;
412
413     game_step_fade(dt);
414
415     while (demo_time < real_time)
416         if (demo_replay_step(&t))
417             demo_time += t;
418         else
419         {
420             goto_state(&st_help);
421             break;
422         }
423 }
424
425 static int help_demo_buttn(int b, int d)
426 {
427     if (d)
428     {
429         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
430             return goto_state(&st_help);
431     }
432     return 1;
433 }
434 /*---------------------------------------------------------------------------*/
435
436 struct state st_help = {
437     help_enter,
438     shared_leave,
439     shared_paint,
440     shared_timer,
441     shared_point,
442     shared_stick,
443     shared_click,
444     NULL,
445     help_buttn,
446     1, 0
447 };
448
449 struct state st_help_demo = {
450     help_demo_enter,
451     help_demo_leave,
452     help_demo_paint,
453     help_demo_timer,
454     NULL,
455     NULL,
456     NULL,
457     NULL,
458     help_demo_buttn,
459     1, 0
460 };