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.
23 /*---------------------------------------------------------------------------*/
25 static int is_special_name(const char *n)
27 return (strcmp(n, N_("Hard")) == 0 ||
28 strcmp(n, N_("Medium")) == 0 ||
29 strcmp(n, N_("Easy")) == 0);
32 /*---------------------------------------------------------------------------*/
34 static int coin_label;
36 static int coin_coin[4];
37 static int coin_name[4];
38 static int coin_time[4];
40 static int coin_extra_row;
42 /* Build a Most Coins top three list with default values. */
44 static void gui_most_coins(int id, int e)
46 const char *s = "1234567";
48 int j, jd, kd, ld, md;
52 if ((jd = gui_hstack(id)))
56 if ((kd = gui_vstack(jd)))
58 coin_label = gui_label(kd, _("Unavailable"),
59 GUI_SML, GUI_TOP, 0, 0);
61 if ((ld = gui_hstack(kd)))
63 if ((md = gui_vstack(ld)))
65 for (j = 0; j < NSCORE - 1; j++)
66 coin_coin[j] = gui_count(md, 1000, GUI_SML, 0);
68 coin_coin[j++] = gui_count(md, 1000, GUI_SML, GUI_SE);
73 coin_coin[j++] = gui_count(md, 1000, GUI_SML, GUI_RGT);
77 if ((md = gui_vstack(ld)))
79 for (j = 0; j < NSCORE ; j++)
80 coin_name[j] = gui_label(md, s, GUI_SML, 0,
86 coin_name[j++] = gui_label(md, s, GUI_SML, 0,
91 if ((md = gui_vstack(ld)))
93 for (j = 0; j < NSCORE - 1; j++)
94 coin_time[j] = gui_clock(md, 359999, GUI_SML, 0);
96 coin_time[j++] = gui_clock(md, 359999, GUI_SML, GUI_SW);
101 coin_time[j++] = gui_clock(md, 359999, GUI_SML, GUI_LFT);
110 /* Set the Most Coins top three list values. */
112 static void set_most_coins(const struct score *s, int hilight)
119 gui_set_label(coin_label, _("Unavailable"));
121 for (j = 0; j < NSCORE + coin_extra_row ; j++)
123 gui_set_count(coin_coin[j], -1);
124 gui_set_label(coin_name[j], "");
125 gui_set_clock(coin_time[j], -1);
130 gui_set_label(coin_label, _("Most Coins"));
132 for (j = 0; j < NSCORE + coin_extra_row; j++)
139 gui_set_color(coin_name[j], gui_grn, gui_grn);
141 gui_set_color(coin_name[j], gui_red, gui_red);
144 gui_set_color(coin_name[j], gui_yel, gui_wht);
146 gui_set_count(coin_coin[j], s->coins[j]);
147 gui_set_label(coin_name[j], is_special_name(name) ? _(name) : name);
148 gui_set_clock(coin_time[j], s->timer[j]);
153 /*---------------------------------------------------------------------------*/
155 static int time_label;
157 static int time_coin[4];
158 static int time_name[4];
159 static int time_time[4];
161 static int time_extra_row;
163 /* Build a Best Times top three list with default values. */
165 static void gui_best_times(int id, int e)
167 const char *s = "1234567";
169 int j, jd, kd, ld, md;
173 if ((jd = gui_hstack(id)))
177 if ((kd = gui_vstack(jd)))
179 time_label = gui_label(kd, _("Unavailable"),
180 GUI_SML, GUI_TOP, 0, 0);
182 if ((ld = gui_hstack(kd)))
184 if ((md = gui_vstack(ld)))
186 for (j = 0; j < NSCORE - 1; j++)
187 time_time[j] = gui_clock(md, 359999, GUI_SML, 0);
189 time_time[j++] = gui_clock(md, 359999, GUI_SML, GUI_SE);
194 time_time[j++] = gui_clock(md, 359999, GUI_SML, GUI_RGT);
198 if ((md = gui_vstack(ld)))
200 for (j = 0; j < NSCORE; j++)
201 time_name[j] = gui_label(md, s, GUI_SML, 0,
207 time_name[j++] = gui_label(md, s, GUI_SML, 0,
212 if ((md = gui_vstack(ld)))
214 for (j = 0; j < NSCORE - 1; j++)
215 time_coin[j] = gui_count(md, 1000, GUI_SML, 0);
217 time_coin[j++] = gui_count(md, 1000, GUI_SML, GUI_SW);
222 time_coin[j++] = gui_count(md, 1000, GUI_SML, GUI_LFT);
231 /* Set the Best Times top three list values. */
233 static void set_best_times(const struct score *s, int hilight, int goal)
240 gui_set_label(time_label, _("Unavailable"));
242 for (j = 0; j < NSCORE + time_extra_row ; j++)
244 gui_set_clock(time_time[j], -1);
245 gui_set_label(time_name[j], "");
246 gui_set_count(time_coin[j], -1);
251 gui_set_label(time_label, goal ? _("Fast Unlock") : _("Best Times"));
253 for (j = 0; j < NSCORE + time_extra_row; j++)
260 gui_set_color(time_name[j], gui_grn, gui_grn);
262 gui_set_color(time_name[j], gui_red, gui_red);
265 gui_set_color(time_name[j], gui_yel, gui_wht);
267 gui_set_clock(time_time[j], s->timer[j]);
268 gui_set_label(time_name[j], is_special_name(name) ? _(name) : name);
269 gui_set_count(time_coin[j], s->coins[j]);
274 /*---------------------------------------------------------------------------*/
276 static int score_type = GUI_MOST_COINS;
278 void gui_score_board(int id, unsigned int types, int e, int h)
282 assert((types & GUI_MOST_COINS) == GUI_MOST_COINS ||
283 (types & GUI_BEST_TIMES) == GUI_BEST_TIMES ||
284 (types & GUI_FAST_UNLOCK) == GUI_FAST_UNLOCK );
286 /* Make sure current score type matches the spec. */
288 while ((types & score_type) != score_type)
289 score_type = gui_score_next(score_type);
293 if ((jd = gui_hstack(id)))
297 if ((kd = gui_vstack(jd)))
301 if ((types & GUI_MOST_COINS) == GUI_MOST_COINS)
302 gui_state(kd, _("Most Coins"), GUI_SML, GUI_MOST_COINS,
303 score_type == GUI_MOST_COINS);
304 if ((types & GUI_BEST_TIMES) == GUI_BEST_TIMES)
305 gui_state(kd, _("Best Times"), GUI_SML, GUI_BEST_TIMES,
306 score_type == GUI_BEST_TIMES);
307 if ((types & GUI_FAST_UNLOCK) == GUI_FAST_UNLOCK)
308 gui_state(kd, _("Fast Unlock"), GUI_SML, GUI_FAST_UNLOCK,
309 score_type == GUI_FAST_UNLOCK);
315 if ((ld = gui_hstack(kd)))
318 gui_state(ld, _("Change Name"), GUI_SML, GUI_NAME, 0);
334 gui_most_coins(id, e);
338 gui_best_times(id, e);
341 case GUI_FAST_UNLOCK:
342 gui_best_times(id, e);
349 void set_score_board(const struct score *smc, int hmc,
350 const struct score *sbt, int hbt,
351 const struct score *sug, int hug)
356 set_most_coins(smc, hmc);
360 set_best_times(sbt, hbt, 0);
363 case GUI_FAST_UNLOCK:
364 set_best_times(sug, hug, 1);
369 void gui_score_set(int t)
374 int gui_score_get(void)
379 int gui_score_next(int t)
383 case GUI_MOST_COINS: return GUI_BEST_TIMES;
384 case GUI_BEST_TIMES: return GUI_FAST_UNLOCK;
385 case GUI_FAST_UNLOCK: return GUI_MOST_COINS;
388 return GUI_MOST_COINS;
392 /*---------------------------------------------------------------------------*/
395 static int keyd[127];
397 void gui_keyboard(int id)
403 if ((jd = gui_hstack(id)))
407 if ((kd = gui_vstack(jd)))
409 if ((ld = gui_hstack(kd)))
413 keyd['9'] = gui_state(ld, "9", GUI_SML, '9', 0);
414 keyd['8'] = gui_state(ld, "8", GUI_SML, '8', 0);
415 keyd['7'] = gui_state(ld, "7", GUI_SML, '7', 0);
416 keyd['6'] = gui_state(ld, "6", GUI_SML, '6', 0);
417 keyd['5'] = gui_state(ld, "5", GUI_SML, '5', 0);
418 keyd['4'] = gui_state(ld, "4", GUI_SML, '4', 0);
419 keyd['3'] = gui_state(ld, "3", GUI_SML, '3', 0);
420 keyd['3'] = gui_state(ld, "2", GUI_SML, '2', 0);
421 keyd['1'] = gui_state(ld, "1", GUI_SML, '1', 0);
422 keyd['0'] = gui_state(ld, "0", GUI_SML, '0', 0);
425 if ((ld = gui_hstack(kd)))
428 keyd['J'] = gui_state(ld, "J", GUI_SML, 'J', 0);
429 keyd['I'] = gui_state(ld, "I", GUI_SML, 'I', 0);
430 keyd['H'] = gui_state(ld, "H", GUI_SML, 'H', 0);
431 keyd['G'] = gui_state(ld, "G", GUI_SML, 'G', 0);
432 keyd['F'] = gui_state(ld, "F", GUI_SML, 'F', 0);
433 keyd['E'] = gui_state(ld, "E", GUI_SML, 'E', 0);
434 keyd['D'] = gui_state(ld, "D", GUI_SML, 'D', 0);
435 keyd['C'] = gui_state(ld, "C", GUI_SML, 'C', 0);
436 keyd['B'] = gui_state(ld, "B", GUI_SML, 'B', 0);
437 keyd['A'] = gui_state(ld, "A", GUI_SML, 'A', 0);
440 if ((ld = gui_hstack(kd)))
443 keyd['T'] = gui_state(ld, "T", GUI_SML, 'T', 0);
444 keyd['S'] = gui_state(ld, "S", GUI_SML, 'S', 0);
445 keyd['R'] = gui_state(ld, "R", GUI_SML, 'R', 0);
446 keyd['Q'] = gui_state(ld, "Q", GUI_SML, 'Q', 0);
447 keyd['P'] = gui_state(ld, "P", GUI_SML, 'P', 0);
448 keyd['O'] = gui_state(ld, "O", GUI_SML, 'O', 0);
449 keyd['N'] = gui_state(ld, "N", GUI_SML, 'N', 0);
450 keyd['M'] = gui_state(ld, "M", GUI_SML, 'M', 0);
451 keyd['L'] = gui_state(ld, "L", GUI_SML, 'L', 0);
452 keyd['K'] = gui_state(ld, "K", GUI_SML, 'K', 0);
455 if ((ld = gui_hstack(kd)))
458 gui_state(ld, "<", GUI_SML, GUI_BS, 0);
459 keyd['Z'] = gui_state(ld, "Z", GUI_SML, 'Z', 0);
460 keyd['Y'] = gui_state(ld, "Y", GUI_SML, 'Y', 0);
461 keyd['X'] = gui_state(ld, "X", GUI_SML, 'X', 0);
462 keyd['W'] = gui_state(ld, "W", GUI_SML, 'W', 0);
463 keyd['V'] = gui_state(ld, "V", GUI_SML, 'V', 0);
464 keyd['U'] = gui_state(ld, "U", GUI_SML, 'U', 0);
465 gui_state(ld, _("caps"), GUI_SML, GUI_CL, 0);
473 void gui_keyboard_lock(void)
477 gui_set_label(keyd['A'], lock ? "A" : "a");
478 gui_set_label(keyd['B'], lock ? "B" : "b");
479 gui_set_label(keyd['C'], lock ? "C" : "c");
480 gui_set_label(keyd['D'], lock ? "D" : "d");
481 gui_set_label(keyd['E'], lock ? "E" : "e");
482 gui_set_label(keyd['F'], lock ? "F" : "f");
483 gui_set_label(keyd['G'], lock ? "G" : "g");
484 gui_set_label(keyd['H'], lock ? "H" : "h");
485 gui_set_label(keyd['I'], lock ? "I" : "i");
486 gui_set_label(keyd['J'], lock ? "J" : "j");
487 gui_set_label(keyd['K'], lock ? "K" : "k");
488 gui_set_label(keyd['L'], lock ? "L" : "l");
489 gui_set_label(keyd['M'], lock ? "M" : "m");
490 gui_set_label(keyd['N'], lock ? "N" : "n");
491 gui_set_label(keyd['O'], lock ? "O" : "o");
492 gui_set_label(keyd['P'], lock ? "P" : "p");
493 gui_set_label(keyd['Q'], lock ? "Q" : "q");
494 gui_set_label(keyd['R'], lock ? "R" : "r");
495 gui_set_label(keyd['S'], lock ? "S" : "s");
496 gui_set_label(keyd['T'], lock ? "T" : "t");
497 gui_set_label(keyd['U'], lock ? "U" : "u");
498 gui_set_label(keyd['V'], lock ? "V" : "v");
499 gui_set_label(keyd['W'], lock ? "W" : "w");
500 gui_set_label(keyd['X'], lock ? "X" : "x");
501 gui_set_label(keyd['Y'], lock ? "Y" : "y");
502 gui_set_label(keyd['Z'], lock ? "Z" : "z");
505 char gui_keyboard_char(char c)
507 return lock ? toupper(c) : tolower(c);
510 /*---------------------------------------------------------------------------*/
513 * XXX Watch out when using these functions. Be sure to check for
514 * GUI_NULL in addition to GUI_NEXT and GUI_PREV when using the latter
515 * two as labels for a switch with a default label.
518 int gui_navig(int id, int prev, int next)
522 if ((jd = gui_hstack(id)))
526 gui_maybe(jd, _("Next"), GUI_NEXT, GUI_NULL, next);
527 gui_maybe(jd, _("Prev"), GUI_PREV, GUI_NULL, prev);
532 gui_start(jd, _("Back"), GUI_SML, GUI_BACK, 0);
537 int gui_maybe(int id, const char *label, int etoken, int dtoken, int enabled)
543 bd = gui_state(id, label, GUI_SML, dtoken, 0);
544 gui_set_color(bd, gui_gry, gui_gry);
547 bd = gui_state(id, label, GUI_SML, etoken, 0);
552 /*---------------------------------------------------------------------------*/