Those sets haven't been merged.
[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     
177     const char *k0 = _(SDL_GetKeyName((SDLKey) config_get_d(CONFIG_KEY_PAUSE)));
178     const char *k1 = _("Escape");
179     const char *k2 = SDL_GetKeyName((SDLKey) config_get_d(CONFIG_KEY_CAMERA_1));
180     const char *k3 = SDL_GetKeyName((SDLKey) config_get_d(CONFIG_KEY_CAMERA_2));
181     const char *k4 = SDL_GetKeyName((SDLKey) config_get_d(CONFIG_KEY_CAMERA_3));
182     const char *k6 = SDL_GetKeyName(SDLK_F10);
183
184     int jd;
185
186     gui_space(id);
187
188     if ((jd = gui_harray(id)))
189     {
190         gui_label(jd, s6, GUI_SML, GUI_NE, gui_wht, gui_wht);
191         gui_label(jd, k0, GUI_SML, GUI_NW, gui_yel, gui_yel);
192     }
193     if ((jd = gui_harray(id)))
194     {
195         gui_label(jd, s7, GUI_SML, 0,      gui_wht, gui_wht);
196         gui_label(jd, k1, GUI_SML, 0,      gui_yel, gui_yel);
197     }
198     if ((jd = gui_harray(id)))
199     {
200         gui_label(jd, s8, GUI_SML, 0,      gui_wht, gui_wht);
201         gui_label(jd, k2, GUI_SML, 0,      gui_yel, gui_yel);
202     }
203     if ((jd = gui_harray(id)))
204     {
205         gui_label(jd, s9, GUI_SML, 0,      gui_wht, gui_wht);
206         gui_label(jd, k3, GUI_SML, 0,      gui_yel, gui_yel);
207     }
208     if ((jd = gui_harray(id)))
209     {
210         gui_label(jd, sA, GUI_SML, 0,      gui_wht, gui_wht);
211         gui_label(jd, k4, GUI_SML, 0,      gui_yel, gui_yel);
212     }
213     if ((jd = gui_harray(id)))
214     {
215         gui_label(jd, sC, GUI_SML, 0,      gui_wht, gui_wht);
216         gui_label(jd, k6, GUI_SML, 0,      gui_yel, gui_yel);
217     }
218
219     gui_space(id);
220
221     gui_label(id, s4, GUI_SML, GUI_TOP, gui_wht, gui_wht);
222     gui_label(id, s5, GUI_SML, GUI_BOT, gui_wht, gui_wht);
223
224     return id;
225 }
226
227 static int help_modes(int id)
228 {
229     int jd, kd;
230
231     gui_space(id);
232
233     if ((jd = gui_hstack(id)))
234     {
235         gui_filler(jd);
236
237         if ((kd = gui_vstack(jd)))
238         {
239             gui_label(kd, _("Normal Mode"), GUI_SML, GUI_TOP, 0, 0);
240             gui_multi(kd,
241                       _("Finish a level before the time runs out.\\"
242                         "You need to collect coins in order to open the goal."),
243                       GUI_SML, GUI_BOT, gui_wht, gui_wht);
244
245             gui_space(kd);
246
247             gui_label(kd, _("Practice Mode"), GUI_SML, GUI_TOP, 0, 0);
248             gui_multi(kd,
249                       _("Play without time limit or coin constraint.\\"
250                         "Levels cannot be unlocked in this mode."),
251                       GUI_SML, GUI_BOT, gui_wht, gui_wht);
252
253             gui_space(kd);
254
255             gui_label(kd, _("Challenge Mode"), GUI_SML, GUI_TOP, 0, 0);
256             gui_multi(kd,
257                       _("Start playing from the first level of the set.\\"
258                         "You start with only four balls, do not lose them.\\"
259                         "Earn an extra ball for each 100 coins collected."),
260                       GUI_SML, GUI_BOT, gui_wht, gui_wht);
261         }
262
263         gui_filler(jd);
264     }
265     return id;
266 }
267
268 static int help_techniques(int id)
269 {
270     const char *s0 = _(
271         "Corners can be used to jump.\\"
272         "Get rolling and take aim\\"
273         "at the angle. You may be able\\"
274         "to reach new places.\\");
275     const char *s1 = _(
276         "Tilting in 2 directions increases\\"
277         "the slope. Use the manual view\\"
278         "and turn the camera by 45\\"
279         "degrees for best results.\\");
280
281     int w = config_get_d(CONFIG_WIDTH);
282     int h = config_get_d(CONFIG_HEIGHT);
283
284     int jd, kd, ld;
285
286     if ((jd = gui_hstack(id)))
287     {
288         gui_filler(jd);
289
290         if ((kd = gui_varray(jd)))
291         {
292             if ((ld = gui_vstack(kd)))
293             {
294                 gui_space(ld);
295                 gui_image(ld, "gui/help3.jpg", w / 4, h / 4);
296                 gui_state(ld, _("Watch demo"), GUI_SML, 0, 0);
297                 gui_filler(ld);
298
299                 gui_active(ld, HELP_DEMO_1, 0);
300             }
301
302             if ((ld = gui_vstack(kd)))
303             {
304                 gui_space(ld);
305                 gui_image(ld, "gui/help4.jpg", w / 4, h / 4);
306                 gui_state(ld, _("Watch demo"), GUI_SML, 0, 0);
307                 gui_filler(ld);
308
309                 gui_active(ld, HELP_DEMO_2, 0);
310             }
311         }
312
313         gui_space(jd);
314
315         if ((kd = gui_varray(jd)))
316         {
317             if ((ld = gui_vstack(kd)))
318             {
319                 gui_space(ld);
320                 gui_multi(ld, s0, GUI_SML, GUI_ALL, gui_wht, gui_wht);
321                 gui_filler(ld);
322             }
323
324             if ((ld = gui_vstack(kd)))
325             {
326                 gui_space(ld);
327                 gui_multi(ld, s1, GUI_SML, GUI_ALL, gui_wht, gui_wht);
328                 gui_filler(ld);
329             }
330         }
331
332         gui_filler(jd);
333     }
334     return id;
335 }
336
337 /* -------------------------------------------------------------------------- */
338
339 static int help_enter(void)
340 {
341     int id;
342
343     if ((id = gui_vstack(0)))
344     {
345         help_menu(id);
346
347         switch (tab)
348         {
349         case HELP_RULE: help_rules(id);      break;
350         case HELP_CONT: help_controls(id);   break;
351         case HELP_MODE: help_modes(id);      break;
352         case HELP_TECH: help_techniques(id); break;
353
354         default:
355             break;
356         }
357
358         gui_layout(id, 0, +1);
359     }
360     return id;
361 }
362
363 static int help_buttn(int b, int d)
364 {
365     if (d)
366     {
367         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
368             return help_action(gui_token(gui_click()));
369         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
370             return help_action(HELP_BACK);
371     }
372     return 1;
373 }
374
375 /*---------------------------------------------------------------------------*/
376
377 static int help_demo_enter(void)
378 {
379     game_set_fly(0.f);
380
381     return 0;
382 }
383
384 static void help_demo_leave(int id)
385 {
386     demo_replay_stop(0);
387 }
388
389 static void help_demo_paint(int id, float st)
390 {
391     game_draw(0, st);
392 }
393
394 static void help_demo_timer(int id, float dt)
395 {
396     game_step_fade(dt);
397
398     if (!demo_replay_step(dt))
399         goto_state(&st_help);
400 }
401
402 static int help_demo_buttn(int b, int d)
403 {
404     if (d)
405     {
406         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
407             return goto_state(&st_help);
408     }
409     return 1;
410 }
411 /*---------------------------------------------------------------------------*/
412
413 struct state st_help = {
414     help_enter,
415     shared_leave,
416     shared_paint,
417     shared_timer,
418     shared_point,
419     shared_stick,
420     shared_angle,
421     shared_click,
422     NULL,
423     help_buttn,
424     1, 0
425 };
426
427 struct state st_help_demo = {
428     help_demo_enter,
429     help_demo_leave,
430     help_demo_paint,
431     help_demo_timer,
432     NULL,
433     NULL,
434     NULL,
435     NULL,
436     NULL,
437     help_demo_buttn,
438     1, 0
439 };