FS#12076 - DB stats resurrection: If the filename was changed, require
[kugel-rb.git] / apps / plugins / star.c
blobc9797fd85bb17aea0ef5357a6e0aebda68a7d8aa
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2002 Frederic Dang Ngoc
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
21 #include "plugin.h"
23 #include "lib/display_text.h"
24 #include "lib/playback_control.h"
28 /* size of a level in file */
29 #define STAR_LEVEL_SIZE ((STAR_WIDTH + 1) * STAR_HEIGHT + 1)
31 /* size of the game board */
32 #define STAR_WIDTH 16
33 #define STAR_HEIGHT 9
35 /* number of level */
36 #define STAR_LEVEL_COUNT 20
38 /* values of object in the board */
39 #define STAR_VOID '.'
40 #define STAR_WALL '*'
41 #define STAR_STAR 'o'
42 #define STAR_BALL 'X'
43 #define STAR_BLOCK 'x'
45 /* sleep time between two frames */
46 #if (LCD_HEIGHT * LCD_WIDTH >= 70000) && defined(IPOD_ARCH)
47 /* iPod 5G LCD is *slow* */
48 #define STAR_SLEEP rb->yield();
49 #elif (LCD_HEIGHT * LCD_WIDTH >= 30000)
50 #define STAR_SLEEP rb->sleep(0);
51 #else
52 #define STAR_SLEEP rb->sleep(1);
53 #endif
55 /* value of ball and block control */
56 #define STAR_CONTROL_BALL 0
57 #define STAR_CONTROL_BLOCK 1
59 /* variable button definitions */
60 #if CONFIG_KEYPAD == RECORDER_PAD
61 #define STAR_QUIT BUTTON_OFF
62 #define STAR_LEFT BUTTON_LEFT
63 #define STAR_RIGHT BUTTON_RIGHT
64 #define STAR_UP BUTTON_UP
65 #define STAR_DOWN BUTTON_DOWN
66 #define STAR_TOGGLE_CONTROL BUTTON_ON
67 #define STAR_TOGGLE_CONTROL2 BUTTON_PLAY
68 #define STAR_LEVEL_UP BUTTON_F3
69 #define STAR_LEVEL_DOWN BUTTON_F1
70 #define STAR_LEVEL_REPEAT BUTTON_F2
71 #define STAR_TOGGLE_CONTROL_NAME "ON"
72 #define STAR_QUIT_NAME "OFF"
73 #define STAR_LEVEL_UP_NAME "F3"
74 #define STAR_LEVEL_DOWN_NAME "F1"
75 #define STAR_LEVEL_REPEAT_NAME "F2"
77 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
78 #define STAR_QUIT BUTTON_OFF
79 #define STAR_LEFT BUTTON_LEFT
80 #define STAR_RIGHT BUTTON_RIGHT
81 #define STAR_UP BUTTON_UP
82 #define STAR_DOWN BUTTON_DOWN
83 #define STAR_TOGGLE_CONTROL BUTTON_ON
84 #define STAR_TOGGLE_CONTROL2 BUTTON_SELECT
85 #define STAR_LEVEL_UP BUTTON_F3
86 #define STAR_LEVEL_DOWN BUTTON_F1
87 #define STAR_LEVEL_REPEAT BUTTON_F2
88 #define STAR_TOGGLE_CONTROL_NAME "ON/SELECT"
89 #define STAR_QUIT_NAME "OFF"
90 #define STAR_LEVEL_UP_NAME "F3"
91 #define STAR_LEVEL_DOWN_NAME "F1"
92 #define STAR_LEVEL_REPEAT_NAME "F2"
94 #elif CONFIG_KEYPAD == ONDIO_PAD
95 #define STAR_QUIT BUTTON_OFF
96 #define STAR_LEFT BUTTON_LEFT
97 #define STAR_RIGHT BUTTON_RIGHT
98 #define STAR_UP BUTTON_UP
99 #define STAR_DOWN BUTTON_DOWN
100 #define STAR_TOGGLE_CONTROL_PRE BUTTON_MENU
101 #define STAR_TOGGLE_CONTROL (BUTTON_MENU | BUTTON_REL)
102 #define STAR_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT)
103 #define STAR_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT)
104 #define STAR_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP)
105 #define STAR_TOGGLE_CONTROL_NAME "MODE"
106 #define STAR_QUIT_NAME "OFF"
107 #define STAR_LEVEL_UP_NAME "M >"
108 #define STAR_LEVEL_DOWN_NAME "M <"
109 #define STAR_LEVEL_REPEAT_NAME "M ^"
111 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
112 (CONFIG_KEYPAD == IRIVER_H300_PAD)
113 #define STAR_QUIT BUTTON_OFF
114 #define STAR_LEFT BUTTON_LEFT
115 #define STAR_RIGHT BUTTON_RIGHT
116 #define STAR_UP BUTTON_UP
117 #define STAR_DOWN BUTTON_DOWN
118 #define STAR_TOGGLE_CONTROL BUTTON_MODE
119 #define STAR_TOGGLE_CONTROL2 BUTTON_SELECT
120 #define STAR_LEVEL_UP (BUTTON_ON | BUTTON_RIGHT)
121 #define STAR_LEVEL_DOWN (BUTTON_ON | BUTTON_LEFT)
122 #define STAR_LEVEL_REPEAT (BUTTON_ON | BUTTON_SELECT)
123 #define STAR_TOGGLE_CONTROL_NAME "MODE/SELECT"
124 #define STAR_QUIT_NAME "OFF"
125 #define STAR_LEVEL_UP_NAME "ON + RIGHT"
126 #define STAR_LEVEL_DOWN_NAME "ON + LEFT"
127 #define STAR_LEVEL_REPEAT_NAME "ON + NAVI"
129 #define STAR_RC_QUIT BUTTON_RC_STOP
130 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
131 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
132 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
134 #define STAR_QUIT (BUTTON_SELECT | BUTTON_MENU)
135 #define STAR_LEFT BUTTON_LEFT
136 #define STAR_RIGHT BUTTON_RIGHT
137 #define STAR_UP BUTTON_MENU
138 #define STAR_DOWN BUTTON_PLAY
139 #define STAR_TOGGLE_CONTROL_PRE BUTTON_SELECT
140 #define STAR_TOGGLE_CONTROL (BUTTON_SELECT | BUTTON_REL)
141 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
142 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
143 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_PLAY)
144 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
145 #define STAR_QUIT_NAME "S + MENU"
146 #define STAR_LEVEL_UP_NAME "S >"
147 #define STAR_LEVEL_DOWN_NAME "S <"
148 #define STAR_LEVEL_REPEAT_NAME "S + PLAY"
150 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
152 #define STAR_QUIT BUTTON_POWER
153 #define STAR_LEFT BUTTON_LEFT
154 #define STAR_RIGHT BUTTON_RIGHT
155 #define STAR_UP BUTTON_UP
156 #define STAR_DOWN BUTTON_DOWN
157 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
158 #define STAR_LEVEL_UP_PRE BUTTON_REC
159 #define STAR_LEVEL_UP (BUTTON_REC|BUTTON_REL)
160 #define STAR_LEVEL_DOWN_PRE BUTTON_REC
161 #define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_REPEAT)
162 #define STAR_LEVEL_REPEAT BUTTON_PLAY
163 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
164 #define STAR_QUIT_NAME "POWER"
165 #define STAR_LEVEL_UP_NAME "REC"
166 #define STAR_LEVEL_DOWN_NAME "REC.."
167 #define STAR_LEVEL_REPEAT_NAME "PLAY"
169 #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
171 #define STAR_QUIT BUTTON_POWER
172 #define STAR_LEFT BUTTON_LEFT
173 #define STAR_RIGHT BUTTON_RIGHT
174 #define STAR_UP BUTTON_UP
175 #define STAR_DOWN BUTTON_DOWN
176 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
177 #define STAR_LEVEL_UP BUTTON_VOL_UP
178 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
179 #define STAR_LEVEL_REPEAT BUTTON_A
180 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
181 #define STAR_QUIT_NAME "POWER"
182 #define STAR_LEVEL_UP_NAME "VOL UP"
183 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
184 #define STAR_LEVEL_REPEAT_NAME "A"
186 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
187 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
188 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
189 (CONFIG_KEYPAD == SANSA_M200_PAD)
191 #define STAR_QUIT BUTTON_POWER
192 #define STAR_LEFT BUTTON_LEFT
193 #define STAR_RIGHT BUTTON_RIGHT
194 #define STAR_UP BUTTON_UP
195 #define STAR_DOWN BUTTON_DOWN
196 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
197 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
198 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
199 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
200 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
201 #define STAR_QUIT_NAME "POWER"
202 #define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
203 #define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
204 #define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
206 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
208 #define STAR_QUIT (BUTTON_HOME|BUTTON_REPEAT)
209 #define STAR_LEFT BUTTON_LEFT
210 #define STAR_RIGHT BUTTON_RIGHT
211 #define STAR_UP BUTTON_UP
212 #define STAR_DOWN BUTTON_DOWN
213 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
214 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
215 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
216 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
217 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
218 #define STAR_QUIT_NAME "HOME"
219 #define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
220 #define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
221 #define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
223 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
225 #define STAR_QUIT BUTTON_POWER
226 #define STAR_LEFT BUTTON_LEFT
227 #define STAR_RIGHT BUTTON_RIGHT
228 #define STAR_UP BUTTON_SCROLL_UP
229 #define STAR_DOWN BUTTON_SCROLL_DOWN
230 #define STAR_TOGGLE_CONTROL BUTTON_REW
231 #define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP)
232 #define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN)
233 #define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT)
234 #define STAR_TOGGLE_CONTROL_NAME "REW"
235 #define STAR_QUIT_NAME "POWER"
236 #define STAR_LEVEL_UP_NAME "PLAY+UP"
237 #define STAR_LEVEL_DOWN_NAME "PLAY+DOWN"
238 #define STAR_LEVEL_REPEAT_NAME "PLAY+RIGHT"
240 #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
242 #define STAR_QUIT BUTTON_BACK
243 #define STAR_LEFT BUTTON_LEFT
244 #define STAR_RIGHT BUTTON_RIGHT
245 #define STAR_UP BUTTON_UP
246 #define STAR_DOWN BUTTON_DOWN
247 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
248 #define STAR_LEVEL_UP BUTTON_VOL_UP
249 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
250 #define STAR_LEVEL_REPEAT BUTTON_MENU
251 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
252 #define STAR_QUIT_NAME "BACK"
253 #define STAR_LEVEL_UP_NAME "VOL UP"
254 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
255 #define STAR_LEVEL_REPEAT_NAME "MENU"
257 #elif (CONFIG_KEYPAD == MROBE100_PAD)
259 #define STAR_QUIT BUTTON_POWER
260 #define STAR_LEFT BUTTON_LEFT
261 #define STAR_RIGHT BUTTON_RIGHT
262 #define STAR_UP BUTTON_UP
263 #define STAR_DOWN BUTTON_DOWN
264 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
265 #define STAR_LEVEL_UP BUTTON_PLAY
266 #define STAR_LEVEL_DOWN BUTTON_MENU
267 #define STAR_LEVEL_REPEAT BUTTON_DISPLAY
268 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
269 #define STAR_QUIT_NAME "POWER"
270 #define STAR_LEVEL_UP_NAME "PLAY"
271 #define STAR_LEVEL_DOWN_NAME "MENU"
272 #define STAR_LEVEL_REPEAT_NAME "DISPLAY"
274 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
276 #define STAR_QUIT BUTTON_RC_REC
277 #define STAR_LEFT BUTTON_RC_REW
278 #define STAR_RIGHT BUTTON_RC_FF
279 #define STAR_UP BUTTON_RC_VOL_UP
280 #define STAR_DOWN BUTTON_RC_VOL_DOWN
281 #define STAR_TOGGLE_CONTROL BUTTON_RC_MODE
282 #define STAR_LEVEL_UP (BUTTON_RC_PLAY|BUTTON_RC_VOL_UP)
283 #define STAR_LEVEL_DOWN (BUTTON_RC_PLAY|BUTTON_RC_VOL_DOWN)
284 #define STAR_LEVEL_REPEAT (BUTTON_RC_PLAY|BUTTON_RC_MENU)
285 #define STAR_TOGGLE_CONTROL_NAME "MODE"
286 #define STAR_QUIT_NAME "REC"
287 #define STAR_LEVEL_UP_NAME "PLAY+VOL+"
288 #define STAR_LEVEL_DOWN_NAME "PLAY+VOL-"
289 #define STAR_LEVEL_REPEAT_NAME "PLAY+MENU"
291 #elif (CONFIG_KEYPAD == COWON_D2_PAD)
293 #define STAR_QUIT BUTTON_POWER
294 #define STAR_QUIT_NAME "POWER"
296 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
298 #define STAR_QUIT BUTTON_BACK
299 #define STAR_LEFT BUTTON_LEFT
300 #define STAR_RIGHT BUTTON_RIGHT
301 #define STAR_UP BUTTON_UP
302 #define STAR_DOWN BUTTON_DOWN
303 #define STAR_TOGGLE_CONTROL BUTTON_PLAY
304 #define STAR_LEVEL_UP (BUTTON_CUSTOM | BUTTON_UP)
305 #define STAR_LEVEL_DOWN (BUTTON_CUSTOM | BUTTON_DOWN)
306 #define STAR_LEVEL_REPEAT (BUTTON_CUSTOM | BUTTON_RIGHT)
307 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
308 #define STAR_QUIT_NAME "BACK"
309 #define STAR_LEVEL_UP_NAME "CUSTOM+UP"
310 #define STAR_LEVEL_DOWN_NAME "CUSTOM+DOWN"
311 #define STAR_LEVEL_REPEAT_NAME "CUSTOM+RIGHT"
313 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
315 #define STAR_QUIT BUTTON_POWER
316 #define STAR_LEFT BUTTON_LEFT
317 #define STAR_RIGHT BUTTON_RIGHT
318 #define STAR_UP BUTTON_UP
319 #define STAR_DOWN BUTTON_DOWN
320 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
321 #define STAR_LEVEL_UP BUTTON_VOL_UP
322 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
323 #define STAR_LEVEL_REPEAT BUTTON_VIEW
324 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
325 #define STAR_QUIT_NAME "POWER"
326 #define STAR_LEVEL_UP_NAME "VOL UP"
327 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
328 #define STAR_LEVEL_REPEAT_NAME "VIEW"
330 #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
332 #define STAR_QUIT BUTTON_POWER
333 #define STAR_LEFT BUTTON_LEFT
334 #define STAR_RIGHT BUTTON_RIGHT
335 #define STAR_UP BUTTON_UP
336 #define STAR_DOWN BUTTON_DOWN
337 #define STAR_TOGGLE_CONTROL BUTTON_PLAY
338 #define STAR_LEVEL_UP BUTTON_VOL_UP
339 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
340 #define STAR_LEVEL_REPEAT BUTTON_NEXT
341 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
342 #define STAR_QUIT_NAME "POWER"
343 #define STAR_LEVEL_UP_NAME "VOL +"
344 #define STAR_LEVEL_DOWN_NAME "VOL -"
345 #define STAR_LEVEL_REPEAT_NAME "NEXT"
347 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
349 #define STAR_QUIT BUTTON_POWER
350 #define STAR_LEFT BUTTON_PREV
351 #define STAR_RIGHT BUTTON_NEXT
352 #define STAR_UP BUTTON_UP
353 #define STAR_DOWN BUTTON_DOWN
354 #define STAR_TOGGLE_CONTROL BUTTON_PLAY
355 #define STAR_LEVEL_UP BUTTON_VOL_UP
356 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
357 #define STAR_LEVEL_REPEAT BUTTON_RIGHT
358 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
359 #define STAR_QUIT_NAME "POWER"
360 #define STAR_LEVEL_UP_NAME "VOL UP"
361 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
362 #define STAR_LEVEL_REPEAT_NAME "RIGHT"
364 #elif (CONFIG_KEYPAD == ONDAVX747_PAD)
366 #define STAR_QUIT BUTTON_POWER
367 #define STAR_QUIT_NAME "POWER"
369 #elif (CONFIG_KEYPAD == ONDAVX777_PAD)
370 #define STAR_QUIT BUTTON_POWER
371 #define STAR_QUIT_NAME "POWER"
373 #elif CONFIG_KEYPAD == MROBE500_PAD
374 #define STAR_QUIT BUTTON_POWER
375 #define STAR_QUIT_NAME "POWER"
377 #elif (CONFIG_KEYPAD == SAMSUNG_YH_PAD)
379 #define STAR_QUIT BUTTON_REC
380 #define STAR_LEFT BUTTON_LEFT
381 #define STAR_RIGHT BUTTON_RIGHT
382 #define STAR_UP BUTTON_UP
383 #define STAR_DOWN BUTTON_DOWN
384 #define STAR_LEVEL_UP_PRE (BUTTON_FFWD|BUTTON_UP)
385 #define STAR_LEVEL_UP (BUTTON_REW|BUTTON_UP)
386 #define STAR_LEVEL_DOWN_PRE (BUTTON_FFWD|BUTTON_DOWN)
387 #define STAR_LEVEL_DOWN (BUTTON_REW|BUTTON_DOWN)
388 #define STAR_TOGGLE_CONTROL (BUTTON_PLAY|BUTTON_UP)
389 #define STAR_LEVEL_REPEAT (BUTTON_PLAY|BUTTON_DOWN)
390 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
391 #define STAR_QUIT_NAME "REC"
392 #define STAR_LEVEL_UP_NAME "UP"
393 #define STAR_LEVEL_DOWN_NAME "DOWN"
394 #define STAR_LEVEL_REPEAT_NAME "PLAY"
396 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
398 #define STAR_QUIT BUTTON_REC
399 #define STAR_LEFT BUTTON_PREV
400 #define STAR_RIGHT BUTTON_NEXT
401 #define STAR_UP BUTTON_UP
402 #define STAR_DOWN BUTTON_DOWN
403 #define STAR_TOGGLE_CONTROL BUTTON_PLAY
404 #define STAR_LEVEL_UP BUTTON_OK
405 #define STAR_LEVEL_DOWN BUTTON_CANCEL
406 #define STAR_LEVEL_REPEAT BUTTON_MENU
407 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
408 #define STAR_QUIT_NAME "REC"
409 #define STAR_LEVEL_UP_NAME "OK"
410 #define STAR_LEVEL_DOWN_NAME "CANCEL"
411 #define STAR_LEVEL_REPEAT_NAME "MENU"
413 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
415 #define STAR_QUIT (BUTTON_REC | BUTTON_PLAY)
416 #define STAR_LEFT BUTTON_VOL_DOWN
417 #define STAR_RIGHT BUTTON_VOL_UP
418 #define STAR_UP BUTTON_REW
419 #define STAR_DOWN BUTTON_FF
420 #define STAR_TOGGLE_CONTROL_PRE BUTTON_FUNC
421 #define STAR_TOGGLE_CONTROL (BUTTON_FUNC | BUTTON_REL)
422 #define STAR_LEVEL_UP BUTTON_PLAY
423 #define STAR_LEVEL_DOWN BUTTON_REC
424 #define STAR_LEVEL_REPEAT (BUTTON_FUNC | BUTTON_REPEAT)
425 #define STAR_TOGGLE_CONTROL_NAME "FUNC"
426 #define STAR_QUIT_NAME "REC + PLAY"
427 #define STAR_LEVEL_UP_NAME "PLAY"
428 #define STAR_LEVEL_DOWN_NAME "REC"
429 #define STAR_LEVEL_REPEAT_NAME "FUNC LONG"
431 #elif CONFIG_KEYPAD == MPIO_HD300_PAD
433 #define STAR_QUIT (BUTTON_REC | BUTTON_REPEAT)
434 #define STAR_LEFT BUTTON_REW
435 #define STAR_RIGHT BUTTON_FF
436 #define STAR_UP BUTTON_UP
437 #define STAR_DOWN BUTTON_DOWN
438 #define STAR_TOGGLE_CONTROL_PRE BUTTON_MENU
439 #define STAR_TOGGLE_CONTROL (BUTTON_MENU | BUTTON_REL)
440 #define STAR_LEVEL_UP BUTTON_PLAY
441 #define STAR_LEVEL_DOWN BUTTON_REC
442 #define STAR_LEVEL_REPEAT (BUTTON_MENU | BUTTON_REPEAT)
443 #define STAR_TOGGLE_CONTROL_NAME "MENU"
444 #define STAR_QUIT_NAME "REC LONG"
445 #define STAR_LEVEL_UP_NAME "PLAY"
446 #define STAR_LEVEL_DOWN_NAME "REC"
447 #define STAR_LEVEL_REPEAT_NAME "MENU LONG"
449 #else
450 #error No keymap defined!
451 #endif
453 #ifdef HAVE_TOUCHSCREEN
454 //#ifndef STAR_QUIT
455 //#define STAR_QUIT BUTTON_TOPLEFT
456 //#define STAR_QUIT_NAME "TOPLEFT"
457 //#endif
458 #ifndef STAR_LEFT
459 #define STAR_LEFT BUTTON_MIDLEFT
460 #endif
461 #ifndef STAR_RIGHT
462 #define STAR_RIGHT BUTTON_MIDRIGHT
463 #endif
464 #ifndef STAR_UP
465 #define STAR_UP BUTTON_TOPMIDDLE
466 #endif
467 #ifndef STAR_DOWN
468 #define STAR_DOWN BUTTON_BOTTOMMIDDLE
469 #endif
470 #ifndef STAR_TOGGLE_CONTROL
471 #define STAR_TOGGLE_CONTROL BUTTON_CENTER
472 #define STAR_TOGGLE_CONTROL_NAME "CENTER"
473 #endif
474 #ifndef STAR_LEVEL_UP
475 #define STAR_LEVEL_UP BUTTON_TOPLEFT
476 #define STAR_LEVEL_UP_NAME "TOPLEFT"
477 #endif
478 #ifndef STAR_LEVEL_DOWN
479 #define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT
480 #define STAR_LEVEL_DOWN_NAME "BOTTOMLEFT"
481 #endif
482 #ifndef STAR_LEVEL_REPEAT
483 #define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT
484 #define STAR_LEVEL_REPEAT_NAME "BOTTOMRIGHT"
485 #endif
486 #endif
488 /* function returns because of USB? */
489 static bool usb_detected = false;
491 /* position of the ball */
492 static int ball_x, ball_y;
494 /* position of the block */
495 static int block_x, block_y;
497 /* number of stars to get to finish the level */
498 static int star_count;
500 /* the object we control : ball or block */
501 static int control;
503 /* the current board */
504 static char board[STAR_HEIGHT][STAR_WIDTH];
506 #include "pluginbitmaps/star_tiles.h"
508 #define TILE_WIDTH BMPWIDTH_star_tiles
509 #define TILE_HEIGHT (BMPHEIGHT_star_tiles/5)
510 #define STAR_OFFSET_X ((LCD_WIDTH - STAR_WIDTH * TILE_WIDTH) / 2)
511 #define STAR_OFFSET_Y ((LCD_HEIGHT - STAR_HEIGHT * TILE_HEIGHT - MAX(TILE_HEIGHT, 8)) / 2)
513 #define WALL 0
514 #define SPACE 1
515 #define BLOCK 2
516 #define STAR 3
517 #define BALL 4
519 /* char font size */
520 static int char_width = -1;
521 static int char_height = -1;
523 /* this arrays contains a group of levels loaded into memory */
524 static unsigned char* levels =
525 "****************\n"
526 "*X**........o*x*\n"
527 "*..........o.***\n"
528 "*.......**o....*\n"
529 "*...**.o......**\n"
530 "**.o..o.....o..*\n"
531 "*.o......o**.o.*\n"
532 "*.....**o.....o*\n"
533 "****************\n"
534 "\n"
535 ".*..*.*.*...*.**\n"
536 "*...o.........X*\n"
537 "...*o..*o...o...\n"
538 "*.*.o.....o..*.*\n"
539 "......*...o...*.\n"
540 "*....*x*..o....*\n"
541 "...*..*.*...*oo*\n"
542 "*.............*.\n"
543 ".*..*........*..\n"
544 "\n"
545 "****************\n"
546 "*...........o*x*\n"
547 "*...**......**X*\n"
548 "*...*o.........*\n"
549 "*.o.....o**...o*\n"
550 "*.*o..o..o*..o**\n"
551 "*.**o.*o..o.o***\n"
552 "*o....**o......*\n"
553 "****************\n"
554 "\n"
555 "****************\n"
556 "*............*x*\n"
557 "*.....*........*\n"
558 "**o*o.o*o*o*o*o*\n"
559 "*.*.*o.o*.*.*.**\n"
560 "**o*o*o.o*o*o*o*\n"
561 "*.....*........*\n"
562 "*...*.......*X.*\n"
563 "****************\n"
564 "\n"
565 ".**************.\n"
566 "*X..*...*..*...*\n"
567 "*..*o.*.o..o.*.*\n"
568 "**......*..*...*\n"
569 "*o.*o*........**\n"
570 "**.....*.o.*...*\n"
571 "*o*..*.*.*...*x*\n"
572 "*...*....o*..*o*\n"
573 ".**************.\n"
574 "\n"
575 "....************\n"
576 "...*...o...*o.o*\n"
577 "..*....o....*.**\n"
578 ".*.....o.......*\n"
579 "*X.....o.......*\n"
580 "**.....o..*...**\n"
581 "*......o....*..*\n"
582 "*x.*...o..**o..*\n"
583 "****************\n"
584 "\n"
585 "****************\n"
586 "*..............*\n"
587 ".**.***..*o.**o*\n"
588 ".*o..*o.*.*.*.*.\n"
589 "..*..*..***.**..\n"
590 ".**..*..*o*.*o**\n"
591 "*..............*\n"
592 "*..X*o....x..*o*\n"
593 "****************\n"
594 "\n"
595 "***************.\n"
596 "*..o**.........*\n"
597 "*..*o..**.o....*\n"
598 "*..o**.*.*o....*\n"
599 "**.....**..*o*.*\n"
600 "**.*.......o*o.*\n"
601 "*oxo*...o..*X*.*\n"
602 "**.............*\n"
603 ".***************\n"
604 "\n"
605 "..*.***********.\n"
606 ".*o*o......*..X*\n"
607 "*o.o*....o....*.\n"
608 ".*.*..o**..o*..*\n"
609 "*..*o.*oxo....o*\n"
610 "*.....o**.....*.\n"
611 "*o*o.........*..\n"
612 "*...........*...\n"
613 ".***********....\n"
614 "\n"
615 "....***********.\n"
616 "*****.o........*\n"
617 "*...x.***o.o*.o*\n"
618 "*.o...*o.*o...*.\n"
619 "*.....*..o..*.o*\n"
620 "*o*o..*.o*..*X*.\n"
621 ".*o...***..***..\n"
622 "*.........*.*.*.\n"
623 ".*********..*..*\n"
624 "\n"
625 "****************\n"
626 "*......*......X*\n"
627 "*..*oo.....oo.**\n"
628 "**...o...**...o*\n"
629 "*o....*o*oo..***\n"
630 "**.**....**....*\n"
631 "*o..o*.o....x.o*\n"
632 "**o***....*...**\n"
633 "***************.\n"
634 "\n"
635 "**.....**..****.\n"
636 "*X*****o.***.o**\n"
637 "*....oo.....o..*\n"
638 "*.**..**o..*o*.*\n"
639 "*.*.o.*.*o.**..*\n"
640 "*.**..**...*x*.*\n"
641 "*.....o........*\n"
642 "*........o.....*\n"
643 "****************\n"
644 "\n"
645 ".**************.\n"
646 "*.X*........o.**\n"
647 "*.*...*o...o**.*\n"
648 "*.......o....*.*\n"
649 "*.o..........*o*\n"
650 "*.*......o.....*\n"
651 "**......o.o..*o*\n"
652 "*x..*....o.*.*.*\n"
653 ".**************.\n"
654 "\n"
655 "****************\n"
656 "*o*o........o*o*\n"
657 "*.o*X......**..*\n"
658 "*.x........o...*\n"
659 "*........o*....*\n"
660 "*......o.......*\n"
661 "*.o*........*..*\n"
662 "*o*o........o*o*\n"
663 "****************\n"
664 "\n"
665 ".******.********\n"
666 "*.....o*.....o.*\n"
667 "*.*.o.*..*...o.*\n"
668 "*..X*...*oo.*o.*\n"
669 ".*.*...*.o..x*.*\n"
670 "*o.......*..*o.*\n"
671 ".*......o.....*.\n"
672 "*o............o*\n"
673 "****************\n"
674 "\n"
675 "****************\n"
676 "**.x*o.o......o*\n"
677 "*o.Xo*o.......**\n"
678 "**.***........**\n"
679 "**.....o*o*....*\n"
680 "*oo.......o*o..*\n"
681 "**.o....****o..*\n"
682 "**o*..*........*\n"
683 "****************\n"
684 "\n"
685 "****************\n"
686 "*.o*........*X.*\n"
687 "*.*..o*oo*o..*.*\n"
688 "*....*o**o*.o..*\n"
689 "*.o*.......o*..*\n"
690 "*..o*o....o*...*\n"
691 "*.*..*.**o*..*.*\n"
692 "*....o.*o...x..*\n"
693 "****************\n"
694 "\n"
695 "****************\n"
696 "*.o....o..x*...*\n"
697 "*..*o*o...*o...*\n"
698 "*...*o*....*o..*\n"
699 "*...o..*...o*o.*\n"
700 "*.*o*...*.o*...*\n"
701 "*.o*o.*.o.*....*\n"
702 "*o*X..*.....*..*\n"
703 "****************\n"
704 "\n"
705 "****************\n"
706 "*o...**.....**o*\n"
707 "*.*..*......*o.*\n"
708 "*.o*...o**..o..*\n"
709 "*.*....*o......*\n"
710 "*....*...o*....*\n"
711 "*.**.o*.**o..*x*\n"
712 "*.o*.*o.....**X*\n"
713 "****************\n"
714 "\n"
715 "****************\n"
716 "*...o*o........*\n"
717 "**o..o*.**o...**\n"
718 "*.*.*.o...*..*.*\n"
719 "*.x.*..**..*.Xo*\n"
720 "*.*..*...o.*.*.*\n"
721 "**...o**.*o..o**\n"
722 "*........o*o...*\n"
723 "****************";
726 * Do a pretty transition from one level to another.
728 static void star_transition_update(void)
730 const int center_x = LCD_WIDTH / 2;
731 const int center_y = LCD_HEIGHT / 2;
732 int x = 0;
733 int y = 0;
734 #if LCD_WIDTH >= LCD_HEIGHT
735 #if defined(IPOD_VIDEO)
736 const int step = 4;
737 #else
738 const int step = 1;
739 #endif
740 const int lcd_demi_width = LCD_WIDTH / 2;
741 int var_y = 0;
743 for (; x < lcd_demi_width ; x+=step)
745 var_y += LCD_HEIGHT;
746 if (var_y > LCD_WIDTH)
748 var_y -= LCD_WIDTH;
749 y+=step;
751 if( x )
753 rb->lcd_update_rect(center_x - x, center_y - y, x*2, step);
754 rb->lcd_update_rect(center_x - x, center_y + y - step, x*2, step);
756 if( y )
758 rb->lcd_update_rect(center_x - x, center_y - y, step, y*2);
759 rb->lcd_update_rect(center_x + x - step, center_y - y, step, y*2);
761 STAR_SLEEP
763 #else
764 int lcd_demi_height = LCD_HEIGHT / 2;
765 int var_x = 0;
767 for (; y < lcd_demi_height ; y++)
769 var_x += LCD_WIDTH;
770 if (var_x > LCD_HEIGHT)
772 var_x -= LCD_HEIGHT;
773 x++;
775 if( x )
777 rb->lcd_update_rect(center_x - x, center_y - y, x * 2, 1);
778 rb->lcd_update_rect(center_x - x, center_y + y - 1, x * 2, 1);
780 if( y )
782 rb->lcd_update_rect(center_x - x, center_y - y, 1, y * 2);
783 rb->lcd_update_rect(center_x + x - 1, center_y - y, 1, y * 2);
785 STAR_SLEEP
787 #endif
788 rb->lcd_update();
792 * Display information board of the current level.
794 static void star_display_board_info(int current_level)
796 int label_pos_y, tile_pos_y;
798 if (TILE_HEIGHT > char_height)
800 tile_pos_y = LCD_HEIGHT - TILE_HEIGHT;
801 label_pos_y = tile_pos_y + (TILE_HEIGHT - char_height) / 2;
803 else
805 label_pos_y = LCD_HEIGHT - char_height;
806 tile_pos_y = label_pos_y + (char_height - TILE_HEIGHT) / 2;
809 rb->lcd_putsxyf(STAR_OFFSET_X, label_pos_y, "L:%02d", current_level + 1);
810 rb->lcd_putsxyf(LCD_WIDTH/2 - 2 * char_width, label_pos_y, "S:%02d",
811 star_count);
812 rb->lcd_putsxy(STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH - 2 * char_width,
813 label_pos_y, "C:");
815 rb->lcd_bitmap_part(star_tiles, 0, control == STAR_CONTROL_BALL ?
816 BALL*TILE_HEIGHT : BLOCK*TILE_HEIGHT,
817 STRIDE( SCREEN_MAIN,
818 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
819 STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH,
820 tile_pos_y, TILE_WIDTH, TILE_HEIGHT);
822 rb->lcd_update_rect(0, MIN(label_pos_y, tile_pos_y), LCD_WIDTH,
823 MAX(TILE_HEIGHT, char_height));
828 * Load a level into board array.
830 static int star_load_level(int current_level)
832 int x, y;
833 char *ptr_tab;
835 if (current_level < 0)
836 current_level = 0;
837 else if (current_level > STAR_LEVEL_COUNT-1)
838 current_level = STAR_LEVEL_COUNT-1;
841 ptr_tab = levels + current_level * STAR_LEVEL_SIZE;
842 control = STAR_CONTROL_BALL;
843 star_count = 0;
845 rb->lcd_clear_display();
847 for (y = 0 ; y < STAR_HEIGHT ; y++)
849 for (x = 0 ; x < STAR_WIDTH ; x++)
851 board[y][x] = *ptr_tab;
852 switch (*ptr_tab)
854 # define DRAW_TILE( a ) \
855 rb->lcd_bitmap_part( star_tiles, 0, \
856 a*TILE_HEIGHT, \
857 STRIDE( SCREEN_MAIN, \
858 BMPWIDTH_star_tiles, \
859 BMPHEIGHT_star_tiles), \
860 STAR_OFFSET_X + x * TILE_WIDTH, \
861 STAR_OFFSET_Y + y * TILE_HEIGHT, \
862 TILE_WIDTH, TILE_HEIGHT);
864 case STAR_VOID:
865 DRAW_TILE( SPACE );
866 break;
868 case STAR_WALL:
869 DRAW_TILE( WALL );
870 break;
872 case STAR_STAR:
873 DRAW_TILE( STAR );
874 star_count++;
875 break;
877 case STAR_BALL:
878 ball_x = x;
879 ball_y = y;
880 DRAW_TILE( BALL );
881 break;
884 case STAR_BLOCK:
885 block_x = x;
886 block_y = y;
887 DRAW_TILE( BLOCK );
888 break;
890 ptr_tab++;
892 ptr_tab++;
894 star_display_board_info(current_level);
895 star_transition_update();
896 return 1;
899 static void star_animate_tile(int tile_no, int start_x, int start_y,
900 int delta_x, int delta_y)
902 int i;
904 if (delta_x != 0) /* horizontal */
906 for (i = 1 ; i <= TILE_WIDTH ; i++)
908 STAR_SLEEP
909 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT,
910 STRIDE( SCREEN_MAIN,
911 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
912 start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
913 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT,
914 STRIDE( SCREEN_MAIN,
915 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
916 start_x + delta_x * i, start_y, TILE_WIDTH, TILE_HEIGHT);
917 rb->lcd_update_rect(start_x + delta_x * i - (delta_x>0?1:0),
918 start_y, TILE_WIDTH + 1, TILE_HEIGHT);
921 else /* vertical */
923 for (i = 1 ; i <= TILE_HEIGHT ; i++)
925 STAR_SLEEP
926 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT,
927 STRIDE( SCREEN_MAIN,
928 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
929 start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
930 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT,
931 STRIDE( SCREEN_MAIN,
932 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
933 start_x, start_y + delta_y * i, TILE_WIDTH, TILE_HEIGHT);
934 rb->lcd_update_rect(start_x, start_y + delta_y * i - (delta_y>0?1:0),
935 TILE_WIDTH, TILE_HEIGHT + 1);
941 * Run the game.
943 static int star_run_game(int current_level)
945 int move_x = 0;
946 int move_y = 0;
947 int key;
948 #if defined(STAR_LEVEL_DOWN_PRE) || \
949 defined(STAR_LEVEL_UP_PRE) || \
950 defined(STAR_TOGGLE_CONTROL_PRE)
951 int lastkey = BUTTON_NONE;
952 #endif
954 if (!star_load_level(current_level))
955 return 0;
957 while (true)
959 move_x = 0;
960 move_y = 0;
962 while ((move_x == 0) && (move_y == 0))
964 key = rb->button_get(true);
965 switch (key)
967 #ifdef STAR_RC_QUIT
968 case STAR_RC_QUIT:
969 #endif
970 case STAR_QUIT:
971 return -1;
973 case STAR_LEFT:
974 move_x = -1;
975 break;
977 case STAR_RIGHT:
978 move_x = 1;
979 break;
981 case STAR_UP:
982 move_y = -1;
983 break;
985 case STAR_DOWN:
986 move_y = 1;
987 break;
989 case STAR_LEVEL_DOWN:
990 #ifdef STAR_LEVEL_DOWN_PRE
991 if (lastkey != STAR_LEVEL_DOWN_PRE)
992 break;
993 #endif
994 if (current_level > 0)
996 current_level--;
997 star_load_level(current_level);
999 break;
1001 case STAR_LEVEL_REPEAT:
1002 star_load_level(current_level);
1003 break;
1005 case STAR_LEVEL_UP:
1006 #ifdef STAR_LEVEL_UP_PRE
1007 if (lastkey != STAR_LEVEL_UP_PRE)
1008 break;
1009 #endif
1010 if (current_level < STAR_LEVEL_COUNT - 1)
1012 current_level++;
1013 star_load_level(current_level);
1015 break;
1017 case STAR_TOGGLE_CONTROL:
1018 #ifdef STAR_TOGGLE_CONTROL_PRE
1019 if (lastkey != STAR_TOGGLE_CONTROL_PRE)
1020 break;
1021 #endif
1022 #ifdef STAR_TOGGLE_CONTROL2
1023 case STAR_TOGGLE_CONTROL2:
1024 #endif
1025 if (control == STAR_CONTROL_BALL)
1026 control = STAR_CONTROL_BLOCK;
1027 else
1028 control = STAR_CONTROL_BALL;
1029 star_display_board_info(current_level);
1030 break;
1032 default:
1033 if (rb->default_event_handler(key) == SYS_USB_CONNECTED)
1035 usb_detected = true;
1036 return 0;
1038 break;
1040 #if defined(STAR_LEVEL_DOWN_PRE) || \
1041 defined(STAR_LEVEL_UP_PRE) || \
1042 defined(STAR_TOGGLE_CONTROL_PRE)
1043 if (key != BUTTON_NONE)
1044 lastkey = key;
1045 #endif
1048 if (control == STAR_CONTROL_BALL)
1050 board[ball_y][ball_x] = STAR_VOID;
1051 while ((board[ball_y + move_y][ball_x + move_x] == STAR_VOID
1052 || board[ball_y + move_y][ball_x + move_x] == STAR_STAR))
1055 star_animate_tile(BALL, STAR_OFFSET_X + ball_x * TILE_WIDTH,
1056 STAR_OFFSET_Y + ball_y * TILE_HEIGHT,
1057 move_x, move_y);
1058 ball_x += move_x;
1059 ball_y += move_y;
1061 if (board[ball_y][ball_x] == STAR_STAR)
1063 board[ball_y][ball_x] = STAR_VOID;
1064 star_count--;
1066 star_display_board_info(current_level);
1069 board[ball_y][ball_x] = STAR_BALL;
1071 else
1073 board[block_y][block_x] = STAR_VOID;
1074 while (board[block_y + move_y][block_x + move_x] == STAR_VOID)
1076 star_animate_tile(BLOCK, STAR_OFFSET_X + block_x * TILE_WIDTH,
1077 STAR_OFFSET_Y + block_y * TILE_HEIGHT,
1078 move_x, move_y);
1079 block_x += move_x;
1080 block_y += move_y;
1082 board[block_y][block_x] = STAR_BLOCK;
1085 if (star_count == 0)
1087 current_level++;
1088 if (current_level == STAR_LEVEL_COUNT)
1090 rb->lcd_clear_display();
1091 rb->splash(HZ*2, "Congratulations!");
1092 rb->lcd_update();
1094 /* There is no such level as STAR_LEVEL_COUNT so it can't be the
1095 * current_level */
1096 current_level--;
1097 return 1;
1099 star_load_level(current_level);
1105 * Display help text.
1107 static bool star_help(void)
1109 static char* help_text[] = {
1110 "Star", "", "Aim", "",
1111 "Take", "all", "the", "stars", "to", "go", "to", "the", "next", "level.",
1112 "You", "can", "toggle", "control", "with", "the", "block", "to", "use",
1113 "it", "as", "a", "mobile", "wall.", "The", "block", "cannot", "take",
1114 "stars.", "", "",
1115 "Controls", "",
1116 STAR_TOGGLE_CONTROL_NAME":", "Toggle", "control", "",
1117 STAR_QUIT_NAME":", "Exit", "",
1118 STAR_LEVEL_DOWN_NAME":", "Prev.", "level", "",
1119 STAR_LEVEL_REPEAT_NAME":", "Reset", "level", "",
1120 STAR_LEVEL_UP_NAME":", "Next", "level"
1122 static struct style_text formation[]={
1123 { 0, TEXT_CENTER|TEXT_UNDERLINE },
1124 { 2, C_RED },
1125 { 35, C_RED },
1126 LAST_STYLE_ITEM
1128 #if LCD_DEPTH > 1 && !defined(HAVE_LCD_COLOR)
1129 rb->lcd_set_background(LCD_WHITE);
1130 rb->lcd_set_foreground(LCD_BLACK);
1131 #endif
1132 if (display_text(ARRAYLEN(help_text), help_text, formation, NULL, true))
1133 return true;
1134 #if LCD_DEPTH > 1 && !defined(HAVE_LCD_COLOR)
1135 rb->lcd_set_background(LCD_BLACK);
1136 rb->lcd_set_foreground(LCD_WHITE);
1137 #endif
1138 return false;
1142 * Display the choice menu.
1144 static int star_menu(void)
1146 int selection, level=1;
1147 bool menu_quit = false;
1149 MENUITEM_STRINGLIST(menu, "Star Menu", NULL,
1150 "Start Game","Choose Level",
1151 "Help", "Playback Control", "Quit");
1153 while(!menu_quit)
1155 switch(rb->do_menu(&menu, &selection, NULL, false))
1157 case 0:
1158 /* use system font and get the size of char */
1159 rb->lcd_setfont(FONT_SYSFIXED);
1160 rb->lcd_getstringsize("a", &char_width, &char_height);
1161 star_run_game(level-1);
1162 rb->lcd_setfont(FONT_UI);
1163 break;
1164 case 1:
1165 rb->set_int("Level", "", UNIT_INT, &level,
1166 NULL, 1, 1, STAR_LEVEL_COUNT, NULL );
1167 break;
1168 case 2:
1169 if(star_help())
1170 usb_detected = true;
1171 break;
1172 case 3:
1173 playback_control(NULL);
1174 break;
1175 case 4:
1176 menu_quit = true;
1177 break;
1179 if(usb_detected)
1180 return PLUGIN_USB_CONNECTED;
1183 return PLUGIN_OK;
1187 * Main entry point
1189 enum plugin_status plugin_start(const void* parameter)
1191 (void)parameter;
1193 #if LCD_DEPTH > 1
1194 rb->lcd_set_backdrop(NULL);
1195 rb->lcd_set_background( LCD_BLACK );
1196 rb->lcd_set_foreground( LCD_WHITE );
1197 #endif
1199 /* display choice menu */
1200 return star_menu();