Some formatting fixes, reported by Alexander Levin
[kugel-rb.git] / apps / plugins / star.c
blobefd2dae6fecd8f3913a58cea58b0e2771dbb4575
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 #else
380 #error No keymap defined!
381 #endif
383 #ifdef HAVE_TOUCHSCREEN
384 //#ifndef STAR_QUIT
385 //#define STAR_QUIT BUTTON_TOPLEFT
386 //#define STAR_QUIT_NAME "TOPLEFT"
387 //#endif
388 #ifndef STAR_LEFT
389 #define STAR_LEFT BUTTON_MIDLEFT
390 #endif
391 #ifndef STAR_RIGHT
392 #define STAR_RIGHT BUTTON_MIDRIGHT
393 #endif
394 #ifndef STAR_UP
395 #define STAR_UP BUTTON_TOPMIDDLE
396 #endif
397 #ifndef STAR_DOWN
398 #define STAR_DOWN BUTTON_BOTTOMMIDDLE
399 #endif
400 #ifndef STAR_TOGGLE_CONTROL
401 #define STAR_TOGGLE_CONTROL BUTTON_CENTER
402 #define STAR_TOGGLE_CONTROL_NAME "CENTER"
403 #endif
404 #ifndef STAR_LEVEL_UP
405 #define STAR_LEVEL_UP BUTTON_TOPLEFT
406 #define STAR_LEVEL_UP_NAME "TOPLEFT"
407 #endif
408 #ifndef STAR_LEVEL_DOWN
409 #define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT
410 #define STAR_LEVEL_DOWN_NAME "BOTTOMLEFT"
411 #endif
412 #ifndef STAR_LEVEL_REPEAT
413 #define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT
414 #define STAR_LEVEL_REPEAT_NAME "BOTTOMRIGHT"
415 #endif
416 #endif
418 /* function returns because of USB? */
419 static bool usb_detected = false;
421 /* position of the ball */
422 static int ball_x, ball_y;
424 /* position of the block */
425 static int block_x, block_y;
427 /* number of stars to get to finish the level */
428 static int star_count;
430 /* the object we control : ball or block */
431 static int control;
433 /* the current board */
434 static char board[STAR_HEIGHT][STAR_WIDTH];
436 #include "pluginbitmaps/star_tiles.h"
438 #define TILE_WIDTH BMPWIDTH_star_tiles
439 #define TILE_HEIGHT (BMPHEIGHT_star_tiles/5)
440 #define STAR_OFFSET_X ((LCD_WIDTH - STAR_WIDTH * TILE_WIDTH) / 2)
441 #define STAR_OFFSET_Y ((LCD_HEIGHT - STAR_HEIGHT * TILE_HEIGHT - MAX(TILE_HEIGHT, 8)) / 2)
443 #define WALL 0
444 #define SPACE 1
445 #define BLOCK 2
446 #define STAR 3
447 #define BALL 4
449 /* char font size */
450 static int char_width = -1;
451 static int char_height = -1;
453 /* this arrays contains a group of levels loaded into memory */
454 static unsigned char* levels =
455 "****************\n"
456 "*X**........o*x*\n"
457 "*..........o.***\n"
458 "*.......**o....*\n"
459 "*...**.o......**\n"
460 "**.o..o.....o..*\n"
461 "*.o......o**.o.*\n"
462 "*.....**o.....o*\n"
463 "****************\n"
464 "\n"
465 ".*..*.*.*...*.**\n"
466 "*...o.........X*\n"
467 "...*o..*o...o...\n"
468 "*.*.o.....o..*.*\n"
469 "......*...o...*.\n"
470 "*....*x*..o....*\n"
471 "...*..*.*...*oo*\n"
472 "*.............*.\n"
473 ".*..*........*..\n"
474 "\n"
475 "****************\n"
476 "*...........o*x*\n"
477 "*...**......**X*\n"
478 "*...*o.........*\n"
479 "*.o.....o**...o*\n"
480 "*.*o..o..o*..o**\n"
481 "*.**o.*o..o.o***\n"
482 "*o....**o......*\n"
483 "****************\n"
484 "\n"
485 "****************\n"
486 "*............*x*\n"
487 "*.....*........*\n"
488 "**o*o.o*o*o*o*o*\n"
489 "*.*.*o.o*.*.*.**\n"
490 "**o*o*o.o*o*o*o*\n"
491 "*.....*........*\n"
492 "*...*.......*X.*\n"
493 "****************\n"
494 "\n"
495 ".**************.\n"
496 "*X..*...*..*...*\n"
497 "*..*o.*.o..o.*.*\n"
498 "**......*..*...*\n"
499 "*o.*o*........**\n"
500 "**.....*.o.*...*\n"
501 "*o*..*.*.*...*x*\n"
502 "*...*....o*..*o*\n"
503 ".**************.\n"
504 "\n"
505 "....************\n"
506 "...*...o...*o.o*\n"
507 "..*....o....*.**\n"
508 ".*.....o.......*\n"
509 "*X.....o.......*\n"
510 "**.....o..*...**\n"
511 "*......o....*..*\n"
512 "*x.*...o..**o..*\n"
513 "****************\n"
514 "\n"
515 "****************\n"
516 "*..............*\n"
517 ".**.***..*o.**o*\n"
518 ".*o..*o.*.*.*.*.\n"
519 "..*..*..***.**..\n"
520 ".**..*..*o*.*o**\n"
521 "*..............*\n"
522 "*..X*o....x..*o*\n"
523 "****************\n"
524 "\n"
525 "***************.\n"
526 "*..o**.........*\n"
527 "*..*o..**.o....*\n"
528 "*..o**.*.*o....*\n"
529 "**.....**..*o*.*\n"
530 "**.*.......o*o.*\n"
531 "*oxo*...o..*X*.*\n"
532 "**.............*\n"
533 ".***************\n"
534 "\n"
535 "..*.***********.\n"
536 ".*o*o......*..X*\n"
537 "*o.o*....o....*.\n"
538 ".*.*..o**..o*..*\n"
539 "*..*o.*oxo....o*\n"
540 "*.....o**.....*.\n"
541 "*o*o.........*..\n"
542 "*...........*...\n"
543 ".***********....\n"
544 "\n"
545 "....***********.\n"
546 "*****.o........*\n"
547 "*...x.***o.o*.o*\n"
548 "*.o...*o.*o...*.\n"
549 "*.....*..o..*.o*\n"
550 "*o*o..*.o*..*X*.\n"
551 ".*o...***..***..\n"
552 "*.........*.*.*.\n"
553 ".*********..*..*\n"
554 "\n"
555 "****************\n"
556 "*......*......X*\n"
557 "*..*oo.....oo.**\n"
558 "**...o...**...o*\n"
559 "*o....*o*oo..***\n"
560 "**.**....**....*\n"
561 "*o..o*.o....x.o*\n"
562 "**o***....*...**\n"
563 "***************.\n"
564 "\n"
565 "**.....**..****.\n"
566 "*X*****o.***.o**\n"
567 "*....oo.....o..*\n"
568 "*.**..**o..*o*.*\n"
569 "*.*.o.*.*o.**..*\n"
570 "*.**..**...*x*.*\n"
571 "*.....o........*\n"
572 "*........o.....*\n"
573 "****************\n"
574 "\n"
575 ".**************.\n"
576 "*.X*........o.**\n"
577 "*.*...*o...o**.*\n"
578 "*.......o....*.*\n"
579 "*.o..........*o*\n"
580 "*.*......o.....*\n"
581 "**......o.o..*o*\n"
582 "*x..*....o.*.*.*\n"
583 ".**************.\n"
584 "\n"
585 "****************\n"
586 "*o*o........o*o*\n"
587 "*.o*X......**..*\n"
588 "*.x........o...*\n"
589 "*........o*....*\n"
590 "*......o.......*\n"
591 "*.o*........*..*\n"
592 "*o*o........o*o*\n"
593 "****************\n"
594 "\n"
595 ".******.********\n"
596 "*.....o*.....o.*\n"
597 "*.*.o.*..*...o.*\n"
598 "*..X*...*oo.*o.*\n"
599 ".*.*...*.o..x*.*\n"
600 "*o.......*..*o.*\n"
601 ".*......o.....*.\n"
602 "*o............o*\n"
603 "****************\n"
604 "\n"
605 "****************\n"
606 "**.x*o.o......o*\n"
607 "*o.Xo*o.......**\n"
608 "**.***........**\n"
609 "**.....o*o*....*\n"
610 "*oo.......o*o..*\n"
611 "**.o....****o..*\n"
612 "**o*..*........*\n"
613 "****************\n"
614 "\n"
615 "****************\n"
616 "*.o*........*X.*\n"
617 "*.*..o*oo*o..*.*\n"
618 "*....*o**o*.o..*\n"
619 "*.o*.......o*..*\n"
620 "*..o*o....o*...*\n"
621 "*.*..*.**o*..*.*\n"
622 "*....o.*o...x..*\n"
623 "****************\n"
624 "\n"
625 "****************\n"
626 "*.o....o..x*...*\n"
627 "*..*o*o...*o...*\n"
628 "*...*o*....*o..*\n"
629 "*...o..*...o*o.*\n"
630 "*.*o*...*.o*...*\n"
631 "*.o*o.*.o.*....*\n"
632 "*o*X..*.....*..*\n"
633 "****************\n"
634 "\n"
635 "****************\n"
636 "*o...**.....**o*\n"
637 "*.*..*......*o.*\n"
638 "*.o*...o**..o..*\n"
639 "*.*....*o......*\n"
640 "*....*...o*....*\n"
641 "*.**.o*.**o..*x*\n"
642 "*.o*.*o.....**X*\n"
643 "****************\n"
644 "\n"
645 "****************\n"
646 "*...o*o........*\n"
647 "**o..o*.**o...**\n"
648 "*.*.*.o...*..*.*\n"
649 "*.x.*..**..*.Xo*\n"
650 "*.*..*...o.*.*.*\n"
651 "**...o**.*o..o**\n"
652 "*........o*o...*\n"
653 "****************";
656 * Do a pretty transition from one level to another.
658 static void star_transition_update(void)
660 const int center_x = LCD_WIDTH / 2;
661 const int center_y = LCD_HEIGHT / 2;
662 int x = 0;
663 int y = 0;
664 #if LCD_WIDTH >= LCD_HEIGHT
665 #if defined(IPOD_VIDEO)
666 const int step = 4;
667 #else
668 const int step = 1;
669 #endif
670 const int lcd_demi_width = LCD_WIDTH / 2;
671 int var_y = 0;
673 for (; x < lcd_demi_width ; x+=step)
675 var_y += LCD_HEIGHT;
676 if (var_y > LCD_WIDTH)
678 var_y -= LCD_WIDTH;
679 y+=step;
681 if( x )
683 rb->lcd_update_rect(center_x - x, center_y - y, x*2, step);
684 rb->lcd_update_rect(center_x - x, center_y + y - step, x*2, step);
686 if( y )
688 rb->lcd_update_rect(center_x - x, center_y - y, step, y*2);
689 rb->lcd_update_rect(center_x + x - step, center_y - y, step, y*2);
691 STAR_SLEEP
693 #else
694 int lcd_demi_height = LCD_HEIGHT / 2;
695 int var_x = 0;
697 for (; y < lcd_demi_height ; y++)
699 var_x += LCD_WIDTH;
700 if (var_x > LCD_HEIGHT)
702 var_x -= LCD_HEIGHT;
703 x++;
705 if( x )
707 rb->lcd_update_rect(center_x - x, center_y - y, x * 2, 1);
708 rb->lcd_update_rect(center_x - x, center_y + y - 1, x * 2, 1);
710 if( y )
712 rb->lcd_update_rect(center_x - x, center_y - y, 1, y * 2);
713 rb->lcd_update_rect(center_x + x - 1, center_y - y, 1, y * 2);
715 STAR_SLEEP
717 #endif
718 rb->lcd_update();
722 * Display information board of the current level.
724 static void star_display_board_info(int current_level)
726 int label_pos_y, tile_pos_y;
727 char str_info[32];
729 if (TILE_HEIGHT > char_height)
731 tile_pos_y = LCD_HEIGHT - TILE_HEIGHT;
732 label_pos_y = tile_pos_y + (TILE_HEIGHT - char_height) / 2;
734 else
736 label_pos_y = LCD_HEIGHT - char_height;
737 tile_pos_y = label_pos_y + (char_height - TILE_HEIGHT) / 2;
740 rb->snprintf(str_info, sizeof(str_info), "L:%02d", current_level + 1);
741 rb->lcd_putsxy(STAR_OFFSET_X, label_pos_y, str_info);
742 rb->snprintf(str_info, sizeof(str_info), "S:%02d", star_count);
743 rb->lcd_putsxy(LCD_WIDTH/2 - 2 * char_width, label_pos_y, str_info);
744 rb->lcd_putsxy(STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH - 2 * char_width,
745 label_pos_y, "C:");
747 rb->lcd_bitmap_part(star_tiles, 0, control == STAR_CONTROL_BALL ?
748 BALL*TILE_HEIGHT : BLOCK*TILE_HEIGHT,
749 STRIDE( SCREEN_MAIN,
750 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
751 STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH,
752 tile_pos_y, TILE_WIDTH, TILE_HEIGHT);
754 rb->lcd_update_rect(0, MIN(label_pos_y, tile_pos_y), LCD_WIDTH,
755 MAX(TILE_HEIGHT, char_height));
760 * Load a level into board array.
762 static int star_load_level(int current_level)
764 int x, y;
765 char *ptr_tab;
767 if (current_level < 0)
768 current_level = 0;
769 else if (current_level > STAR_LEVEL_COUNT-1)
770 current_level = STAR_LEVEL_COUNT-1;
773 ptr_tab = levels + current_level * STAR_LEVEL_SIZE;
774 control = STAR_CONTROL_BALL;
775 star_count = 0;
777 rb->lcd_clear_display();
779 for (y = 0 ; y < STAR_HEIGHT ; y++)
781 for (x = 0 ; x < STAR_WIDTH ; x++)
783 board[y][x] = *ptr_tab;
784 switch (*ptr_tab)
786 # define DRAW_TILE( a ) \
787 rb->lcd_bitmap_part( star_tiles, 0, \
788 a*TILE_HEIGHT, \
789 STRIDE( SCREEN_MAIN, \
790 BMPWIDTH_star_tiles, \
791 BMPHEIGHT_star_tiles), \
792 STAR_OFFSET_X + x * TILE_WIDTH, \
793 STAR_OFFSET_Y + y * TILE_HEIGHT, \
794 TILE_WIDTH, TILE_HEIGHT);
796 case STAR_VOID:
797 DRAW_TILE( SPACE );
798 break;
800 case STAR_WALL:
801 DRAW_TILE( WALL );
802 break;
804 case STAR_STAR:
805 DRAW_TILE( STAR );
806 star_count++;
807 break;
809 case STAR_BALL:
810 ball_x = x;
811 ball_y = y;
812 DRAW_TILE( BALL );
813 break;
816 case STAR_BLOCK:
817 block_x = x;
818 block_y = y;
819 DRAW_TILE( BLOCK );
820 break;
822 ptr_tab++;
824 ptr_tab++;
826 star_display_board_info(current_level);
827 star_transition_update();
828 return 1;
831 static void star_animate_tile(int tile_no, int start_x, int start_y,
832 int delta_x, int delta_y)
834 int i;
836 if (delta_x != 0) /* horizontal */
838 for (i = 1 ; i <= TILE_WIDTH ; i++)
840 STAR_SLEEP
841 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT,
842 STRIDE( SCREEN_MAIN,
843 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
844 start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
845 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT,
846 STRIDE( SCREEN_MAIN,
847 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
848 start_x + delta_x * i, start_y, TILE_WIDTH, TILE_HEIGHT);
849 rb->lcd_update_rect(start_x + delta_x * i - (delta_x>0?1:0),
850 start_y, TILE_WIDTH + 1, TILE_HEIGHT);
853 else /* vertical */
855 for (i = 1 ; i <= TILE_HEIGHT ; 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, start_y + delta_y * i, TILE_WIDTH, TILE_HEIGHT);
866 rb->lcd_update_rect(start_x, start_y + delta_y * i - (delta_y>0?1:0),
867 TILE_WIDTH, TILE_HEIGHT + 1);
873 * Run the game.
875 static int star_run_game(int current_level)
877 int move_x = 0;
878 int move_y = 0;
879 int key;
880 int lastkey = BUTTON_NONE;
882 int label_offset_y;
884 label_offset_y = LCD_HEIGHT - char_height;
886 if (!star_load_level(current_level))
887 return 0;
889 while (true)
891 move_x = 0;
892 move_y = 0;
894 while ((move_x == 0) && (move_y == 0))
896 key = rb->button_get(true);
897 switch (key)
899 #ifdef STAR_RC_QUIT
900 case STAR_RC_QUIT:
901 #endif
902 case STAR_QUIT:
903 return -1;
905 case STAR_LEFT:
906 move_x = -1;
907 break;
909 case STAR_RIGHT:
910 move_x = 1;
911 break;
913 case STAR_UP:
914 move_y = -1;
915 break;
917 case STAR_DOWN:
918 move_y = 1;
919 break;
921 case STAR_LEVEL_DOWN:
922 #ifdef STAR_LEVEL_DOWN_PRE
923 if (lastkey != STAR_LEVEL_DOWN_PRE)
924 break;
925 #endif
926 if (current_level > 0)
928 current_level--;
929 star_load_level(current_level);
931 break;
933 case STAR_LEVEL_REPEAT:
934 star_load_level(current_level);
935 break;
937 case STAR_LEVEL_UP:
938 #ifdef STAR_LEVEL_UP_PRE
939 if (lastkey != STAR_LEVEL_UP_PRE)
940 break;
941 #endif
942 if (current_level < STAR_LEVEL_COUNT - 1)
944 current_level++;
945 star_load_level(current_level);
947 break;
949 case STAR_TOGGLE_CONTROL:
950 #ifdef STAR_TOGGLE_CONTROL_PRE
951 if (lastkey != STAR_TOGGLE_CONTROL_PRE)
952 break;
953 #endif
954 #ifdef STAR_TOGGLE_CONTROL2
955 case STAR_TOGGLE_CONTROL2:
956 #endif
957 if (control == STAR_CONTROL_BALL)
958 control = STAR_CONTROL_BLOCK;
959 else
960 control = STAR_CONTROL_BALL;
961 star_display_board_info(current_level);
962 break;
964 default:
965 if (rb->default_event_handler(key) == SYS_USB_CONNECTED)
967 usb_detected = true;
968 return 0;
970 break;
972 if (key != BUTTON_NONE)
973 lastkey = key;
976 if (control == STAR_CONTROL_BALL)
978 board[ball_y][ball_x] = STAR_VOID;
979 while ((board[ball_y + move_y][ball_x + move_x] == STAR_VOID
980 || board[ball_y + move_y][ball_x + move_x] == STAR_STAR))
983 star_animate_tile(BALL, STAR_OFFSET_X + ball_x * TILE_WIDTH,
984 STAR_OFFSET_Y + ball_y * TILE_HEIGHT,
985 move_x, move_y);
986 ball_x += move_x;
987 ball_y += move_y;
989 if (board[ball_y][ball_x] == STAR_STAR)
991 board[ball_y][ball_x] = STAR_VOID;
992 star_count--;
994 star_display_board_info(current_level);
997 board[ball_y][ball_x] = STAR_BALL;
999 else
1001 board[block_y][block_x] = STAR_VOID;
1002 while (board[block_y + move_y][block_x + move_x] == STAR_VOID)
1004 star_animate_tile(BLOCK, STAR_OFFSET_X + block_x * TILE_WIDTH,
1005 STAR_OFFSET_Y + block_y * TILE_HEIGHT,
1006 move_x, move_y);
1007 block_x += move_x;
1008 block_y += move_y;
1010 board[block_y][block_x] = STAR_BLOCK;
1013 if (star_count == 0)
1015 current_level++;
1016 if (current_level == STAR_LEVEL_COUNT)
1018 rb->lcd_clear_display();
1019 rb->splash(HZ*2, "Congratulations!");
1020 rb->lcd_update();
1022 /* There is no such level as STAR_LEVEL_COUNT so it can't be the
1023 * current_level */
1024 current_level--;
1025 return 1;
1027 star_load_level(current_level);
1033 * Display help text.
1035 static bool star_help(void)
1037 int button;
1038 #define WORDS (sizeof help_text / sizeof (char*))
1039 static char* help_text[] = {
1040 "Star", "", "Aim", "",
1041 "Take", "all", "the", "stars", "to", "go", "to", "the", "next", "level.",
1042 "You", "can", "toggle", "control", "with", "the", "block", "to", "use",
1043 "it", "as", "a", "mobile", "wall.", "The", "block", "cannot", "take",
1044 "stars.", "", "",
1045 "Controls", "",
1046 STAR_TOGGLE_CONTROL_NAME":", "Toggle", "control", "",
1047 STAR_QUIT_NAME":", "Exit", "",
1048 STAR_LEVEL_DOWN_NAME":", "Prev.", "level", "",
1049 STAR_LEVEL_REPEAT_NAME":", "Reset", "level", "",
1050 STAR_LEVEL_UP_NAME":", "Next", "level"
1052 static struct style_text formation[]={
1053 { 0, TEXT_CENTER|TEXT_UNDERLINE },
1054 { 2, C_RED },
1055 { 35, C_RED },
1056 { -1, 0 }
1058 #if LCD_DEPTH > 1
1059 #ifndef HAVE_LCD_COLOR
1060 rb->lcd_set_background(LCD_WHITE );
1061 rb->lcd_set_foreground(LCD_BLACK );
1062 #endif
1063 #endif
1064 if (display_text(WORDS, help_text, formation, NULL))
1065 return true;
1066 do {
1067 button = rb->button_get(true);
1068 if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
1069 return true;
1070 } while( ( button == BUTTON_NONE )
1071 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
1072 #if LCD_DEPTH > 1
1073 #ifndef HAVE_LCD_COLOR
1074 rb->lcd_set_background(LCD_BLACK );
1075 rb->lcd_set_foreground(LCD_WHITE );
1076 #endif
1077 #endif
1078 return false;
1082 * Display the choice menu.
1084 static int star_menu(void)
1086 int selection, level=1;
1087 bool menu_quit = false;
1089 MENUITEM_STRINGLIST(menu, "Star Menu", NULL,
1090 "Start Game","Choose Level",
1091 "Help", "Playback Control", "Quit");
1093 while(!menu_quit)
1095 switch(rb->do_menu(&menu, &selection, NULL, false))
1097 case 0:
1098 /* use system font and get the size of char */
1099 rb->lcd_setfont(FONT_SYSFIXED);
1100 rb->lcd_getstringsize("a", &char_width, &char_height);
1101 star_run_game(level-1);
1102 rb->lcd_setfont(FONT_UI);
1103 break;
1104 case 1:
1105 rb->set_int("Level", "", UNIT_INT, &level,
1106 NULL, 1, 1, STAR_LEVEL_COUNT, NULL );
1107 break;
1108 case 2:
1109 if(star_help())
1110 usb_detected = true;
1111 break;
1112 case 3:
1113 playback_control(NULL);
1114 break;
1115 case 4:
1116 menu_quit = true;
1117 break;
1119 if(usb_detected)
1120 return PLUGIN_USB_CONNECTED;
1123 return PLUGIN_OK;
1127 * Main entry point
1129 enum plugin_status plugin_start(const void* parameter)
1131 (void)parameter;
1133 #if LCD_DEPTH > 1
1134 rb->lcd_set_backdrop(NULL);
1135 rb->lcd_set_background( LCD_BLACK );
1136 rb->lcd_set_foreground( LCD_WHITE );
1137 #endif
1139 /* display choice menu */
1140 return star_menu();
1143 #endif