Describe the %cs WPS tag in the manual (fix FS#11053)
[kugel-rb.git] / apps / plugins / star.c
blob1e8eb868a97129bb3803b1f03e70ae9dd3a1c0b5
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"
22 #ifdef HAVE_LCD_BITMAP
23 #include "lib/display_text.h"
24 #include "lib/playback_control.h"
26 PLUGIN_HEADER
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_SA9200_PAD
332 #define STAR_QUIT BUTTON_POWER
333 #define STAR_LEFT BUTTON_PREV
334 #define STAR_RIGHT BUTTON_NEXT
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_RIGHT
341 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
342 #define STAR_QUIT_NAME "POWER"
343 #define STAR_LEVEL_UP_NAME "VOL UP"
344 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
345 #define STAR_LEVEL_REPEAT_NAME "RIGHT"
347 #elif (CONFIG_KEYPAD == ONDAVX747_PAD)
349 #define STAR_QUIT BUTTON_POWER
350 #define STAR_QUIT_NAME "POWER"
352 #elif (CONFIG_KEYPAD == ONDAVX777_PAD)
353 #define STAR_QUIT BUTTON_POWER
354 #define STAR_QUIT_NAME "POWER"
356 #elif CONFIG_KEYPAD == MROBE500_PAD
357 #define STAR_QUIT BUTTON_POWER
358 #define STAR_QUIT_NAME "POWER"
360 #elif (CONFIG_KEYPAD == SAMSUNG_YH_PAD)
362 #define STAR_QUIT BUTTON_REC
363 #define STAR_LEFT BUTTON_LEFT
364 #define STAR_RIGHT BUTTON_RIGHT
365 #define STAR_UP BUTTON_UP
366 #define STAR_DOWN BUTTON_DOWN
367 #define STAR_LEVEL_UP_PRE (BUTTON_FFWD|BUTTON_UP)
368 #define STAR_LEVEL_UP (BUTTON_REW|BUTTON_UP)
369 #define STAR_LEVEL_DOWN_PRE (BUTTON_FFWD|BUTTON_DOWN)
370 #define STAR_LEVEL_DOWN (BUTTON_REW|BUTTON_DOWN)
371 #define STAR_TOGGLE_CONTROL (BUTTON_PLAY|BUTTON_UP)
372 #define STAR_LEVEL_REPEAT (BUTTON_PLAY|BUTTON_DOWN)
373 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
374 #define STAR_QUIT_NAME "REC"
375 #define STAR_LEVEL_UP_NAME "UP"
376 #define STAR_LEVEL_DOWN_NAME "DOWN"
377 #define STAR_LEVEL_REPEAT_NAME "PLAY"
379 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
381 #define STAR_QUIT BUTTON_REC
382 #define STAR_LEFT BUTTON_PREV
383 #define STAR_RIGHT BUTTON_NEXT
384 #define STAR_UP BUTTON_UP
385 #define STAR_DOWN BUTTON_DOWN
386 #define STAR_TOGGLE_CONTROL BUTTON_PLAY
387 #define STAR_LEVEL_UP BUTTON_OK
388 #define STAR_LEVEL_DOWN BUTTON_CANCEL
389 #define STAR_LEVEL_REPEAT BUTTON_MENU
390 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
391 #define STAR_QUIT_NAME "REC"
392 #define STAR_LEVEL_UP_NAME "OK"
393 #define STAR_LEVEL_DOWN_NAME "CANCEL"
394 #define STAR_LEVEL_REPEAT_NAME "MENU"
396 #else
397 #error No keymap defined!
398 #endif
400 #ifdef HAVE_TOUCHSCREEN
401 //#ifndef STAR_QUIT
402 //#define STAR_QUIT BUTTON_TOPLEFT
403 //#define STAR_QUIT_NAME "TOPLEFT"
404 //#endif
405 #ifndef STAR_LEFT
406 #define STAR_LEFT BUTTON_MIDLEFT
407 #endif
408 #ifndef STAR_RIGHT
409 #define STAR_RIGHT BUTTON_MIDRIGHT
410 #endif
411 #ifndef STAR_UP
412 #define STAR_UP BUTTON_TOPMIDDLE
413 #endif
414 #ifndef STAR_DOWN
415 #define STAR_DOWN BUTTON_BOTTOMMIDDLE
416 #endif
417 #ifndef STAR_TOGGLE_CONTROL
418 #define STAR_TOGGLE_CONTROL BUTTON_CENTER
419 #define STAR_TOGGLE_CONTROL_NAME "CENTER"
420 #endif
421 #ifndef STAR_LEVEL_UP
422 #define STAR_LEVEL_UP BUTTON_TOPLEFT
423 #define STAR_LEVEL_UP_NAME "TOPLEFT"
424 #endif
425 #ifndef STAR_LEVEL_DOWN
426 #define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT
427 #define STAR_LEVEL_DOWN_NAME "BOTTOMLEFT"
428 #endif
429 #ifndef STAR_LEVEL_REPEAT
430 #define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT
431 #define STAR_LEVEL_REPEAT_NAME "BOTTOMRIGHT"
432 #endif
433 #endif
435 /* function returns because of USB? */
436 static bool usb_detected = false;
438 /* position of the ball */
439 static int ball_x, ball_y;
441 /* position of the block */
442 static int block_x, block_y;
444 /* number of stars to get to finish the level */
445 static int star_count;
447 /* the object we control : ball or block */
448 static int control;
450 /* the current board */
451 static char board[STAR_HEIGHT][STAR_WIDTH];
453 #include "pluginbitmaps/star_tiles.h"
455 #define TILE_WIDTH BMPWIDTH_star_tiles
456 #define TILE_HEIGHT (BMPHEIGHT_star_tiles/5)
457 #define STAR_OFFSET_X ((LCD_WIDTH - STAR_WIDTH * TILE_WIDTH) / 2)
458 #define STAR_OFFSET_Y ((LCD_HEIGHT - STAR_HEIGHT * TILE_HEIGHT - MAX(TILE_HEIGHT, 8)) / 2)
460 #define WALL 0
461 #define SPACE 1
462 #define BLOCK 2
463 #define STAR 3
464 #define BALL 4
466 /* char font size */
467 static int char_width = -1;
468 static int char_height = -1;
470 /* this arrays contains a group of levels loaded into memory */
471 static unsigned char* levels =
472 "****************\n"
473 "*X**........o*x*\n"
474 "*..........o.***\n"
475 "*.......**o....*\n"
476 "*...**.o......**\n"
477 "**.o..o.....o..*\n"
478 "*.o......o**.o.*\n"
479 "*.....**o.....o*\n"
480 "****************\n"
481 "\n"
482 ".*..*.*.*...*.**\n"
483 "*...o.........X*\n"
484 "...*o..*o...o...\n"
485 "*.*.o.....o..*.*\n"
486 "......*...o...*.\n"
487 "*....*x*..o....*\n"
488 "...*..*.*...*oo*\n"
489 "*.............*.\n"
490 ".*..*........*..\n"
491 "\n"
492 "****************\n"
493 "*...........o*x*\n"
494 "*...**......**X*\n"
495 "*...*o.........*\n"
496 "*.o.....o**...o*\n"
497 "*.*o..o..o*..o**\n"
498 "*.**o.*o..o.o***\n"
499 "*o....**o......*\n"
500 "****************\n"
501 "\n"
502 "****************\n"
503 "*............*x*\n"
504 "*.....*........*\n"
505 "**o*o.o*o*o*o*o*\n"
506 "*.*.*o.o*.*.*.**\n"
507 "**o*o*o.o*o*o*o*\n"
508 "*.....*........*\n"
509 "*...*.......*X.*\n"
510 "****************\n"
511 "\n"
512 ".**************.\n"
513 "*X..*...*..*...*\n"
514 "*..*o.*.o..o.*.*\n"
515 "**......*..*...*\n"
516 "*o.*o*........**\n"
517 "**.....*.o.*...*\n"
518 "*o*..*.*.*...*x*\n"
519 "*...*....o*..*o*\n"
520 ".**************.\n"
521 "\n"
522 "....************\n"
523 "...*...o...*o.o*\n"
524 "..*....o....*.**\n"
525 ".*.....o.......*\n"
526 "*X.....o.......*\n"
527 "**.....o..*...**\n"
528 "*......o....*..*\n"
529 "*x.*...o..**o..*\n"
530 "****************\n"
531 "\n"
532 "****************\n"
533 "*..............*\n"
534 ".**.***..*o.**o*\n"
535 ".*o..*o.*.*.*.*.\n"
536 "..*..*..***.**..\n"
537 ".**..*..*o*.*o**\n"
538 "*..............*\n"
539 "*..X*o....x..*o*\n"
540 "****************\n"
541 "\n"
542 "***************.\n"
543 "*..o**.........*\n"
544 "*..*o..**.o....*\n"
545 "*..o**.*.*o....*\n"
546 "**.....**..*o*.*\n"
547 "**.*.......o*o.*\n"
548 "*oxo*...o..*X*.*\n"
549 "**.............*\n"
550 ".***************\n"
551 "\n"
552 "..*.***********.\n"
553 ".*o*o......*..X*\n"
554 "*o.o*....o....*.\n"
555 ".*.*..o**..o*..*\n"
556 "*..*o.*oxo....o*\n"
557 "*.....o**.....*.\n"
558 "*o*o.........*..\n"
559 "*...........*...\n"
560 ".***********....\n"
561 "\n"
562 "....***********.\n"
563 "*****.o........*\n"
564 "*...x.***o.o*.o*\n"
565 "*.o...*o.*o...*.\n"
566 "*.....*..o..*.o*\n"
567 "*o*o..*.o*..*X*.\n"
568 ".*o...***..***..\n"
569 "*.........*.*.*.\n"
570 ".*********..*..*\n"
571 "\n"
572 "****************\n"
573 "*......*......X*\n"
574 "*..*oo.....oo.**\n"
575 "**...o...**...o*\n"
576 "*o....*o*oo..***\n"
577 "**.**....**....*\n"
578 "*o..o*.o....x.o*\n"
579 "**o***....*...**\n"
580 "***************.\n"
581 "\n"
582 "**.....**..****.\n"
583 "*X*****o.***.o**\n"
584 "*....oo.....o..*\n"
585 "*.**..**o..*o*.*\n"
586 "*.*.o.*.*o.**..*\n"
587 "*.**..**...*x*.*\n"
588 "*.....o........*\n"
589 "*........o.....*\n"
590 "****************\n"
591 "\n"
592 ".**************.\n"
593 "*.X*........o.**\n"
594 "*.*...*o...o**.*\n"
595 "*.......o....*.*\n"
596 "*.o..........*o*\n"
597 "*.*......o.....*\n"
598 "**......o.o..*o*\n"
599 "*x..*....o.*.*.*\n"
600 ".**************.\n"
601 "\n"
602 "****************\n"
603 "*o*o........o*o*\n"
604 "*.o*X......**..*\n"
605 "*.x........o...*\n"
606 "*........o*....*\n"
607 "*......o.......*\n"
608 "*.o*........*..*\n"
609 "*o*o........o*o*\n"
610 "****************\n"
611 "\n"
612 ".******.********\n"
613 "*.....o*.....o.*\n"
614 "*.*.o.*..*...o.*\n"
615 "*..X*...*oo.*o.*\n"
616 ".*.*...*.o..x*.*\n"
617 "*o.......*..*o.*\n"
618 ".*......o.....*.\n"
619 "*o............o*\n"
620 "****************\n"
621 "\n"
622 "****************\n"
623 "**.x*o.o......o*\n"
624 "*o.Xo*o.......**\n"
625 "**.***........**\n"
626 "**.....o*o*....*\n"
627 "*oo.......o*o..*\n"
628 "**.o....****o..*\n"
629 "**o*..*........*\n"
630 "****************\n"
631 "\n"
632 "****************\n"
633 "*.o*........*X.*\n"
634 "*.*..o*oo*o..*.*\n"
635 "*....*o**o*.o..*\n"
636 "*.o*.......o*..*\n"
637 "*..o*o....o*...*\n"
638 "*.*..*.**o*..*.*\n"
639 "*....o.*o...x..*\n"
640 "****************\n"
641 "\n"
642 "****************\n"
643 "*.o....o..x*...*\n"
644 "*..*o*o...*o...*\n"
645 "*...*o*....*o..*\n"
646 "*...o..*...o*o.*\n"
647 "*.*o*...*.o*...*\n"
648 "*.o*o.*.o.*....*\n"
649 "*o*X..*.....*..*\n"
650 "****************\n"
651 "\n"
652 "****************\n"
653 "*o...**.....**o*\n"
654 "*.*..*......*o.*\n"
655 "*.o*...o**..o..*\n"
656 "*.*....*o......*\n"
657 "*....*...o*....*\n"
658 "*.**.o*.**o..*x*\n"
659 "*.o*.*o.....**X*\n"
660 "****************\n"
661 "\n"
662 "****************\n"
663 "*...o*o........*\n"
664 "**o..o*.**o...**\n"
665 "*.*.*.o...*..*.*\n"
666 "*.x.*..**..*.Xo*\n"
667 "*.*..*...o.*.*.*\n"
668 "**...o**.*o..o**\n"
669 "*........o*o...*\n"
670 "****************";
673 * Do a pretty transition from one level to another.
675 static void star_transition_update(void)
677 const int center_x = LCD_WIDTH / 2;
678 const int center_y = LCD_HEIGHT / 2;
679 int x = 0;
680 int y = 0;
681 #if LCD_WIDTH >= LCD_HEIGHT
682 #if defined(IPOD_VIDEO)
683 const int step = 4;
684 #else
685 const int step = 1;
686 #endif
687 const int lcd_demi_width = LCD_WIDTH / 2;
688 int var_y = 0;
690 for (; x < lcd_demi_width ; x+=step)
692 var_y += LCD_HEIGHT;
693 if (var_y > LCD_WIDTH)
695 var_y -= LCD_WIDTH;
696 y+=step;
698 if( x )
700 rb->lcd_update_rect(center_x - x, center_y - y, x*2, step);
701 rb->lcd_update_rect(center_x - x, center_y + y - step, x*2, step);
703 if( y )
705 rb->lcd_update_rect(center_x - x, center_y - y, step, y*2);
706 rb->lcd_update_rect(center_x + x - step, center_y - y, step, y*2);
708 STAR_SLEEP
710 #else
711 int lcd_demi_height = LCD_HEIGHT / 2;
712 int var_x = 0;
714 for (; y < lcd_demi_height ; y++)
716 var_x += LCD_WIDTH;
717 if (var_x > LCD_HEIGHT)
719 var_x -= LCD_HEIGHT;
720 x++;
722 if( x )
724 rb->lcd_update_rect(center_x - x, center_y - y, x * 2, 1);
725 rb->lcd_update_rect(center_x - x, center_y + y - 1, x * 2, 1);
727 if( y )
729 rb->lcd_update_rect(center_x - x, center_y - y, 1, y * 2);
730 rb->lcd_update_rect(center_x + x - 1, center_y - y, 1, y * 2);
732 STAR_SLEEP
734 #endif
735 rb->lcd_update();
739 * Display information board of the current level.
741 static void star_display_board_info(int current_level)
743 int label_pos_y, tile_pos_y;
744 char str_info[32];
746 if (TILE_HEIGHT > char_height)
748 tile_pos_y = LCD_HEIGHT - TILE_HEIGHT;
749 label_pos_y = tile_pos_y + (TILE_HEIGHT - char_height) / 2;
751 else
753 label_pos_y = LCD_HEIGHT - char_height;
754 tile_pos_y = label_pos_y + (char_height - TILE_HEIGHT) / 2;
757 rb->snprintf(str_info, sizeof(str_info), "L:%02d", current_level + 1);
758 rb->lcd_putsxy(STAR_OFFSET_X, label_pos_y, str_info);
759 rb->snprintf(str_info, sizeof(str_info), "S:%02d", star_count);
760 rb->lcd_putsxy(LCD_WIDTH/2 - 2 * char_width, label_pos_y, str_info);
761 rb->lcd_putsxy(STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH - 2 * char_width,
762 label_pos_y, "C:");
764 rb->lcd_bitmap_part(star_tiles, 0, control == STAR_CONTROL_BALL ?
765 BALL*TILE_HEIGHT : BLOCK*TILE_HEIGHT,
766 STRIDE( SCREEN_MAIN,
767 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
768 STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH,
769 tile_pos_y, TILE_WIDTH, TILE_HEIGHT);
771 rb->lcd_update_rect(0, MIN(label_pos_y, tile_pos_y), LCD_WIDTH,
772 MAX(TILE_HEIGHT, char_height));
777 * Load a level into board array.
779 static int star_load_level(int current_level)
781 int x, y;
782 char *ptr_tab;
784 if (current_level < 0)
785 current_level = 0;
786 else if (current_level > STAR_LEVEL_COUNT-1)
787 current_level = STAR_LEVEL_COUNT-1;
790 ptr_tab = levels + current_level * STAR_LEVEL_SIZE;
791 control = STAR_CONTROL_BALL;
792 star_count = 0;
794 rb->lcd_clear_display();
796 for (y = 0 ; y < STAR_HEIGHT ; y++)
798 for (x = 0 ; x < STAR_WIDTH ; x++)
800 board[y][x] = *ptr_tab;
801 switch (*ptr_tab)
803 # define DRAW_TILE( a ) \
804 rb->lcd_bitmap_part( star_tiles, 0, \
805 a*TILE_HEIGHT, \
806 STRIDE( SCREEN_MAIN, \
807 BMPWIDTH_star_tiles, \
808 BMPHEIGHT_star_tiles), \
809 STAR_OFFSET_X + x * TILE_WIDTH, \
810 STAR_OFFSET_Y + y * TILE_HEIGHT, \
811 TILE_WIDTH, TILE_HEIGHT);
813 case STAR_VOID:
814 DRAW_TILE( SPACE );
815 break;
817 case STAR_WALL:
818 DRAW_TILE( WALL );
819 break;
821 case STAR_STAR:
822 DRAW_TILE( STAR );
823 star_count++;
824 break;
826 case STAR_BALL:
827 ball_x = x;
828 ball_y = y;
829 DRAW_TILE( BALL );
830 break;
833 case STAR_BLOCK:
834 block_x = x;
835 block_y = y;
836 DRAW_TILE( BLOCK );
837 break;
839 ptr_tab++;
841 ptr_tab++;
843 star_display_board_info(current_level);
844 star_transition_update();
845 return 1;
848 static void star_animate_tile(int tile_no, int start_x, int start_y,
849 int delta_x, int delta_y)
851 int i;
853 if (delta_x != 0) /* horizontal */
855 for (i = 1 ; i <= TILE_WIDTH ; i++)
857 STAR_SLEEP
858 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT,
859 STRIDE( SCREEN_MAIN,
860 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
861 start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
862 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT,
863 STRIDE( SCREEN_MAIN,
864 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
865 start_x + delta_x * i, start_y, TILE_WIDTH, TILE_HEIGHT);
866 rb->lcd_update_rect(start_x + delta_x * i - (delta_x>0?1:0),
867 start_y, TILE_WIDTH + 1, TILE_HEIGHT);
870 else /* vertical */
872 for (i = 1 ; i <= TILE_HEIGHT ; i++)
874 STAR_SLEEP
875 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT,
876 STRIDE( SCREEN_MAIN,
877 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
878 start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
879 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT,
880 STRIDE( SCREEN_MAIN,
881 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
882 start_x, start_y + delta_y * i, TILE_WIDTH, TILE_HEIGHT);
883 rb->lcd_update_rect(start_x, start_y + delta_y * i - (delta_y>0?1:0),
884 TILE_WIDTH, TILE_HEIGHT + 1);
890 * Run the game.
892 static int star_run_game(int current_level)
894 int move_x = 0;
895 int move_y = 0;
896 int key;
897 int lastkey = BUTTON_NONE;
899 int label_offset_y;
901 label_offset_y = LCD_HEIGHT - char_height;
903 if (!star_load_level(current_level))
904 return 0;
906 while (true)
908 move_x = 0;
909 move_y = 0;
911 while ((move_x == 0) && (move_y == 0))
913 key = rb->button_get(true);
914 switch (key)
916 #ifdef STAR_RC_QUIT
917 case STAR_RC_QUIT:
918 #endif
919 case STAR_QUIT:
920 return -1;
922 case STAR_LEFT:
923 move_x = -1;
924 break;
926 case STAR_RIGHT:
927 move_x = 1;
928 break;
930 case STAR_UP:
931 move_y = -1;
932 break;
934 case STAR_DOWN:
935 move_y = 1;
936 break;
938 case STAR_LEVEL_DOWN:
939 #ifdef STAR_LEVEL_DOWN_PRE
940 if (lastkey != STAR_LEVEL_DOWN_PRE)
941 break;
942 #endif
943 if (current_level > 0)
945 current_level--;
946 star_load_level(current_level);
948 break;
950 case STAR_LEVEL_REPEAT:
951 star_load_level(current_level);
952 break;
954 case STAR_LEVEL_UP:
955 #ifdef STAR_LEVEL_UP_PRE
956 if (lastkey != STAR_LEVEL_UP_PRE)
957 break;
958 #endif
959 if (current_level < STAR_LEVEL_COUNT - 1)
961 current_level++;
962 star_load_level(current_level);
964 break;
966 case STAR_TOGGLE_CONTROL:
967 #ifdef STAR_TOGGLE_CONTROL_PRE
968 if (lastkey != STAR_TOGGLE_CONTROL_PRE)
969 break;
970 #endif
971 #ifdef STAR_TOGGLE_CONTROL2
972 case STAR_TOGGLE_CONTROL2:
973 #endif
974 if (control == STAR_CONTROL_BALL)
975 control = STAR_CONTROL_BLOCK;
976 else
977 control = STAR_CONTROL_BALL;
978 star_display_board_info(current_level);
979 break;
981 default:
982 if (rb->default_event_handler(key) == SYS_USB_CONNECTED)
984 usb_detected = true;
985 return 0;
987 break;
989 if (key != BUTTON_NONE)
990 lastkey = key;
993 if (control == STAR_CONTROL_BALL)
995 board[ball_y][ball_x] = STAR_VOID;
996 while ((board[ball_y + move_y][ball_x + move_x] == STAR_VOID
997 || board[ball_y + move_y][ball_x + move_x] == STAR_STAR))
1000 star_animate_tile(BALL, STAR_OFFSET_X + ball_x * TILE_WIDTH,
1001 STAR_OFFSET_Y + ball_y * TILE_HEIGHT,
1002 move_x, move_y);
1003 ball_x += move_x;
1004 ball_y += move_y;
1006 if (board[ball_y][ball_x] == STAR_STAR)
1008 board[ball_y][ball_x] = STAR_VOID;
1009 star_count--;
1011 star_display_board_info(current_level);
1014 board[ball_y][ball_x] = STAR_BALL;
1016 else
1018 board[block_y][block_x] = STAR_VOID;
1019 while (board[block_y + move_y][block_x + move_x] == STAR_VOID)
1021 star_animate_tile(BLOCK, STAR_OFFSET_X + block_x * TILE_WIDTH,
1022 STAR_OFFSET_Y + block_y * TILE_HEIGHT,
1023 move_x, move_y);
1024 block_x += move_x;
1025 block_y += move_y;
1027 board[block_y][block_x] = STAR_BLOCK;
1030 if (star_count == 0)
1032 current_level++;
1033 if (current_level == STAR_LEVEL_COUNT)
1035 rb->lcd_clear_display();
1036 rb->splash(HZ*2, "Congratulations!");
1037 rb->lcd_update();
1039 /* There is no such level as STAR_LEVEL_COUNT so it can't be the
1040 * current_level */
1041 current_level--;
1042 return 1;
1044 star_load_level(current_level);
1050 * Display help text.
1052 static bool star_help(void)
1054 static char* help_text[] = {
1055 "Star", "", "Aim", "",
1056 "Take", "all", "the", "stars", "to", "go", "to", "the", "next", "level.",
1057 "You", "can", "toggle", "control", "with", "the", "block", "to", "use",
1058 "it", "as", "a", "mobile", "wall.", "The", "block", "cannot", "take",
1059 "stars.", "", "",
1060 "Controls", "",
1061 STAR_TOGGLE_CONTROL_NAME":", "Toggle", "control", "",
1062 STAR_QUIT_NAME":", "Exit", "",
1063 STAR_LEVEL_DOWN_NAME":", "Prev.", "level", "",
1064 STAR_LEVEL_REPEAT_NAME":", "Reset", "level", "",
1065 STAR_LEVEL_UP_NAME":", "Next", "level"
1067 static struct style_text formation[]={
1068 { 0, TEXT_CENTER|TEXT_UNDERLINE },
1069 { 2, C_RED },
1070 { 35, C_RED },
1071 LAST_STYLE_ITEM
1073 #if LCD_DEPTH > 1 && !defined(HAVE_LCD_COLOR)
1074 rb->lcd_set_background(LCD_WHITE);
1075 rb->lcd_set_foreground(LCD_BLACK);
1076 #endif
1077 if (display_text(ARRAYLEN(help_text), help_text, formation, NULL, true))
1078 return true;
1079 #if LCD_DEPTH > 1 && !defined(HAVE_LCD_COLOR)
1080 rb->lcd_set_background(LCD_BLACK);
1081 rb->lcd_set_foreground(LCD_WHITE);
1082 #endif
1083 return false;
1087 * Display the choice menu.
1089 static int star_menu(void)
1091 int selection, level=1;
1092 bool menu_quit = false;
1094 MENUITEM_STRINGLIST(menu, "Star Menu", NULL,
1095 "Start Game","Choose Level",
1096 "Help", "Playback Control", "Quit");
1098 while(!menu_quit)
1100 switch(rb->do_menu(&menu, &selection, NULL, false))
1102 case 0:
1103 /* use system font and get the size of char */
1104 rb->lcd_setfont(FONT_SYSFIXED);
1105 rb->lcd_getstringsize("a", &char_width, &char_height);
1106 star_run_game(level-1);
1107 rb->lcd_setfont(FONT_UI);
1108 break;
1109 case 1:
1110 rb->set_int("Level", "", UNIT_INT, &level,
1111 NULL, 1, 1, STAR_LEVEL_COUNT, NULL );
1112 break;
1113 case 2:
1114 if(star_help())
1115 usb_detected = true;
1116 break;
1117 case 3:
1118 playback_control(NULL);
1119 break;
1120 case 4:
1121 menu_quit = true;
1122 break;
1124 if(usb_detected)
1125 return PLUGIN_USB_CONNECTED;
1128 return PLUGIN_OK;
1132 * Main entry point
1134 enum plugin_status plugin_start(const void* parameter)
1136 (void)parameter;
1138 #if LCD_DEPTH > 1
1139 rb->lcd_set_backdrop(NULL);
1140 rb->lcd_set_background( LCD_BLACK );
1141 rb->lcd_set_foreground( LCD_WHITE );
1142 #endif
1144 /* display choice menu */
1145 return star_menu();
1148 #endif