Correct beast manual install instructions in Windows.
[kugel-rb.git] / apps / plugins / star.c
blob6079ba488eb0ae7960ac7cdad1900dd48f073862
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 == COWOND2_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 == ONDAVX747_PAD)
332 #define STAR_QUIT BUTTON_POWER
333 #define STAR_QUIT_NAME "POWER"
335 #elif (CONFIG_KEYPAD == ONDAVX777_PAD)
336 #define STAR_QUIT BUTTON_POWER
337 #define STAR_QUIT_NAME "POWER"
339 #elif CONFIG_KEYPAD == MROBE500_PAD
340 #define STAR_QUIT BUTTON_POWER
341 #define STAR_QUIT_NAME "POWER"
343 #elif (CONFIG_KEYPAD == SAMSUNG_YH_PAD)
345 #define STAR_QUIT BUTTON_REC
346 #define STAR_LEFT BUTTON_LEFT
347 #define STAR_RIGHT BUTTON_RIGHT
348 #define STAR_UP BUTTON_UP
349 #define STAR_DOWN BUTTON_DOWN
350 #define STAR_LEVEL_UP_PRE (BUTTON_FFWD|BUTTON_UP)
351 #define STAR_LEVEL_UP (BUTTON_REW|BUTTON_UP)
352 #define STAR_LEVEL_DOWN_PRE (BUTTON_FFWD|BUTTON_DOWN)
353 #define STAR_LEVEL_DOWN (BUTTON_REW|BUTTON_DOWN)
354 #define STAR_TOGGLE_CONTROL (BUTTON_PLAY|BUTTON_UP)
355 #define STAR_LEVEL_REPEAT (BUTTON_PLAY|BUTTON_DOWN)
356 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
357 #define STAR_QUIT_NAME "REC"
358 #define STAR_LEVEL_UP_NAME "UP"
359 #define STAR_LEVEL_DOWN_NAME "DOWN"
360 #define STAR_LEVEL_REPEAT_NAME "PLAY"
362 #else
363 #error No keymap defined!
364 #endif
366 #ifdef HAVE_TOUCHSCREEN
367 //#ifndef STAR_QUIT
368 //#define STAR_QUIT BUTTON_TOPLEFT
369 //#define STAR_QUIT_NAME "TOPLEFT"
370 //#endif
371 #ifndef STAR_LEFT
372 #define STAR_LEFT BUTTON_MIDLEFT
373 #endif
374 #ifndef STAR_RIGHT
375 #define STAR_RIGHT BUTTON_MIDRIGHT
376 #endif
377 #ifndef STAR_UP
378 #define STAR_UP BUTTON_TOPMIDDLE
379 #endif
380 #ifndef STAR_DOWN
381 #define STAR_DOWN BUTTON_BOTTOMMIDDLE
382 #endif
383 #ifndef STAR_TOGGLE_CONTROL
384 #define STAR_TOGGLE_CONTROL BUTTON_CENTER
385 #define STAR_TOGGLE_CONTROL_NAME "CENTER"
386 #endif
387 #ifndef STAR_LEVEL_UP
388 #define STAR_LEVEL_UP BUTTON_TOPLEFT
389 #define STAR_LEVEL_UP_NAME "TOPLEFT"
390 #endif
391 #ifndef STAR_LEVEL_DOWN
392 #define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT
393 #define STAR_LEVEL_DOWN_NAME "BOTTOMLEFT"
394 #endif
395 #ifndef STAR_LEVEL_REPEAT
396 #define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT
397 #define STAR_LEVEL_REPEAT_NAME "BOTTOMRIGHT"
398 #endif
399 #endif
401 /* function returns because of USB? */
402 static bool usb_detected = false;
404 /* position of the ball */
405 static int ball_x, ball_y;
407 /* position of the block */
408 static int block_x, block_y;
410 /* number of stars to get to finish the level */
411 static int star_count;
413 /* the object we control : ball or block */
414 static int control;
416 /* the current board */
417 static char board[STAR_HEIGHT][STAR_WIDTH];
419 #include "pluginbitmaps/star_tiles.h"
421 #define TILE_WIDTH BMPWIDTH_star_tiles
422 #define TILE_HEIGHT (BMPHEIGHT_star_tiles/5)
423 #define STAR_OFFSET_X ((LCD_WIDTH - STAR_WIDTH * TILE_WIDTH) / 2)
424 #define STAR_OFFSET_Y ((LCD_HEIGHT - STAR_HEIGHT * TILE_HEIGHT - MAX(TILE_HEIGHT, 8)) / 2)
426 #define WALL 0
427 #define SPACE 1
428 #define BLOCK 2
429 #define STAR 3
430 #define BALL 4
432 /* char font size */
433 static int char_width = -1;
434 static int char_height = -1;
436 /* this arrays contains a group of levels loaded into memory */
437 static unsigned char* levels =
438 "****************\n"
439 "*X**........o*x*\n"
440 "*..........o.***\n"
441 "*.......**o....*\n"
442 "*...**.o......**\n"
443 "**.o..o.....o..*\n"
444 "*.o......o**.o.*\n"
445 "*.....**o.....o*\n"
446 "****************\n"
447 "\n"
448 ".*..*.*.*...*.**\n"
449 "*...o.........X*\n"
450 "...*o..*o...o...\n"
451 "*.*.o.....o..*.*\n"
452 "......*...o...*.\n"
453 "*....*x*..o....*\n"
454 "...*..*.*...*oo*\n"
455 "*.............*.\n"
456 ".*..*........*..\n"
457 "\n"
458 "****************\n"
459 "*...........o*x*\n"
460 "*...**......**X*\n"
461 "*...*o.........*\n"
462 "*.o.....o**...o*\n"
463 "*.*o..o..o*..o**\n"
464 "*.**o.*o..o.o***\n"
465 "*o....**o......*\n"
466 "****************\n"
467 "\n"
468 "****************\n"
469 "*............*x*\n"
470 "*.....*........*\n"
471 "**o*o.o*o*o*o*o*\n"
472 "*.*.*o.o*.*.*.**\n"
473 "**o*o*o.o*o*o*o*\n"
474 "*.....*........*\n"
475 "*...*.......*X.*\n"
476 "****************\n"
477 "\n"
478 ".**************.\n"
479 "*X..*...*..*...*\n"
480 "*..*o.*.o..o.*.*\n"
481 "**......*..*...*\n"
482 "*o.*o*........**\n"
483 "**.....*.o.*...*\n"
484 "*o*..*.*.*...*x*\n"
485 "*...*....o*..*o*\n"
486 ".**************.\n"
487 "\n"
488 "....************\n"
489 "...*...o...*o.o*\n"
490 "..*....o....*.**\n"
491 ".*.....o.......*\n"
492 "*X.....o.......*\n"
493 "**.....o..*...**\n"
494 "*......o....*..*\n"
495 "*x.*...o..**o..*\n"
496 "****************\n"
497 "\n"
498 "****************\n"
499 "*..............*\n"
500 ".**.***..*o.**o*\n"
501 ".*o..*o.*.*.*.*.\n"
502 "..*..*..***.**..\n"
503 ".**..*..*o*.*o**\n"
504 "*..............*\n"
505 "*..X*o....x..*o*\n"
506 "****************\n"
507 "\n"
508 "***************.\n"
509 "*..o**.........*\n"
510 "*..*o..**.o....*\n"
511 "*..o**.*.*o....*\n"
512 "**.....**..*o*.*\n"
513 "**.*.......o*o.*\n"
514 "*oxo*...o..*X*.*\n"
515 "**.............*\n"
516 ".***************\n"
517 "\n"
518 "..*.***********.\n"
519 ".*o*o......*..X*\n"
520 "*o.o*....o....*.\n"
521 ".*.*..o**..o*..*\n"
522 "*..*o.*oxo....o*\n"
523 "*.....o**.....*.\n"
524 "*o*o.........*..\n"
525 "*...........*...\n"
526 ".***********....\n"
527 "\n"
528 "....***********.\n"
529 "*****.o........*\n"
530 "*...x.***o.o*.o*\n"
531 "*.o...*o.*o...*.\n"
532 "*.....*..o..*.o*\n"
533 "*o*o..*.o*..*X*.\n"
534 ".*o...***..***..\n"
535 "*.........*.*.*.\n"
536 ".*********..*..*\n"
537 "\n"
538 "****************\n"
539 "*......*......X*\n"
540 "*..*oo.....oo.**\n"
541 "**...o...**...o*\n"
542 "*o....*o*oo..***\n"
543 "**.**....**....*\n"
544 "*o..o*.o....x.o*\n"
545 "**o***....*...**\n"
546 "***************.\n"
547 "\n"
548 "**.....**..****.\n"
549 "*X*****o.***.o**\n"
550 "*....oo.....o..*\n"
551 "*.**..**o..*o*.*\n"
552 "*.*.o.*.*o.**..*\n"
553 "*.**..**...*x*.*\n"
554 "*.....o........*\n"
555 "*........o.....*\n"
556 "****************\n"
557 "\n"
558 ".**************.\n"
559 "*.X*........o.**\n"
560 "*.*...*o...o**.*\n"
561 "*.......o....*.*\n"
562 "*.o..........*o*\n"
563 "*.*......o.....*\n"
564 "**......o.o..*o*\n"
565 "*x..*....o.*.*.*\n"
566 ".**************.\n"
567 "\n"
568 "****************\n"
569 "*o*o........o*o*\n"
570 "*.o*X......**..*\n"
571 "*.x........o...*\n"
572 "*........o*....*\n"
573 "*......o.......*\n"
574 "*.o*........*..*\n"
575 "*o*o........o*o*\n"
576 "****************\n"
577 "\n"
578 ".******.********\n"
579 "*.....o*.....o.*\n"
580 "*.*.o.*..*...o.*\n"
581 "*..X*...*oo.*o.*\n"
582 ".*.*...*.o..x*.*\n"
583 "*o.......*..*o.*\n"
584 ".*......o.....*.\n"
585 "*o............o*\n"
586 "****************\n"
587 "\n"
588 "****************\n"
589 "**.x*o.o......o*\n"
590 "*o.Xo*o.......**\n"
591 "**.***........**\n"
592 "**.....o*o*....*\n"
593 "*oo.......o*o..*\n"
594 "**.o....****o..*\n"
595 "**o*..*........*\n"
596 "****************\n"
597 "\n"
598 "****************\n"
599 "*.o*........*X.*\n"
600 "*.*..o*oo*o..*.*\n"
601 "*....*o**o*.o..*\n"
602 "*.o*.......o*..*\n"
603 "*..o*o....o*...*\n"
604 "*.*..*.**o*..*.*\n"
605 "*....o.*o...x..*\n"
606 "****************\n"
607 "\n"
608 "****************\n"
609 "*.o....o..x*...*\n"
610 "*..*o*o...*o...*\n"
611 "*...*o*....*o..*\n"
612 "*...o..*...o*o.*\n"
613 "*.*o*...*.o*...*\n"
614 "*.o*o.*.o.*....*\n"
615 "*o*X..*.....*..*\n"
616 "****************\n"
617 "\n"
618 "****************\n"
619 "*o...**.....**o*\n"
620 "*.*..*......*o.*\n"
621 "*.o*...o**..o..*\n"
622 "*.*....*o......*\n"
623 "*....*...o*....*\n"
624 "*.**.o*.**o..*x*\n"
625 "*.o*.*o.....**X*\n"
626 "****************\n"
627 "\n"
628 "****************\n"
629 "*...o*o........*\n"
630 "**o..o*.**o...**\n"
631 "*.*.*.o...*..*.*\n"
632 "*.x.*..**..*.Xo*\n"
633 "*.*..*...o.*.*.*\n"
634 "**...o**.*o..o**\n"
635 "*........o*o...*\n"
636 "****************";
639 * Do a pretty transition from one level to another.
641 static void star_transition_update(void)
643 const int center_x = LCD_WIDTH / 2;
644 const int center_y = LCD_HEIGHT / 2;
645 int x = 0;
646 int y = 0;
647 #if LCD_WIDTH >= LCD_HEIGHT
648 #if defined(IPOD_VIDEO)
649 const int step = 4;
650 #else
651 const int step = 1;
652 #endif
653 const int lcd_demi_width = LCD_WIDTH / 2;
654 int var_y = 0;
656 for (; x < lcd_demi_width ; x+=step)
658 var_y += LCD_HEIGHT;
659 if (var_y > LCD_WIDTH)
661 var_y -= LCD_WIDTH;
662 y+=step;
664 if( x )
666 rb->lcd_update_rect(center_x - x, center_y - y, x*2, step);
667 rb->lcd_update_rect(center_x - x, center_y + y - step, x*2, step);
669 if( y )
671 rb->lcd_update_rect(center_x - x, center_y - y, step, y*2);
672 rb->lcd_update_rect(center_x + x - step, center_y - y, step, y*2);
674 STAR_SLEEP
676 #else
677 int lcd_demi_height = LCD_HEIGHT / 2;
678 int var_x = 0;
680 for (; y < lcd_demi_height ; y++)
682 var_x += LCD_WIDTH;
683 if (var_x > LCD_HEIGHT)
685 var_x -= LCD_HEIGHT;
686 x++;
688 if( x )
690 rb->lcd_update_rect(center_x - x, center_y - y, x * 2, 1);
691 rb->lcd_update_rect(center_x - x, center_y + y - 1, x * 2, 1);
693 if( y )
695 rb->lcd_update_rect(center_x - x, center_y - y, 1, y * 2);
696 rb->lcd_update_rect(center_x + x - 1, center_y - y, 1, y * 2);
698 STAR_SLEEP
700 #endif
701 rb->lcd_update();
705 * Display information board of the current level.
707 static void star_display_board_info(int current_level)
709 int label_pos_y, tile_pos_y;
710 char str_info[32];
712 if (TILE_HEIGHT > char_height)
714 tile_pos_y = LCD_HEIGHT - TILE_HEIGHT;
715 label_pos_y = tile_pos_y + (TILE_HEIGHT - char_height) / 2;
717 else
719 label_pos_y = LCD_HEIGHT - char_height;
720 tile_pos_y = label_pos_y + (char_height - TILE_HEIGHT) / 2;
723 rb->snprintf(str_info, sizeof(str_info), "L:%02d", current_level + 1);
724 rb->lcd_putsxy(STAR_OFFSET_X, label_pos_y, str_info);
725 rb->snprintf(str_info, sizeof(str_info), "S:%02d", star_count);
726 rb->lcd_putsxy(LCD_WIDTH/2 - 2 * char_width, label_pos_y, str_info);
727 rb->lcd_putsxy(STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH - 2 * char_width,
728 label_pos_y, "C:");
730 rb->lcd_bitmap_part(star_tiles, 0, control == STAR_CONTROL_BALL ?
731 BALL*TILE_HEIGHT : BLOCK*TILE_HEIGHT,
732 STRIDE( SCREEN_MAIN,
733 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
734 STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH,
735 tile_pos_y, TILE_WIDTH, TILE_HEIGHT);
737 rb->lcd_update_rect(0, MIN(label_pos_y, tile_pos_y), LCD_WIDTH,
738 MAX(TILE_HEIGHT, char_height));
743 * Load a level into board array.
745 static int star_load_level(int current_level)
747 int x, y;
748 char *ptr_tab;
750 if (current_level < 0)
751 current_level = 0;
752 else if (current_level > STAR_LEVEL_COUNT-1)
753 current_level = STAR_LEVEL_COUNT-1;
756 ptr_tab = levels + current_level * STAR_LEVEL_SIZE;
757 control = STAR_CONTROL_BALL;
758 star_count = 0;
760 rb->lcd_clear_display();
762 for (y = 0 ; y < STAR_HEIGHT ; y++)
764 for (x = 0 ; x < STAR_WIDTH ; x++)
766 board[y][x] = *ptr_tab;
767 switch (*ptr_tab)
769 # define DRAW_TILE( a ) \
770 rb->lcd_bitmap_part( star_tiles, 0, \
771 a*TILE_HEIGHT, \
772 STRIDE( SCREEN_MAIN, \
773 BMPWIDTH_star_tiles, \
774 BMPHEIGHT_star_tiles), \
775 STAR_OFFSET_X + x * TILE_WIDTH, \
776 STAR_OFFSET_Y + y * TILE_HEIGHT, \
777 TILE_WIDTH, TILE_HEIGHT);
779 case STAR_VOID:
780 DRAW_TILE( SPACE );
781 break;
783 case STAR_WALL:
784 DRAW_TILE( WALL );
785 break;
787 case STAR_STAR:
788 DRAW_TILE( STAR );
789 star_count++;
790 break;
792 case STAR_BALL:
793 ball_x = x;
794 ball_y = y;
795 DRAW_TILE( BALL );
796 break;
799 case STAR_BLOCK:
800 block_x = x;
801 block_y = y;
802 DRAW_TILE( BLOCK );
803 break;
805 ptr_tab++;
807 ptr_tab++;
809 star_display_board_info(current_level);
810 star_transition_update();
811 return 1;
814 static void star_animate_tile(int tile_no, int start_x, int start_y,
815 int delta_x, int delta_y)
817 int i;
819 if (delta_x != 0) /* horizontal */
821 for (i = 1 ; i <= TILE_WIDTH ; i++)
823 STAR_SLEEP
824 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT,
825 STRIDE( SCREEN_MAIN,
826 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
827 start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
828 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT,
829 STRIDE( SCREEN_MAIN,
830 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
831 start_x + delta_x * i, start_y, TILE_WIDTH, TILE_HEIGHT);
832 rb->lcd_update_rect(start_x + delta_x * i - (delta_x>0?1:0),
833 start_y, TILE_WIDTH + 1, TILE_HEIGHT);
836 else /* vertical */
838 for (i = 1 ; i <= TILE_HEIGHT ; 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, start_y + delta_y * i, TILE_WIDTH, TILE_HEIGHT);
849 rb->lcd_update_rect(start_x, start_y + delta_y * i - (delta_y>0?1:0),
850 TILE_WIDTH, TILE_HEIGHT + 1);
856 * Run the game.
858 static int star_run_game(int current_level)
860 int move_x = 0;
861 int move_y = 0;
862 int key;
863 int lastkey = BUTTON_NONE;
865 int label_offset_y;
867 label_offset_y = LCD_HEIGHT - char_height;
869 if (!star_load_level(current_level))
870 return 0;
872 while (true)
874 move_x = 0;
875 move_y = 0;
877 while ((move_x == 0) && (move_y == 0))
879 key = rb->button_get(true);
880 switch (key)
882 #ifdef STAR_RC_QUIT
883 case STAR_RC_QUIT:
884 #endif
885 case STAR_QUIT:
886 return -1;
888 case STAR_LEFT:
889 move_x = -1;
890 break;
892 case STAR_RIGHT:
893 move_x = 1;
894 break;
896 case STAR_UP:
897 move_y = -1;
898 break;
900 case STAR_DOWN:
901 move_y = 1;
902 break;
904 case STAR_LEVEL_DOWN:
905 #ifdef STAR_LEVEL_DOWN_PRE
906 if (lastkey != STAR_LEVEL_DOWN_PRE)
907 break;
908 #endif
909 if (current_level > 0)
911 current_level--;
912 star_load_level(current_level);
914 break;
916 case STAR_LEVEL_REPEAT:
917 star_load_level(current_level);
918 break;
920 case STAR_LEVEL_UP:
921 #ifdef STAR_LEVEL_UP_PRE
922 if (lastkey != STAR_LEVEL_UP_PRE)
923 break;
924 #endif
925 if (current_level < STAR_LEVEL_COUNT - 1)
927 current_level++;
928 star_load_level(current_level);
930 break;
932 case STAR_TOGGLE_CONTROL:
933 #ifdef STAR_TOGGLE_CONTROL_PRE
934 if (lastkey != STAR_TOGGLE_CONTROL_PRE)
935 break;
936 #endif
937 #ifdef STAR_TOGGLE_CONTROL2
938 case STAR_TOGGLE_CONTROL2:
939 #endif
940 if (control == STAR_CONTROL_BALL)
941 control = STAR_CONTROL_BLOCK;
942 else
943 control = STAR_CONTROL_BALL;
944 star_display_board_info(current_level);
945 break;
947 default:
948 if (rb->default_event_handler(key) == SYS_USB_CONNECTED)
950 usb_detected = true;
951 return 0;
953 break;
955 if (key != BUTTON_NONE)
956 lastkey = key;
959 if (control == STAR_CONTROL_BALL)
961 board[ball_y][ball_x] = STAR_VOID;
962 while ((board[ball_y + move_y][ball_x + move_x] == STAR_VOID
963 || board[ball_y + move_y][ball_x + move_x] == STAR_STAR))
966 star_animate_tile(BALL, STAR_OFFSET_X + ball_x * TILE_WIDTH,
967 STAR_OFFSET_Y + ball_y * TILE_HEIGHT,
968 move_x, move_y);
969 ball_x += move_x;
970 ball_y += move_y;
972 if (board[ball_y][ball_x] == STAR_STAR)
974 board[ball_y][ball_x] = STAR_VOID;
975 star_count--;
977 star_display_board_info(current_level);
980 board[ball_y][ball_x] = STAR_BALL;
982 else
984 board[block_y][block_x] = STAR_VOID;
985 while (board[block_y + move_y][block_x + move_x] == STAR_VOID)
987 star_animate_tile(BLOCK, STAR_OFFSET_X + block_x * TILE_WIDTH,
988 STAR_OFFSET_Y + block_y * TILE_HEIGHT,
989 move_x, move_y);
990 block_x += move_x;
991 block_y += move_y;
993 board[block_y][block_x] = STAR_BLOCK;
996 if (star_count == 0)
998 current_level++;
999 if (current_level == STAR_LEVEL_COUNT)
1001 rb->lcd_clear_display();
1002 rb->splash(HZ*2, "Congratulations!");
1003 rb->lcd_update();
1005 /* There is no such level as STAR_LEVEL_COUNT so it can't be the
1006 * current_level */
1007 current_level--;
1008 return 1;
1010 star_load_level(current_level);
1016 * Display help text.
1018 static bool star_help(void)
1020 int button;
1021 #define WORDS (sizeof help_text / sizeof (char*))
1022 static char* help_text[] = {
1023 "Star", "", "Aim", "",
1024 "Take", "all", "the", "stars", "to", "go", "to", "the", "next", "level.",
1025 "You", "can", "toggle", "control", "with", "the", "block", "to", "use",
1026 "it", "as", "a", "mobile", "wall.", "The", "block", "cannot", "take",
1027 "stars.", "", "",
1028 "Controls", "",
1029 STAR_TOGGLE_CONTROL_NAME":", "Toggle", "control", "",
1030 STAR_QUIT_NAME":", "Exit", "",
1031 STAR_LEVEL_DOWN_NAME":", "Prev.", "level", "",
1032 STAR_LEVEL_REPEAT_NAME":", "Reset", "level", "",
1033 STAR_LEVEL_UP_NAME":", "Next", "level"
1035 static struct style_text formation[]={
1036 { 0, TEXT_CENTER|TEXT_UNDERLINE },
1037 { 2, C_RED },
1038 { 35, C_RED },
1039 { -1, 0 }
1041 #if LCD_DEPTH > 1
1042 #ifndef HAVE_LCD_COLOR
1043 rb->lcd_set_background(LCD_WHITE );
1044 rb->lcd_set_foreground(LCD_BLACK );
1045 #endif
1046 #endif
1047 if (display_text(WORDS, help_text, formation, NULL))
1048 return true;
1049 do {
1050 button = rb->button_get(true);
1051 if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
1052 return true;
1053 } while( ( button == BUTTON_NONE )
1054 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
1055 #if LCD_DEPTH > 1
1056 #ifndef HAVE_LCD_COLOR
1057 rb->lcd_set_background(LCD_BLACK );
1058 rb->lcd_set_foreground(LCD_WHITE );
1059 #endif
1060 #endif
1061 return false;
1065 * Display the choice menu.
1067 static int star_menu(void)
1069 int selection, level=1;
1070 bool menu_quit = false;
1072 MENUITEM_STRINGLIST(menu, "Star Menu", NULL,
1073 "Start Game","Choose Level",
1074 "Help", "Playback Control", "Quit");
1076 while(!menu_quit)
1078 switch(rb->do_menu(&menu, &selection, NULL, false))
1080 case 0:
1081 /* use system font and get the size of char */
1082 rb->lcd_setfont(FONT_SYSFIXED);
1083 rb->lcd_getstringsize("a", &char_width, &char_height);
1084 star_run_game(level-1);
1085 rb->lcd_setfont(FONT_UI);
1086 break;
1087 case 1:
1088 rb->set_int("Level", "", UNIT_INT, &level,
1089 NULL, 1, 1, STAR_LEVEL_COUNT, NULL );
1090 break;
1091 case 2:
1092 if(star_help())
1093 usb_detected = true;
1094 break;
1095 case 3:
1096 playback_control(NULL);
1097 break;
1098 case 4:
1099 menu_quit = true;
1100 break;
1102 if(usb_detected)
1103 return PLUGIN_USB_CONNECTED;
1106 return PLUGIN_OK;
1110 * Main entry point
1112 enum plugin_status plugin_start(const void* parameter)
1114 (void)parameter;
1116 #if LCD_DEPTH > 1
1117 rb->lcd_set_backdrop(NULL);
1118 rb->lcd_set_background( LCD_BLACK );
1119 rb->lcd_set_foreground( LCD_WHITE );
1120 #endif
1122 /* display choice menu */
1123 return star_menu();
1126 #endif