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_btn_id;
35 static int time_btn_id;
36 static int goal_btn_id;
38 static void set_score_color(int id, int hi,
45 gui_set_color(id, c0, c0);
47 gui_set_color(id, c1, c1);
51 /*---------------------------------------------------------------------------*/
53 static int score_label;
55 static int score_coin[4];
56 static int score_name[4];
57 static int score_time[4];
59 static int score_extra_row;
61 /* Build a top three score list with default values. */
63 static void gui_scores(int id, int e)
65 const char *s = "1234567";
67 int j, jd, kd, ld, md;
71 if ((jd = gui_hstack(id)))
75 if ((kd = gui_vstack(jd)))
77 score_label = gui_label(kd, _("Unavailable"),
78 GUI_SML, GUI_TOP, 0, 0);
80 if ((ld = gui_hstack(kd)))
82 if ((md = gui_vstack(ld)))
84 for (j = RANK_HARD; j < RANK_EASY; j++)
85 score_coin[j] = gui_count(md, 1000, GUI_SML, 0);
87 score_coin[j++] = gui_count(md, 1000, GUI_SML, GUI_SE);
92 score_coin[j++] = gui_count(md, 1000, GUI_SML, GUI_RGT);
96 if ((md = gui_vstack(ld)))
98 for (j = RANK_HARD; j < RANK_LAST; j++)
100 score_name[j] = gui_label(md, s, GUI_SML, 0,
102 gui_set_trunc(score_name[j], TRUNC_TAIL);
108 score_name[j++] = gui_label(md, s, GUI_SML, 0,
110 gui_set_trunc(score_name[j - 1], TRUNC_TAIL);
114 if ((md = gui_vstack(ld)))
116 for (j = RANK_HARD; j < RANK_EASY; j++)
117 score_time[j] = gui_clock(md, 359999, GUI_SML, 0);
119 score_time[j++] = gui_clock(md, 359999, GUI_SML, GUI_SW);
124 score_time[j++] = gui_clock(md, 359999, GUI_SML, GUI_LFT);
133 /* Set the top three score list values. */
135 static void gui_set_scores(const char *label, const struct score *s, int hilite)
138 int j, n = score_extra_row ? RANK_LAST : RANK_EASY;
142 gui_set_label(score_label, _("Unavailable"));
144 for (j = RANK_HARD; j <= n; j++)
146 gui_set_count(score_coin[j], -1);
147 gui_set_label(score_name[j], "");
148 gui_set_clock(score_time[j], -1);
153 gui_set_label(score_label, label);
155 for (j = RANK_HARD; j <= n; j++)
160 set_score_color(score_name[j], j, gui_grn, gui_red);
162 gui_set_color(score_name[j], gui_yel, gui_wht);
164 gui_set_count(score_coin[j], s->coins[j]);
165 gui_set_label(score_name[j], is_special_name(name) ? _(name) : name);
166 gui_set_clock(score_time[j], s->timer[j]);
171 /*---------------------------------------------------------------------------*/
173 static int score_type = GUI_SCORE_COIN;
175 void gui_score_board(int pd, unsigned int types, int e, int h)
179 assert((types & GUI_SCORE_COIN) == GUI_SCORE_COIN ||
180 (types & GUI_SCORE_TIME) == GUI_SCORE_TIME ||
181 (types & GUI_SCORE_GOAL) == GUI_SCORE_GOAL );
183 /* Make sure current score type matches the spec. */
185 while ((types & score_type) != score_type)
186 score_type = gui_score_next(score_type);
188 if ((id = gui_hstack(pd)))
192 if ((jd = gui_hstack(id)))
196 if ((kd = gui_vstack(jd)))
200 if ((types & GUI_SCORE_COIN) == GUI_SCORE_COIN)
202 coin_btn_id = gui_state(kd, _("Most Coins"),
203 GUI_SML, GUI_SCORE_COIN,
204 score_type == GUI_SCORE_COIN);
206 if ((types & GUI_SCORE_TIME) == GUI_SCORE_TIME)
208 time_btn_id = gui_state(kd, _("Best Times"),
209 GUI_SML, GUI_SCORE_TIME,
210 score_type == GUI_SCORE_TIME);
212 if ((types & GUI_SCORE_GOAL) == GUI_SCORE_GOAL)
214 goal_btn_id = gui_state(kd, _("Fast Unlock"),
215 GUI_SML, GUI_SCORE_GOAL,
216 score_type == GUI_SCORE_GOAL);
223 if ((ld = gui_hstack(kd)))
226 gui_state(ld, _("Change Name"), GUI_SML, GUI_NAME, 0);
243 void set_score_board(const struct score *sc, int hc,
244 const struct score *st, int ht,
245 const struct score *sg, int hg)
250 gui_set_scores(_("Most Coins"), sc, hc);
254 gui_set_scores(_("Best Times"), st, ht);
258 gui_set_scores(_("Fast Unlock"), sg, hg);
262 set_score_color(coin_btn_id, hc, gui_grn, gui_wht);
263 set_score_color(time_btn_id, ht, gui_grn, gui_wht);
264 set_score_color(goal_btn_id, hg, gui_grn, gui_wht);
267 void gui_score_set(int t)
272 int gui_score_get(void)
277 int gui_score_next(int t)
281 case GUI_SCORE_COIN: return GUI_SCORE_TIME;
282 case GUI_SCORE_TIME: return GUI_SCORE_GOAL;
283 case GUI_SCORE_GOAL: return GUI_SCORE_COIN;
286 return GUI_SCORE_COIN;
290 /*---------------------------------------------------------------------------*/
293 static int keyd[127];
295 void gui_keyboard(int id)
301 if ((jd = gui_hstack(id)))
305 if ((kd = gui_vstack(jd)))
307 if ((ld = gui_hstack(kd)))
311 keyd['9'] = gui_state(ld, "9", GUI_SML, '9', 0);
312 keyd['8'] = gui_state(ld, "8", GUI_SML, '8', 0);
313 keyd['7'] = gui_state(ld, "7", GUI_SML, '7', 0);
314 keyd['6'] = gui_state(ld, "6", GUI_SML, '6', 0);
315 keyd['5'] = gui_state(ld, "5", GUI_SML, '5', 0);
316 keyd['4'] = gui_state(ld, "4", GUI_SML, '4', 0);
317 keyd['3'] = gui_state(ld, "3", GUI_SML, '3', 0);
318 keyd['2'] = gui_state(ld, "2", GUI_SML, '2', 0);
319 keyd['1'] = gui_state(ld, "1", GUI_SML, '1', 0);
320 keyd['0'] = gui_state(ld, "0", GUI_SML, '0', 0);
323 if ((ld = gui_hstack(kd)))
326 keyd['J'] = gui_state(ld, "J", GUI_SML, 'J', 0);
327 keyd['I'] = gui_state(ld, "I", GUI_SML, 'I', 0);
328 keyd['H'] = gui_state(ld, "H", GUI_SML, 'H', 0);
329 keyd['G'] = gui_state(ld, "G", GUI_SML, 'G', 0);
330 keyd['F'] = gui_state(ld, "F", GUI_SML, 'F', 0);
331 keyd['E'] = gui_state(ld, "E", GUI_SML, 'E', 0);
332 keyd['D'] = gui_state(ld, "D", GUI_SML, 'D', 0);
333 keyd['C'] = gui_state(ld, "C", GUI_SML, 'C', 0);
334 keyd['B'] = gui_state(ld, "B", GUI_SML, 'B', 0);
335 keyd['A'] = gui_state(ld, "A", GUI_SML, 'A', 0);
338 if ((ld = gui_hstack(kd)))
341 keyd['T'] = gui_state(ld, "T", GUI_SML, 'T', 0);
342 keyd['S'] = gui_state(ld, "S", GUI_SML, 'S', 0);
343 keyd['R'] = gui_state(ld, "R", GUI_SML, 'R', 0);
344 keyd['Q'] = gui_state(ld, "Q", GUI_SML, 'Q', 0);
345 keyd['P'] = gui_state(ld, "P", GUI_SML, 'P', 0);
346 keyd['O'] = gui_state(ld, "O", GUI_SML, 'O', 0);
347 keyd['N'] = gui_state(ld, "N", GUI_SML, 'N', 0);
348 keyd['M'] = gui_state(ld, "M", GUI_SML, 'M', 0);
349 keyd['L'] = gui_state(ld, "L", GUI_SML, 'L', 0);
350 keyd['K'] = gui_state(ld, "K", GUI_SML, 'K', 0);
353 if ((ld = gui_hstack(kd)))
356 gui_state(ld, "<", GUI_SML, GUI_BS, 0);
357 keyd['Z'] = gui_state(ld, "Z", GUI_SML, 'Z', 0);
358 keyd['Y'] = gui_state(ld, "Y", GUI_SML, 'Y', 0);
359 keyd['X'] = gui_state(ld, "X", GUI_SML, 'X', 0);
360 keyd['W'] = gui_state(ld, "W", GUI_SML, 'W', 0);
361 keyd['V'] = gui_state(ld, "V", GUI_SML, 'V', 0);
362 keyd['U'] = gui_state(ld, "U", GUI_SML, 'U', 0);
363 gui_state(ld, _("caps"), GUI_SML, GUI_CL, 0);
371 void gui_keyboard_lock(void)
375 gui_set_label(keyd['A'], lock ? "A" : "a");
376 gui_set_label(keyd['B'], lock ? "B" : "b");
377 gui_set_label(keyd['C'], lock ? "C" : "c");
378 gui_set_label(keyd['D'], lock ? "D" : "d");
379 gui_set_label(keyd['E'], lock ? "E" : "e");
380 gui_set_label(keyd['F'], lock ? "F" : "f");
381 gui_set_label(keyd['G'], lock ? "G" : "g");
382 gui_set_label(keyd['H'], lock ? "H" : "h");
383 gui_set_label(keyd['I'], lock ? "I" : "i");
384 gui_set_label(keyd['J'], lock ? "J" : "j");
385 gui_set_label(keyd['K'], lock ? "K" : "k");
386 gui_set_label(keyd['L'], lock ? "L" : "l");
387 gui_set_label(keyd['M'], lock ? "M" : "m");
388 gui_set_label(keyd['N'], lock ? "N" : "n");
389 gui_set_label(keyd['O'], lock ? "O" : "o");
390 gui_set_label(keyd['P'], lock ? "P" : "p");
391 gui_set_label(keyd['Q'], lock ? "Q" : "q");
392 gui_set_label(keyd['R'], lock ? "R" : "r");
393 gui_set_label(keyd['S'], lock ? "S" : "s");
394 gui_set_label(keyd['T'], lock ? "T" : "t");
395 gui_set_label(keyd['U'], lock ? "U" : "u");
396 gui_set_label(keyd['V'], lock ? "V" : "v");
397 gui_set_label(keyd['W'], lock ? "W" : "w");
398 gui_set_label(keyd['X'], lock ? "X" : "x");
399 gui_set_label(keyd['Y'], lock ? "Y" : "y");
400 gui_set_label(keyd['Z'], lock ? "Z" : "z");
403 char gui_keyboard_char(char c)
405 return lock ? toupper(c) : tolower(c);
408 /*---------------------------------------------------------------------------*/
411 * XXX Watch out when using these functions. Be sure to check for
412 * GUI_NULL in addition to GUI_NEXT and GUI_PREV when using the latter
413 * two as labels for a switch with a default label.
416 int gui_navig(int id, int prev, int next)
420 if ((jd = gui_hstack(id)))
424 gui_maybe(jd, _("Next"), GUI_NEXT, GUI_NULL, next);
425 gui_maybe(jd, _("Prev"), GUI_PREV, GUI_NULL, prev);
430 gui_start(jd, _("Back"), GUI_SML, GUI_BACK, 0);
435 int gui_maybe(int id, const char *label, int etoken, int dtoken, int enabled)
441 bd = gui_state(id, label, GUI_SML, dtoken, 0);
442 gui_set_color(bd, gui_gry, gui_gry);
445 bd = gui_state(id, label, GUI_SML, etoken, 0);
450 /*---------------------------------------------------------------------------*/