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