Remove "Credits" tab from the Help screen. Also rename a bunch of state
[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 "st_shared.h"
20
21 #include "st_title.h"
22 #include "st_help.h"
23
24 /*---------------------------------------------------------------------------*/
25
26 #define HELP_BACK   1
27 #define HELP_RULE   2
28 #define HELP_CONT   3
29 #define HELP_MODE   4
30 #define HELP_SECR   5
31
32 struct state st_help_rules;
33 struct state st_help_controls;
34 struct state st_help_modes;
35 struct state st_help_secrets;
36
37 static int help_action(int i)
38 {
39     audio_play(AUD_MENU, 1.0f);
40
41     switch (i)
42     {
43         case HELP_BACK: return goto_state(&st_title);
44         case HELP_RULE: return goto_state(&st_help_rules);
45         case HELP_CONT: return goto_state(&st_help_controls);
46         case HELP_MODE: return goto_state(&st_help_modes);
47         case HELP_SECR: return goto_state(&st_help_secrets);
48     }
49     return 1;
50 }
51
52 static int help_button(int id, const char *text, int token, int atoken)
53 {
54     int kd = gui_state(id, text, GUI_SML, token, token == atoken);
55
56     if (token == atoken)
57         gui_focus(kd);
58
59     return kd;
60 }
61
62 static int help_menu(int id, int i)
63 {
64     int jd;
65
66     gui_filler(id);
67     if ((jd = gui_harray(id)))
68     {
69         help_button(jd, _("Secrets"),  HELP_SECR, i);
70         help_button(jd, _("Modes"),    HELP_MODE, i);
71         help_button(jd, _("Controls"), HELP_CONT, i);
72         help_button(jd, _("Rules"),    HELP_RULE, i);
73         help_button(jd, _("Back"),     HELP_BACK, i);
74     }
75     gui_filler(id);
76     return jd;
77 }
78
79 static int help_enter(void)
80 {
81     goto_state(&st_help_rules);
82     return 0;
83 }
84
85 static int help_rules_enter(void)
86 {
87     const char *s0 = _(
88             "Move the mouse or joystick\\"
89             "or use keyboard arrows to\\"
90             "tilt the floor causing the\\"
91             "ball to roll.\\ ");
92     const char *s1 = _(
93             "Roll over coins to collect\\"
94             "them.  Collect coins to\\"
95             "unlock the goal and finish\\"
96             "the level.\\ ");
97
98     int w = config_get_d(CONFIG_WIDTH);
99     int h = config_get_d(CONFIG_HEIGHT);
100
101     int id, jd;
102
103     if ((id = gui_vstack(0)))
104     {
105         help_menu(id, HELP_RULE);
106
107         if ((jd = gui_hstack(id)))
108         {
109             gui_image(jd, "gui/help1.jpg", 6 * w / 16, 6 * h / 16);
110             gui_multi(jd, s0, GUI_SML, GUI_ALL, gui_wht, gui_wht);
111             gui_filler(jd);
112         }
113         gui_space(id);
114         if ((jd = gui_hstack(id)))
115         {
116             gui_filler(jd);
117             gui_multi(jd, s1, GUI_SML, GUI_ALL, gui_wht, gui_wht);
118             gui_image(jd, "gui/help2.jpg", 6 * w / 16, 6 * h / 16);
119         }
120         gui_layout(id, 0, +1);
121     }
122     return id;
123 }
124
125 static int help_controls_enter(void)
126 {
127     const char *s4 = _("Left and right mouse buttons rotate the view.");
128     const char *s5 = _("Hold Shift for faster view rotation.");
129     const char *s6 = _("Pause / Release Pointer");
130     const char *s7 = _("Exit / Cancel Menu");
131     const char *s8 = _("Chase View");
132     const char *s9 = _("Lazy View");
133     const char *sA = _("Manual View");
134     const char *sB = _("Show FPS");
135     const char *sC = _("Screenshot");
136     const char *sD = _("Toggle Fullscreen");
137
138     const char *k0 = _("Spacebar");
139     const char *k1 = _("Escape");
140     const char *k2 = SDL_GetKeyName(config_get_d(CONFIG_KEY_CAMERA_1));
141     const char *k3 = SDL_GetKeyName(config_get_d(CONFIG_KEY_CAMERA_2));
142     const char *k4 = SDL_GetKeyName(config_get_d(CONFIG_KEY_CAMERA_3));
143     const char *k5 = SDL_GetKeyName(SDLK_F9);
144     const char *k6 = SDL_GetKeyName(SDLK_F10);
145     const char *k7 = SDL_GetKeyName(SDLK_F11);
146
147     int id, jd;
148
149     if ((id = gui_vstack(0)))
150     {
151         help_menu(id, HELP_CONT);
152
153         if ((jd = gui_harray(id)))
154         {
155             gui_label(jd, s6, GUI_SML, GUI_NE, gui_wht, gui_wht);
156             gui_label(jd, k0, GUI_SML, GUI_NW, gui_yel, gui_yel);
157         }
158         if ((jd = gui_harray(id)))
159         {
160             gui_label(jd, s7, GUI_SML, 0,      gui_wht, gui_wht);
161             gui_label(jd, k1, GUI_SML, 0,      gui_yel, gui_yel);
162         }
163         if ((jd = gui_harray(id)))
164         {
165             gui_label(jd, s8, GUI_SML, 0,      gui_wht, gui_wht);
166             gui_label(jd, k2, GUI_SML, 0,      gui_yel, gui_yel);
167         }
168         if ((jd = gui_harray(id)))
169         {
170             gui_label(jd, s9, GUI_SML, 0,      gui_wht, gui_wht);
171             gui_label(jd, k3, GUI_SML, 0,      gui_yel, gui_yel);
172         }
173         if ((jd = gui_harray(id)))
174         {
175             gui_label(jd, sA, GUI_SML, GUI_SE, gui_wht, gui_wht);
176             gui_label(jd, k4, GUI_SML, GUI_SW, gui_yel, gui_yel);
177         }
178         if ((jd = gui_harray(id)))
179         {
180             gui_label(jd, sB, GUI_SML, GUI_SE, gui_wht, gui_wht);
181             gui_label(jd, k5, GUI_SML, GUI_SW, gui_yel, gui_yel);
182         }
183         if ((jd = gui_harray(id)))
184         {
185             gui_label(jd, sC, GUI_SML, GUI_SE, gui_wht, gui_wht);
186             gui_label(jd, k6, GUI_SML, GUI_SW, gui_yel, gui_yel);
187         }
188         if ((jd = gui_harray(id)))
189         {
190             gui_label(jd, sD, GUI_SML, GUI_SE, gui_wht, gui_wht);
191             gui_label(jd, k7, GUI_SML, GUI_SW, gui_yel, gui_yel);
192         }
193
194         gui_space(id);
195         gui_label(id, s4, GUI_SML, GUI_TOP, gui_wht, gui_wht);
196         gui_label(id, s5, GUI_SML, GUI_BOT, gui_wht, gui_wht);
197
198         gui_layout(id, 0, +1);
199     }
200     return id;
201 }
202
203 static int help_modes_enter(void)
204 {
205     int id;
206
207     if ((id = gui_vstack(0)))
208     {
209         help_menu(id, HELP_MODE);
210
211         gui_label(id, _("Normal"), GUI_SML, GUI_TOP, 0, 0);
212         gui_multi(id,
213                   "Finish a level before the time run out.\\"
214                   "You need to collect coins in order to open the goal.",
215                   GUI_SML, GUI_BOT, gui_wht, gui_wht);
216
217         gui_space(id);
218
219         gui_label(id, _("Practice"), GUI_SML, GUI_TOP, 0, 0);
220         gui_multi(id, "Play a level without time or coin constraint.",
221                   GUI_SML, GUI_BOT, gui_wht, gui_wht);
222
223         gui_space(id);
224
225         gui_label(id, _("Challenge"), GUI_SML, GUI_TOP, 0, 0);
226         gui_multi(id,
227                   "Start playing from the first level of the level set.\\"
228                   "You start with only four balls, do not lose them.\\"
229                   "Earn an extra ball for each 100 coins collected.",
230                   GUI_SML, GUI_BOT, gui_wht, gui_wht);
231
232         gui_layout(id, 0, +1);
233     }
234     return id;
235
236 }
237
238 static int help_secrets_enter(void)
239 {
240     const char *s0 = _(
241             "Such goals will transport\\"
242             "you to either a secret level\\"
243             "or a level further in the set.\\"
244             "You'll have to find them.\\");
245     const char *s1 = _(
246             "Angled acceleration works \\"
247             "in Neverball like in\\"
248             "some Doom-like games.\\"
249             "Best use with the manual view.\\ ");
250
251     int w = config_get_d(CONFIG_WIDTH);
252     int h = config_get_d(CONFIG_HEIGHT);
253
254     int id, jd;
255
256     if ((id = gui_vstack(0)))
257     {
258         help_menu(id, HELP_SECR);
259
260         if ((jd = gui_hstack(id)))
261         {
262             gui_filler(jd);
263             gui_multi(jd, s0, GUI_SML, GUI_ALL, gui_wht, gui_wht);
264             gui_image(jd, "gui/help3.jpg", 6 * w / 16, 6 * h / 16);
265         }
266         gui_space(id);
267         if ((jd = gui_hstack(id)))
268         {
269             gui_image(jd, "gui/help4.jpg", 6 * w / 16, 6 * h / 16);
270             gui_multi(jd, s1, GUI_SML, GUI_ALL, gui_wht, gui_wht);
271             gui_filler(jd);
272         }
273         gui_layout(id, 0, +1);
274     }
275     return id;
276 }
277
278 static int help_buttn(int b, int d)
279 {
280     if (d)
281     {
282         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
283             return help_action(gui_token(gui_click()));
284         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
285             return help_action(HELP_BACK);
286     }
287     return 1;
288 }
289
290 /*---------------------------------------------------------------------------*/
291
292 struct state st_help = {
293     help_enter,
294     NULL,
295     NULL,
296     NULL,
297     NULL,
298     NULL,
299     NULL,
300     NULL,
301     NULL,
302     1, 0
303 };
304
305 struct state st_help_rules = {
306     help_rules_enter,
307     shared_leave,
308     shared_paint,
309     shared_timer,
310     shared_point,
311     shared_stick,
312     shared_click,
313     NULL,
314     help_buttn,
315     1, 0
316 };
317
318 struct state st_help_controls = {
319     help_controls_enter,
320     shared_leave,
321     shared_paint,
322     shared_timer,
323     shared_point,
324     shared_stick,
325     shared_click,
326     NULL,
327     help_buttn,
328     1, 0
329 };
330
331 struct state st_help_modes = {
332     help_modes_enter,
333     shared_leave,
334     shared_paint,
335     shared_timer,
336     shared_point,
337     shared_stick,
338     shared_click,
339     NULL,
340     help_buttn,
341     1, 0
342 };
343
344 struct state st_help_secrets = {
345     help_secrets_enter,
346     shared_leave,
347     shared_paint,
348     shared_timer,
349     shared_point,
350     shared_stick,
351     shared_click,
352     NULL,
353     help_buttn,
354     1, 0
355 };
356