use lib display text to display help messages (FS#10099).
[kugel-rb.git] / apps / plugins / star.c
blob0ab6dce17bc3a0cab026652ac9bba07b919149b1
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"
25 PLUGIN_HEADER
27 /* size of a level in file */
28 #define STAR_LEVEL_SIZE ((STAR_WIDTH + 1) * STAR_HEIGHT + 1)
30 /* size of the game board */
31 #define STAR_WIDTH 16
32 #define STAR_HEIGHT 9
34 /* number of level */
35 #define STAR_LEVEL_COUNT 20
37 /* values of object in the board */
38 #define STAR_VOID '.'
39 #define STAR_WALL '*'
40 #define STAR_STAR 'o'
41 #define STAR_BALL 'X'
42 #define STAR_BLOCK 'x'
44 /* sleep time between two frames */
45 #if (LCD_HEIGHT * LCD_WIDTH >= 70000) && defined(IPOD_ARCH)
46 /* iPod 5G LCD is *slow* */
47 #define STAR_SLEEP rb->yield();
48 #elif (LCD_HEIGHT * LCD_WIDTH >= 30000)
49 #define STAR_SLEEP rb->sleep(0);
50 #else
51 #define STAR_SLEEP rb->sleep(1);
52 #endif
54 /* value of ball and block control */
55 #define STAR_CONTROL_BALL 0
56 #define STAR_CONTROL_BLOCK 1
58 /* variable button definitions */
59 #if CONFIG_KEYPAD == RECORDER_PAD
60 #define STAR_QUIT BUTTON_OFF
61 #define STAR_LEFT BUTTON_LEFT
62 #define STAR_RIGHT BUTTON_RIGHT
63 #define STAR_UP BUTTON_UP
64 #define STAR_DOWN BUTTON_DOWN
65 #define STAR_TOGGLE_CONTROL BUTTON_ON
66 #define STAR_TOGGLE_CONTROL2 BUTTON_PLAY
67 #define STAR_LEVEL_UP BUTTON_F3
68 #define STAR_LEVEL_DOWN BUTTON_F1
69 #define STAR_LEVEL_REPEAT BUTTON_F2
70 #define STAR_TOGGLE_CONTROL_NAME "ON"
71 #define STAR_QUIT_NAME "OFF"
72 #define STAR_LEVEL_UP_NAME "F3"
73 #define STAR_LEVEL_DOWN_NAME "F1"
74 #define STAR_LEVEL_REPEAT_NAME "F2"
76 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
77 #define STAR_QUIT BUTTON_OFF
78 #define STAR_LEFT BUTTON_LEFT
79 #define STAR_RIGHT BUTTON_RIGHT
80 #define STAR_UP BUTTON_UP
81 #define STAR_DOWN BUTTON_DOWN
82 #define STAR_TOGGLE_CONTROL BUTTON_ON
83 #define STAR_TOGGLE_CONTROL2 BUTTON_SELECT
84 #define STAR_LEVEL_UP BUTTON_F3
85 #define STAR_LEVEL_DOWN BUTTON_F1
86 #define STAR_LEVEL_REPEAT BUTTON_F2
87 #define STAR_TOGGLE_CONTROL_NAME "ON/SELECT"
88 #define STAR_QUIT_NAME "OFF"
89 #define STAR_LEVEL_UP_NAME "F3"
90 #define STAR_LEVEL_DOWN_NAME "F1"
91 #define STAR_LEVEL_REPEAT_NAME "F2"
93 #elif CONFIG_KEYPAD == ONDIO_PAD
94 #define STAR_QUIT BUTTON_OFF
95 #define STAR_LEFT BUTTON_LEFT
96 #define STAR_RIGHT BUTTON_RIGHT
97 #define STAR_UP BUTTON_UP
98 #define STAR_DOWN BUTTON_DOWN
99 #define STAR_TOGGLE_CONTROL_PRE BUTTON_MENU
100 #define STAR_TOGGLE_CONTROL (BUTTON_MENU | BUTTON_REL)
101 #define STAR_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT)
102 #define STAR_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT)
103 #define STAR_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP)
104 #define STAR_TOGGLE_CONTROL_NAME "MODE"
105 #define STAR_QUIT_NAME "OFF"
106 #define STAR_LEVEL_UP_NAME "M >"
107 #define STAR_LEVEL_DOWN_NAME "M <"
108 #define STAR_LEVEL_REPEAT_NAME "M ^"
110 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
111 (CONFIG_KEYPAD == IRIVER_H300_PAD)
112 #define STAR_QUIT BUTTON_OFF
113 #define STAR_LEFT BUTTON_LEFT
114 #define STAR_RIGHT BUTTON_RIGHT
115 #define STAR_UP BUTTON_UP
116 #define STAR_DOWN BUTTON_DOWN
117 #define STAR_TOGGLE_CONTROL BUTTON_MODE
118 #define STAR_TOGGLE_CONTROL2 BUTTON_SELECT
119 #define STAR_LEVEL_UP (BUTTON_ON | BUTTON_RIGHT)
120 #define STAR_LEVEL_DOWN (BUTTON_ON | BUTTON_LEFT)
121 #define STAR_LEVEL_REPEAT (BUTTON_ON | BUTTON_SELECT)
122 #define STAR_TOGGLE_CONTROL_NAME "MODE/SELECT"
123 #define STAR_QUIT_NAME "OFF"
124 #define STAR_LEVEL_UP_NAME "ON + RIGHT"
125 #define STAR_LEVEL_DOWN_NAME "ON + LEFT"
126 #define STAR_LEVEL_REPEAT_NAME "ON + NAVI"
128 #define STAR_RC_QUIT BUTTON_RC_STOP
129 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
130 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
131 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
133 #define STAR_QUIT (BUTTON_SELECT | BUTTON_MENU)
134 #define STAR_LEFT BUTTON_LEFT
135 #define STAR_RIGHT BUTTON_RIGHT
136 #define STAR_UP BUTTON_MENU
137 #define STAR_DOWN BUTTON_PLAY
138 #define STAR_TOGGLE_CONTROL_PRE BUTTON_SELECT
139 #define STAR_TOGGLE_CONTROL (BUTTON_SELECT | BUTTON_REL)
140 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
141 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
142 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_PLAY)
143 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
144 #define STAR_QUIT_NAME "S + MENU"
145 #define STAR_LEVEL_UP_NAME "S >"
146 #define STAR_LEVEL_DOWN_NAME "S <"
147 #define STAR_LEVEL_REPEAT_NAME "S + PLAY"
149 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
151 #define STAR_QUIT BUTTON_POWER
152 #define STAR_LEFT BUTTON_LEFT
153 #define STAR_RIGHT BUTTON_RIGHT
154 #define STAR_UP BUTTON_UP
155 #define STAR_DOWN BUTTON_DOWN
156 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
157 #define STAR_LEVEL_UP_PRE BUTTON_REC
158 #define STAR_LEVEL_UP (BUTTON_REC|BUTTON_REL)
159 #define STAR_LEVEL_DOWN_PRE BUTTON_REC
160 #define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_REPEAT)
161 #define STAR_LEVEL_REPEAT BUTTON_PLAY
162 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
163 #define STAR_QUIT_NAME "POWER"
164 #define STAR_LEVEL_UP_NAME "REC"
165 #define STAR_LEVEL_DOWN_NAME "REC.."
166 #define STAR_LEVEL_REPEAT_NAME "PLAY"
168 #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
170 #define STAR_QUIT BUTTON_POWER
171 #define STAR_LEFT BUTTON_LEFT
172 #define STAR_RIGHT BUTTON_RIGHT
173 #define STAR_UP BUTTON_UP
174 #define STAR_DOWN BUTTON_DOWN
175 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
176 #define STAR_LEVEL_UP BUTTON_VOL_UP
177 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
178 #define STAR_LEVEL_REPEAT BUTTON_A
179 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
180 #define STAR_QUIT_NAME "POWER"
181 #define STAR_LEVEL_UP_NAME "VOL UP"
182 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
183 #define STAR_LEVEL_REPEAT_NAME "A"
185 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
186 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
187 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
188 (CONFIG_KEYPAD == SANSA_M200_PAD)
190 #define STAR_QUIT BUTTON_POWER
191 #define STAR_LEFT BUTTON_LEFT
192 #define STAR_RIGHT BUTTON_RIGHT
193 #define STAR_UP BUTTON_UP
194 #define STAR_DOWN BUTTON_DOWN
195 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
196 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
197 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
198 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
199 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
200 #define STAR_QUIT_NAME "POWER"
201 #define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
202 #define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
203 #define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
205 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
207 #define STAR_QUIT (BUTTON_HOME|BUTTON_REPEAT)
208 #define STAR_LEFT BUTTON_LEFT
209 #define STAR_RIGHT BUTTON_RIGHT
210 #define STAR_UP BUTTON_UP
211 #define STAR_DOWN BUTTON_DOWN
212 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
213 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
214 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
215 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
216 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
217 #define STAR_QUIT_NAME "HOME"
218 #define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
219 #define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
220 #define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
222 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
224 #define STAR_QUIT BUTTON_POWER
225 #define STAR_LEFT BUTTON_LEFT
226 #define STAR_RIGHT BUTTON_RIGHT
227 #define STAR_UP BUTTON_SCROLL_UP
228 #define STAR_DOWN BUTTON_SCROLL_DOWN
229 #define STAR_TOGGLE_CONTROL BUTTON_REW
230 #define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP)
231 #define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN)
232 #define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT)
233 #define STAR_TOGGLE_CONTROL_NAME "REW"
234 #define STAR_QUIT_NAME "POWER"
235 #define STAR_LEVEL_UP_NAME "PLAY+UP"
236 #define STAR_LEVEL_DOWN_NAME "PLAY+DOWN"
237 #define STAR_LEVEL_REPEAT_NAME "PLAY+RIGHT"
239 #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
241 #define STAR_QUIT BUTTON_BACK
242 #define STAR_LEFT BUTTON_LEFT
243 #define STAR_RIGHT BUTTON_RIGHT
244 #define STAR_UP BUTTON_UP
245 #define STAR_DOWN BUTTON_DOWN
246 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
247 #define STAR_LEVEL_UP BUTTON_VOL_UP
248 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
249 #define STAR_LEVEL_REPEAT BUTTON_MENU
250 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
251 #define STAR_QUIT_NAME "BACK"
252 #define STAR_LEVEL_UP_NAME "VOL UP"
253 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
254 #define STAR_LEVEL_REPEAT_NAME "MENU"
256 #elif (CONFIG_KEYPAD == MROBE100_PAD)
258 #define STAR_QUIT BUTTON_POWER
259 #define STAR_LEFT BUTTON_LEFT
260 #define STAR_RIGHT BUTTON_RIGHT
261 #define STAR_UP BUTTON_UP
262 #define STAR_DOWN BUTTON_DOWN
263 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
264 #define STAR_LEVEL_UP BUTTON_PLAY
265 #define STAR_LEVEL_DOWN BUTTON_MENU
266 #define STAR_LEVEL_REPEAT BUTTON_DISPLAY
267 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
268 #define STAR_QUIT_NAME "POWER"
269 #define STAR_LEVEL_UP_NAME "PLAY"
270 #define STAR_LEVEL_DOWN_NAME "MENU"
271 #define STAR_LEVEL_REPEAT_NAME "DISPLAY"
273 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
275 #define STAR_QUIT BUTTON_RC_REC
276 #define STAR_LEFT BUTTON_RC_REW
277 #define STAR_RIGHT BUTTON_RC_FF
278 #define STAR_UP BUTTON_RC_VOL_UP
279 #define STAR_DOWN BUTTON_RC_VOL_DOWN
280 #define STAR_TOGGLE_CONTROL BUTTON_RC_MODE
281 #define STAR_LEVEL_UP (BUTTON_RC_PLAY|BUTTON_RC_VOL_UP)
282 #define STAR_LEVEL_DOWN (BUTTON_RC_PLAY|BUTTON_RC_VOL_DOWN)
283 #define STAR_LEVEL_REPEAT (BUTTON_RC_PLAY|BUTTON_RC_MENU)
284 #define STAR_TOGGLE_CONTROL_NAME "MODE"
285 #define STAR_QUIT_NAME "REC"
286 #define STAR_LEVEL_UP_NAME "PLAY+VOL+"
287 #define STAR_LEVEL_DOWN_NAME "PLAY+VOL-"
288 #define STAR_LEVEL_REPEAT_NAME "PLAY+MENU"
290 #elif (CONFIG_KEYPAD == COWOND2_PAD)
292 #define STAR_QUIT BUTTON_POWER
293 #define STAR_QUIT_NAME "POWER"
295 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
297 #define STAR_QUIT BUTTON_BACK
298 #define STAR_LEFT BUTTON_LEFT
299 #define STAR_RIGHT BUTTON_RIGHT
300 #define STAR_UP BUTTON_UP
301 #define STAR_DOWN BUTTON_DOWN
302 #define STAR_TOGGLE_CONTROL BUTTON_PLAY
303 #define STAR_LEVEL_UP (BUTTON_CUSTOM | BUTTON_UP)
304 #define STAR_LEVEL_DOWN (BUTTON_CUSTOM | BUTTON_DOWN)
305 #define STAR_LEVEL_REPEAT (BUTTON_CUSTOM | BUTTON_RIGHT)
306 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
307 #define STAR_QUIT_NAME "BACK"
308 #define STAR_LEVEL_UP_NAME "CUSTOM+UP"
309 #define STAR_LEVEL_DOWN_NAME "CUSTOM+DOWN"
310 #define STAR_LEVEL_REPEAT_NAME "CUSTOM+RIGHT"
312 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
314 #define STAR_QUIT BUTTON_POWER
315 #define STAR_LEFT BUTTON_LEFT
316 #define STAR_RIGHT BUTTON_RIGHT
317 #define STAR_UP BUTTON_UP
318 #define STAR_DOWN BUTTON_DOWN
319 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
320 #define STAR_LEVEL_UP BUTTON_VOL_UP
321 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
322 #define STAR_LEVEL_REPEAT BUTTON_VIEW
323 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
324 #define STAR_QUIT_NAME "POWER"
325 #define STAR_LEVEL_UP_NAME "VOL UP"
326 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
327 #define STAR_LEVEL_REPEAT_NAME "VIEW"
329 #elif (CONFIG_KEYPAD == ONDAVX747_PAD)
331 #define STAR_QUIT BUTTON_POWER
332 #define STAR_QUIT_NAME "POWER"
334 #elif CONFIG_KEYPAD == MROBE500_PAD
335 #define STAR_QUIT BUTTON_POWER
336 #define STAR_QUIT_NAME "POWER"
338 #else
339 #error No keymap defined!
340 #endif
342 #ifdef HAVE_TOUCHSCREEN
343 //#ifndef STAR_QUIT
344 //#define STAR_QUIT BUTTON_TOPLEFT
345 //#define STAR_QUIT_NAME "TOPLEFT"
346 //#endif
347 #ifndef STAR_LEFT
348 #define STAR_LEFT BUTTON_MIDLEFT
349 #endif
350 #ifndef STAR_RIGHT
351 #define STAR_RIGHT BUTTON_MIDRIGHT
352 #endif
353 #ifndef STAR_UP
354 #define STAR_UP BUTTON_TOPMIDDLE
355 #endif
356 #ifndef STAR_DOWN
357 #define STAR_DOWN BUTTON_BOTTOMMIDDLE
358 #endif
359 #ifndef STAR_TOGGLE_CONTROL
360 #define STAR_TOGGLE_CONTROL BUTTON_CENTER
361 #define STAR_TOGGLE_CONTROL_NAME "CENTER"
362 #endif
363 #ifndef STAR_LEVEL_UP
364 #define STAR_LEVEL_UP BUTTON_TOPLEFT
365 #define STAR_LEVEL_UP_NAME "TOPLEFT"
366 #endif
367 #ifndef STAR_LEVEL_DOWN
368 #define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT
369 #define STAR_LEVEL_DOWN_NAME "BOTTOMLEFT"
370 #endif
371 #ifndef STAR_LEVEL_REPEAT
372 #define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT
373 #define STAR_LEVEL_REPEAT_NAME "BOTTOMRIGHT"
374 #endif
375 #endif
377 /* function returns because of USB? */
378 static bool usb_detected = false;
380 /* position of the ball */
381 static int ball_x, ball_y;
383 /* position of the block */
384 static int block_x, block_y;
386 /* number of stars to get to finish the level */
387 static int star_count;
389 /* the object we control : ball or block */
390 static int control;
392 /* the current board */
393 static char board[STAR_HEIGHT][STAR_WIDTH];
395 #include "pluginbitmaps/star_tiles.h"
397 #define TILE_WIDTH BMPWIDTH_star_tiles
398 #define TILE_HEIGHT (BMPHEIGHT_star_tiles/5)
399 #define STAR_OFFSET_X ((LCD_WIDTH - STAR_WIDTH * TILE_WIDTH) / 2)
400 #define STAR_OFFSET_Y ((LCD_HEIGHT - STAR_HEIGHT * TILE_HEIGHT - MAX(TILE_HEIGHT, 8)) / 2)
402 #define WALL 0
403 #define SPACE 1
404 #define BLOCK 2
405 #define STAR 3
406 #define BALL 4
408 #define MENU_START 0
410 /* char font size */
411 static int char_width = -1;
412 static int char_height = -1;
414 /* this arrays contains a group of levels loaded into memory */
415 static unsigned char* levels =
416 "****************\n"
417 "*X**........o*x*\n"
418 "*..........o.***\n"
419 "*.......**o....*\n"
420 "*...**.o......**\n"
421 "**.o..o.....o..*\n"
422 "*.o......o**.o.*\n"
423 "*.....**o.....o*\n"
424 "****************\n"
425 "\n"
426 ".*..*.*.*...*.**\n"
427 "*...o.........X*\n"
428 "...*o..*o...o...\n"
429 "*.*.o.....o..*.*\n"
430 "......*...o...*.\n"
431 "*....*x*..o....*\n"
432 "...*..*.*...*oo*\n"
433 "*.............*.\n"
434 ".*..*........*..\n"
435 "\n"
436 "****************\n"
437 "*...........o*x*\n"
438 "*...**......**X*\n"
439 "*...*o.........*\n"
440 "*.o.....o**...o*\n"
441 "*.*o..o..o*..o**\n"
442 "*.**o.*o..o.o***\n"
443 "*o....**o......*\n"
444 "****************\n"
445 "\n"
446 "****************\n"
447 "*............*x*\n"
448 "*.....*........*\n"
449 "**o*o.o*o*o*o*o*\n"
450 "*.*.*o.o*.*.*.**\n"
451 "**o*o*o.o*o*o*o*\n"
452 "*.....*........*\n"
453 "*...*.......*X.*\n"
454 "****************\n"
455 "\n"
456 ".**************.\n"
457 "*X..*...*..*...*\n"
458 "*..*o.*.o..o.*.*\n"
459 "**......*..*...*\n"
460 "*o.*o*........**\n"
461 "**.....*.o.*...*\n"
462 "*o*..*.*.*...*x*\n"
463 "*...*....o*..*o*\n"
464 ".**************.\n"
465 "\n"
466 "....************\n"
467 "...*...o...*o.o*\n"
468 "..*....o....*.**\n"
469 ".*.....o.......*\n"
470 "*X.....o.......*\n"
471 "**.....o..*...**\n"
472 "*......o....*..*\n"
473 "*x.*...o..**o..*\n"
474 "****************\n"
475 "\n"
476 "****************\n"
477 "*..............*\n"
478 ".**.***..*o.**o*\n"
479 ".*o..*o.*.*.*.*.\n"
480 "..*..*..***.**..\n"
481 ".**..*..*o*.*o**\n"
482 "*..............*\n"
483 "*..X*o....x..*o*\n"
484 "****************\n"
485 "\n"
486 "***************.\n"
487 "*..o**.........*\n"
488 "*..*o..**.o....*\n"
489 "*..o**.*.*o....*\n"
490 "**.....**..*o*.*\n"
491 "**.*.......o*o.*\n"
492 "*oxo*...o..*X*.*\n"
493 "**.............*\n"
494 ".***************\n"
495 "\n"
496 "..*.***********.\n"
497 ".*o*o......*..X*\n"
498 "*o.o*....o....*.\n"
499 ".*.*..o**..o*..*\n"
500 "*..*o.*oxo....o*\n"
501 "*.....o**.....*.\n"
502 "*o*o.........*..\n"
503 "*...........*...\n"
504 ".***********....\n"
505 "\n"
506 "....***********.\n"
507 "*****.o........*\n"
508 "*...x.***o.o*.o*\n"
509 "*.o...*o.*o...*.\n"
510 "*.....*..o..*.o*\n"
511 "*o*o..*.o*..*X*.\n"
512 ".*o...***..***..\n"
513 "*.........*.*.*.\n"
514 ".*********..*..*\n"
515 "\n"
516 "****************\n"
517 "*......*......X*\n"
518 "*..*oo.....oo.**\n"
519 "**...o...**...o*\n"
520 "*o....*o*oo..***\n"
521 "**.**....**....*\n"
522 "*o..o*.o....x.o*\n"
523 "**o***....*...**\n"
524 "***************.\n"
525 "\n"
526 "**.....**..****.\n"
527 "*X*****o.***.o**\n"
528 "*....oo.....o..*\n"
529 "*.**..**o..*o*.*\n"
530 "*.*.o.*.*o.**..*\n"
531 "*.**..**...*x*.*\n"
532 "*.....o........*\n"
533 "*........o.....*\n"
534 "****************\n"
535 "\n"
536 ".**************.\n"
537 "*.X*........o.**\n"
538 "*.*...*o...o**.*\n"
539 "*.......o....*.*\n"
540 "*.o..........*o*\n"
541 "*.*......o.....*\n"
542 "**......o.o..*o*\n"
543 "*x..*....o.*.*.*\n"
544 ".**************.\n"
545 "\n"
546 "****************\n"
547 "*o*o........o*o*\n"
548 "*.o*X......**..*\n"
549 "*.x........o...*\n"
550 "*........o*....*\n"
551 "*......o.......*\n"
552 "*.o*........*..*\n"
553 "*o*o........o*o*\n"
554 "****************\n"
555 "\n"
556 ".******.********\n"
557 "*.....o*.....o.*\n"
558 "*.*.o.*..*...o.*\n"
559 "*..X*...*oo.*o.*\n"
560 ".*.*...*.o..x*.*\n"
561 "*o.......*..*o.*\n"
562 ".*......o.....*.\n"
563 "*o............o*\n"
564 "****************\n"
565 "\n"
566 "****************\n"
567 "**.x*o.o......o*\n"
568 "*o.Xo*o.......**\n"
569 "**.***........**\n"
570 "**.....o*o*....*\n"
571 "*oo.......o*o..*\n"
572 "**.o....****o..*\n"
573 "**o*..*........*\n"
574 "****************\n"
575 "\n"
576 "****************\n"
577 "*.o*........*X.*\n"
578 "*.*..o*oo*o..*.*\n"
579 "*....*o**o*.o..*\n"
580 "*.o*.......o*..*\n"
581 "*..o*o....o*...*\n"
582 "*.*..*.**o*..*.*\n"
583 "*....o.*o...x..*\n"
584 "****************\n"
585 "\n"
586 "****************\n"
587 "*.o....o..x*...*\n"
588 "*..*o*o...*o...*\n"
589 "*...*o*....*o..*\n"
590 "*...o..*...o*o.*\n"
591 "*.*o*...*.o*...*\n"
592 "*.o*o.*.o.*....*\n"
593 "*o*X..*.....*..*\n"
594 "****************\n"
595 "\n"
596 "****************\n"
597 "*o...**.....**o*\n"
598 "*.*..*......*o.*\n"
599 "*.o*...o**..o..*\n"
600 "*.*....*o......*\n"
601 "*....*...o*....*\n"
602 "*.**.o*.**o..*x*\n"
603 "*.o*.*o.....**X*\n"
604 "****************\n"
605 "\n"
606 "****************\n"
607 "*...o*o........*\n"
608 "**o..o*.**o...**\n"
609 "*.*.*.o...*..*.*\n"
610 "*.x.*..**..*.Xo*\n"
611 "*.*..*...o.*.*.*\n"
612 "**...o**.*o..o**\n"
613 "*........o*o...*\n"
614 "****************";
617 * Do a pretty transition from one level to another.
619 static void star_transition_update(void)
621 const int center_x = LCD_WIDTH / 2;
622 const int center_y = LCD_HEIGHT / 2;
623 int x = 0;
624 int y = 0;
625 #if LCD_WIDTH >= LCD_HEIGHT
626 #if defined(IPOD_VIDEO)
627 const int step = 4;
628 #else
629 const int step = 1;
630 #endif
631 const int lcd_demi_width = LCD_WIDTH / 2;
632 int var_y = 0;
634 for (; x < lcd_demi_width ; x+=step)
636 var_y += LCD_HEIGHT;
637 if (var_y > LCD_WIDTH)
639 var_y -= LCD_WIDTH;
640 y+=step;
642 if( x )
644 rb->lcd_update_rect(center_x - x, center_y - y, x*2, step);
645 rb->lcd_update_rect(center_x - x, center_y + y - step, x*2, step);
647 if( y )
649 rb->lcd_update_rect(center_x - x, center_y - y, step, y*2);
650 rb->lcd_update_rect(center_x + x - step, center_y - y, step, y*2);
652 STAR_SLEEP
654 #else
655 int lcd_demi_height = LCD_HEIGHT / 2;
656 int var_x = 0;
658 for (; y < lcd_demi_height ; y++)
660 var_x += LCD_WIDTH;
661 if (var_x > LCD_HEIGHT)
663 var_x -= LCD_HEIGHT;
664 x++;
666 if( x )
668 rb->lcd_update_rect(center_x - x, center_y - y, x * 2, 1);
669 rb->lcd_update_rect(center_x - x, center_y + y - 1, x * 2, 1);
671 if( y )
673 rb->lcd_update_rect(center_x - x, center_y - y, 1, y * 2);
674 rb->lcd_update_rect(center_x + x - 1, center_y - y, 1, y * 2);
676 STAR_SLEEP
678 #endif
679 rb->lcd_update();
683 * Display information board of the current level.
685 static void star_display_board_info(int current_level)
687 int label_pos_y, tile_pos_y;
688 char str_info[32];
690 if (TILE_HEIGHT > char_height)
692 tile_pos_y = LCD_HEIGHT - TILE_HEIGHT;
693 label_pos_y = tile_pos_y + (TILE_HEIGHT - char_height) / 2;
695 else
697 label_pos_y = LCD_HEIGHT - char_height;
698 tile_pos_y = label_pos_y + (char_height - TILE_HEIGHT) / 2;
701 rb->snprintf(str_info, sizeof(str_info), "L:%02d", current_level + 1);
702 rb->lcd_putsxy(STAR_OFFSET_X, label_pos_y, str_info);
703 rb->snprintf(str_info, sizeof(str_info), "S:%02d", star_count);
704 rb->lcd_putsxy(LCD_WIDTH/2 - 2 * char_width, label_pos_y, str_info);
705 rb->lcd_putsxy(STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH - 2 * char_width,
706 label_pos_y, "C:");
708 rb->lcd_bitmap_part(star_tiles, 0, control == STAR_CONTROL_BALL ?
709 BALL*TILE_HEIGHT : BLOCK*TILE_HEIGHT, TILE_WIDTH,
710 STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH,
711 tile_pos_y, TILE_WIDTH, TILE_HEIGHT);
713 rb->lcd_update_rect(0, MIN(label_pos_y, tile_pos_y), LCD_WIDTH,
714 MAX(TILE_HEIGHT, char_height));
719 * Load a level into board array.
721 static int star_load_level(int current_level)
723 int x, y;
724 char *ptr_tab;
726 if (current_level < 0)
727 current_level = 0;
728 else if (current_level > STAR_LEVEL_COUNT-1)
729 current_level = STAR_LEVEL_COUNT-1;
732 ptr_tab = levels + current_level * STAR_LEVEL_SIZE;
733 control = STAR_CONTROL_BALL;
734 star_count = 0;
736 rb->lcd_clear_display();
738 for (y = 0 ; y < STAR_HEIGHT ; y++)
740 for (x = 0 ; x < STAR_WIDTH ; x++)
742 board[y][x] = *ptr_tab;
743 switch (*ptr_tab)
745 # define DRAW_TILE( a ) \
746 rb->lcd_bitmap_part( star_tiles, 0, \
747 a*TILE_HEIGHT, TILE_WIDTH, \
748 STAR_OFFSET_X + x * TILE_WIDTH, \
749 STAR_OFFSET_Y + y * TILE_HEIGHT, \
750 TILE_WIDTH, TILE_HEIGHT);
751 case STAR_VOID:
752 DRAW_TILE( SPACE );
753 break;
755 case STAR_WALL:
756 DRAW_TILE( WALL );
757 break;
759 case STAR_STAR:
760 DRAW_TILE( STAR );
761 star_count++;
762 break;
764 case STAR_BALL:
765 ball_x = x;
766 ball_y = y;
767 DRAW_TILE( BALL );
768 break;
771 case STAR_BLOCK:
772 block_x = x;
773 block_y = y;
774 DRAW_TILE( BLOCK );
775 break;
777 ptr_tab++;
779 ptr_tab++;
781 star_display_board_info(current_level);
782 star_transition_update();
783 return 1;
786 static void star_animate_tile(int tile_no, int start_x, int start_y,
787 int delta_x, int delta_y)
789 int i;
791 if (delta_x != 0) /* horizontal */
793 for (i = 1 ; i <= TILE_WIDTH ; i++)
795 STAR_SLEEP
796 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT, TILE_WIDTH,
797 start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
798 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT, TILE_WIDTH,
799 start_x + delta_x * i, start_y, TILE_WIDTH, TILE_HEIGHT);
800 rb->lcd_update_rect(start_x + delta_x * i - (delta_x>0?1:0),
801 start_y, TILE_WIDTH + 1, TILE_HEIGHT);
804 else /* vertical */
806 for (i = 1 ; i <= TILE_HEIGHT ; i++)
808 STAR_SLEEP
809 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT, TILE_WIDTH,
810 start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
811 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT, TILE_WIDTH,
812 start_x, start_y + delta_y * i, TILE_WIDTH, TILE_HEIGHT);
813 rb->lcd_update_rect(start_x, start_y + delta_y * i - (delta_y>0?1:0),
814 TILE_WIDTH, TILE_HEIGHT + 1);
820 * Run the game.
822 static int star_run_game(int current_level)
824 int move_x = 0;
825 int move_y = 0;
826 int key;
827 int lastkey = BUTTON_NONE;
829 int label_offset_y;
831 label_offset_y = LCD_HEIGHT - char_height;
833 if (!star_load_level(current_level))
834 return 0;
836 while (true)
838 move_x = 0;
839 move_y = 0;
841 while ((move_x == 0) && (move_y == 0))
843 key = rb->button_get(true);
844 switch (key)
846 #ifdef STAR_RC_QUIT
847 case STAR_RC_QUIT:
848 #endif
849 case STAR_QUIT:
850 return -1;
852 case STAR_LEFT:
853 move_x = -1;
854 break;
856 case STAR_RIGHT:
857 move_x = 1;
858 break;
860 case STAR_UP:
861 move_y = -1;
862 break;
864 case STAR_DOWN:
865 move_y = 1;
866 break;
868 case STAR_LEVEL_DOWN:
869 #ifdef STAR_LEVEL_DOWN_PRE
870 if (lastkey != STAR_LEVEL_DOWN_PRE)
871 break;
872 #endif
873 if (current_level > 0)
875 current_level--;
876 star_load_level(current_level);
878 break;
880 case STAR_LEVEL_REPEAT:
881 star_load_level(current_level);
882 break;
884 case STAR_LEVEL_UP:
885 #ifdef STAR_LEVEL_UP_PRE
886 if (lastkey != STAR_LEVEL_UP_PRE)
887 break;
888 #endif
889 if (current_level < STAR_LEVEL_COUNT - 1)
891 current_level++;
892 star_load_level(current_level);
894 break;
896 case STAR_TOGGLE_CONTROL:
897 #ifdef STAR_TOGGLE_CONTROL_PRE
898 if (lastkey != STAR_TOGGLE_CONTROL_PRE)
899 break;
900 #endif
901 #ifdef STAR_TOGGLE_CONTROL2
902 case STAR_TOGGLE_CONTROL2:
903 #endif
904 if (control == STAR_CONTROL_BALL)
905 control = STAR_CONTROL_BLOCK;
906 else
907 control = STAR_CONTROL_BALL;
908 star_display_board_info(current_level);
909 break;
911 default:
912 if (rb->default_event_handler(key) == SYS_USB_CONNECTED)
914 usb_detected = true;
915 return 0;
917 break;
919 if (key != BUTTON_NONE)
920 lastkey = key;
923 if (control == STAR_CONTROL_BALL)
925 board[ball_y][ball_x] = STAR_VOID;
926 while ((board[ball_y + move_y][ball_x + move_x] == STAR_VOID
927 || board[ball_y + move_y][ball_x + move_x] == STAR_STAR))
930 star_animate_tile(BALL, STAR_OFFSET_X + ball_x * TILE_WIDTH,
931 STAR_OFFSET_Y + ball_y * TILE_HEIGHT,
932 move_x, move_y);
933 ball_x += move_x;
934 ball_y += move_y;
936 if (board[ball_y][ball_x] == STAR_STAR)
938 board[ball_y][ball_x] = STAR_VOID;
939 star_count--;
941 star_display_board_info(current_level);
944 board[ball_y][ball_x] = STAR_BALL;
946 else
948 board[block_y][block_x] = STAR_VOID;
949 while (board[block_y + move_y][block_x + move_x] == STAR_VOID)
951 star_animate_tile(BLOCK, STAR_OFFSET_X + block_x * TILE_WIDTH,
952 STAR_OFFSET_Y + block_y * TILE_HEIGHT,
953 move_x, move_y);
954 block_x += move_x;
955 block_y += move_y;
957 board[block_y][block_x] = STAR_BLOCK;
960 if (star_count == 0)
962 current_level++;
963 if (current_level == STAR_LEVEL_COUNT)
965 rb->lcd_clear_display();
966 rb->splash(HZ*2, "Congratulations!");
967 rb->lcd_update();
969 /* There is no such level as STAR_LEVEL_COUNT so it can't be the
970 * current_level */
971 current_level--;
972 return 1;
974 star_load_level(current_level);
980 * Display help text.
982 static bool star_help(void)
984 int button;
985 #define WORDS (sizeof help_text / sizeof (char*))
986 static char* help_text[] = {
987 "Star", "", "Aim", "",
988 "Take", "all", "the", "stars", "to", "go", "to", "the", "next", "level.",
989 "You", "can", "toggle", "control", "with", "the", "block", "to", "use",
990 "it", "as", "a", "mobile", "wall.", "The", "block", "cannot", "take",
991 "stars.", "", "",
992 "Controls", "",
993 STAR_TOGGLE_CONTROL_NAME":", "Toggle", "Control", "",
994 STAR_QUIT_NAME":", "", "Exit", "",
995 STAR_LEVEL_DOWN_NAME":", "Prev.", "level", "",
996 STAR_LEVEL_REPEAT_NAME":", "Reset", "level", "",
997 STAR_LEVEL_UP_NAME":", "Next", "level"
999 static struct style_text formation[]={
1000 { 0, TEXT_CENTER|TEXT_UNDERLINE },
1001 { 2, C_RED },
1002 { 35, C_RED },
1003 { -1, 0 }
1006 if (display_text(WORDS, help_text, formation, NULL))
1007 return true;
1008 do {
1009 button = rb->button_get(true);
1010 if ( rb->default_event_handler( button ) == SYS_USB_CONNECTED )
1011 return true;
1012 } while( ( button == BUTTON_NONE )
1013 || ( button & (BUTTON_REL|BUTTON_REPEAT) ) );
1015 return false;
1019 * Display the choice menu.
1021 static int star_menu(void)
1023 int selection, level=1;
1024 bool menu_quit = false;
1025 /* get the size of char */
1026 rb->lcd_getstringsize("a", &char_width, &char_height);
1028 MENUITEM_STRINGLIST(menu,"Star Menu",NULL,"Play","Choose Level",
1029 "Help", "Quit");
1031 while(!menu_quit)
1033 switch(rb->do_menu(&menu, &selection, NULL, false))
1035 case 0:
1036 menu_quit = true;
1037 break;
1038 case 1:
1039 rb->set_int("Level", "", UNIT_INT, &level,
1040 NULL, 1, 1, STAR_LEVEL_COUNT, NULL );
1041 break;
1042 case 2:
1043 if(star_help())
1044 usb_detected = true;
1045 break;
1046 default:
1047 menu_quit = true;
1048 break;
1052 if (selection == MENU_START)
1054 rb->lcd_setfont(FONT_SYSFIXED);
1055 rb->lcd_getstringsize("a", &char_width, &char_height);
1056 level--;
1057 star_run_game(level);
1059 return PLUGIN_OK;
1063 * Main entry point
1065 enum plugin_status plugin_start(const void* parameter)
1067 (void)parameter;
1069 #if LCD_DEPTH > 1
1070 rb->lcd_set_backdrop(NULL);
1071 rb->lcd_set_background( LCD_BLACK );
1072 rb->lcd_set_foreground( LCD_WHITE );
1073 #endif
1075 /* display choice menu */
1076 return star_menu();
1079 #endif