2 * Copyright (C) 2003 Robert Kooima
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.
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.
21 #include "game_common.h"
22 #include "game_server.h"
23 #include "game_client.h"
27 #include "st_shared.h"
29 /*---------------------------------------------------------------------------*/
33 #define HELP_CONTROLS 2
39 static int tab = HELP_RULES;
41 /*---------------------------------------------------------------------------*/
43 static int help_action(int t)
45 audio_play(AUD_MENU, 1.0f);
51 return goto_state(&st_title);
55 if (demo_replay_init("gui/demo1.nbr", NULL, NULL, NULL, NULL, NULL))
56 return goto_state(&st_help_demo);
60 if (demo_replay_init("gui/demo2.nbr", NULL, NULL, NULL, NULL, NULL))
61 return goto_state(&st_help_demo);
66 return goto_state(&st_help);
72 /* -------------------------------------------------------------------------- */
74 static int help_button(int id, const char *text, int token)
76 int jd = gui_state(id, text, GUI_SML, token, (token == tab));
84 static int help_menu(int id)
90 if ((jd = gui_harray(id)))
92 help_button(jd, _("Tricks"), HELP_TRICKS);
93 help_button(jd, _("Modes"), HELP_MODES);
94 help_button(jd, _("Controls"), HELP_CONTROLS);
95 help_button(jd, _("Rules"), HELP_RULES);
96 help_button(jd, _("Back"), HELP_BACK);
101 /* -------------------------------------------------------------------------- */
103 static int help_rules(int id)
106 "Move the mouse or joystick\\"
107 "or use keyboard arrows to\\"
108 "tilt the floor causing the\\"
111 "Roll over coins to collect\\"
112 "them. Collect coins to\\"
113 "unlock the goal and finish\\"
116 int w = config_get_d(CONFIG_WIDTH);
117 int h = config_get_d(CONFIG_HEIGHT);
121 if ((jd = gui_hstack(id)))
125 if ((kd = gui_varray(jd)))
127 if ((ld = gui_vstack(kd)))
130 gui_multi(ld, s0, GUI_SML, GUI_ALL, gui_wht, gui_wht);
134 if ((ld = gui_vstack(kd)))
137 gui_multi(ld, s1, GUI_SML, GUI_ALL, gui_wht, gui_wht);
144 if ((kd = gui_varray(jd)))
146 if ((ld = gui_vstack(kd)))
149 gui_image(ld, "gui/help1.jpg", 5 * w / 16, 5 * h / 16);
153 if ((ld = gui_vstack(kd)))
156 gui_image(ld, "gui/help2.jpg", 5 * w / 16, 5 * h / 16);
166 static int help_controls(int id)
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");
177 const char *k0 = pretty_keyname((SDLKey) config_get_d(CONFIG_KEY_PAUSE));
178 const char *k1 = pretty_keyname(SDLK_ESCAPE);
179 const char *k2 = pretty_keyname((SDLKey) config_get_d(CONFIG_KEY_CAMERA_1));
180 const char *k3 = pretty_keyname((SDLKey) config_get_d(CONFIG_KEY_CAMERA_2));
181 const char *k4 = pretty_keyname((SDLKey) config_get_d(CONFIG_KEY_CAMERA_3));
182 const char *k6 = pretty_keyname(SDLK_F10);
188 if ((jd = gui_harray(id)))
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);
193 if ((jd = gui_harray(id)))
195 gui_label(jd, s7, GUI_SML, 0, gui_wht, gui_wht);
196 gui_label(jd, k1, GUI_SML, 0, gui_yel, gui_yel);
198 if ((jd = gui_harray(id)))
200 gui_label(jd, s8, GUI_SML, 0, gui_wht, gui_wht);
201 gui_label(jd, k2, GUI_SML, 0, gui_yel, gui_yel);
203 if ((jd = gui_harray(id)))
205 gui_label(jd, s9, GUI_SML, 0, gui_wht, gui_wht);
206 gui_label(jd, k3, GUI_SML, 0, gui_yel, gui_yel);
208 if ((jd = gui_harray(id)))
210 gui_label(jd, sA, GUI_SML, 0, gui_wht, gui_wht);
211 gui_label(jd, k4, GUI_SML, 0, gui_yel, gui_yel);
213 if ((jd = gui_harray(id)))
215 gui_label(jd, sC, GUI_SML, GUI_SE, gui_wht, gui_wht);
216 gui_label(jd, k6, GUI_SML, GUI_SW, gui_yel, gui_yel);
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);
227 static int help_modes(int id)
233 if ((jd = gui_hstack(id)))
237 if ((kd = gui_vstack(jd)))
239 gui_label(kd, _("Normal Mode"), GUI_SML, GUI_TOP, 0, 0);
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);
247 gui_label(kd, _("Challenge Mode"), GUI_SML, GUI_TOP, 0, 0);
249 _("Start playing from the first level of the set.\\"
250 "You start with only three balls, do not lose them.\\"
251 "Earn an extra ball for each 100 coins collected."),
252 GUI_SML, GUI_BOT, gui_wht, gui_wht);
260 static int help_tricks(int id)
263 "Corners can be used to jump.\\"
264 "Get rolling and take aim\\"
265 "at the angle. You may be able\\"
266 "to reach new places.\\");
268 "Tilting in 2 directions increases\\"
269 "the slope. Use the manual view\\"
270 "and turn the camera by 45\\"
271 "degrees for best results.\\");
273 int w = config_get_d(CONFIG_WIDTH);
274 int h = config_get_d(CONFIG_HEIGHT);
278 if ((jd = gui_hstack(id)))
282 if ((kd = gui_varray(jd)))
284 if ((ld = gui_vstack(kd)))
287 gui_image(ld, "gui/help3.jpg", w / 4, h / 4);
288 gui_state(ld, _("Watch demo"), GUI_SML, 0, 0);
291 gui_active(ld, HELP_DEMO_1, 0);
294 if ((ld = gui_vstack(kd)))
297 gui_image(ld, "gui/help4.jpg", w / 4, h / 4);
298 gui_state(ld, _("Watch demo"), GUI_SML, 0, 0);
301 gui_active(ld, HELP_DEMO_2, 0);
307 if ((kd = gui_varray(jd)))
309 if ((ld = gui_vstack(kd)))
312 gui_multi(ld, s0, GUI_SML, GUI_ALL, gui_wht, gui_wht);
316 if ((ld = gui_vstack(kd)))
319 gui_multi(ld, s1, GUI_SML, GUI_ALL, gui_wht, gui_wht);
329 /* -------------------------------------------------------------------------- */
331 static int help_gui(void)
335 if ((id = gui_vstack(0)))
341 case HELP_RULES: help_rules(id); break;
342 case HELP_CONTROLS: help_controls(id); break;
343 case HELP_MODES: help_modes(id); break;
344 case HELP_TRICKS: help_tricks(id); break;
350 gui_layout(id, 0, +1);
356 static int help_enter(struct state *st, struct state *prev)
361 static int help_buttn(int b, int d)
365 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
366 return help_action(gui_token(gui_click()));
367 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
368 return help_action(HELP_BACK);
373 /*---------------------------------------------------------------------------*/
375 static int help_demo_enter(struct state *st, struct state *prev)
377 game_client_fly(0.0f);
381 static void help_demo_leave(struct state *st, struct state *next, int id)
386 static void help_demo_paint(int id, float t)
388 game_client_draw(0, t);
391 static void help_demo_timer(int id, float dt)
395 if (!demo_replay_step(dt))
396 goto_state(&st_help);
398 game_client_blend(demo_replay_blend());
401 static int help_demo_buttn(int b, int d)
405 if (config_tst_d(CONFIG_JOYSTICK_BUTTON_EXIT, b))
406 return goto_state(&st_help);
410 /*---------------------------------------------------------------------------*/
412 struct state st_help = {
425 struct state st_help_demo = {