A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 Frederic Dang Ngoc
11 *
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.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "plugin.h"
22
23#include "lib/display_text.h"
24#include "lib/playback_control.h"
25
26
27
28/* size of a level in file */
29#define STAR_LEVEL_SIZE ((STAR_WIDTH + 1) * STAR_HEIGHT + 1)
30
31/* size of the game board */
32#define STAR_WIDTH 16
33#define STAR_HEIGHT 9
34
35/* number of level */
36#define STAR_LEVEL_COUNT 20
37
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'
44
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
54
55/* value of ball and block control */
56#define STAR_CONTROL_BALL 0
57#define STAR_CONTROL_BLOCK 1
58
59/* variable button definitions */
60#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
61 (CONFIG_KEYPAD == IRIVER_H300_PAD)
62#define STAR_QUIT BUTTON_OFF
63#define STAR_LEFT BUTTON_LEFT
64#define STAR_RIGHT BUTTON_RIGHT
65#define STAR_UP BUTTON_UP
66#define STAR_DOWN BUTTON_DOWN
67#define STAR_TOGGLE_CONTROL BUTTON_MODE
68#define STAR_TOGGLE_CONTROL2 BUTTON_SELECT
69#define STAR_LEVEL_UP (BUTTON_ON | BUTTON_RIGHT)
70#define STAR_LEVEL_DOWN (BUTTON_ON | BUTTON_LEFT)
71#define STAR_LEVEL_REPEAT (BUTTON_ON | BUTTON_SELECT)
72#define STAR_TOGGLE_CONTROL_NAME "MODE/SELECT"
73#define STAR_QUIT_NAME "OFF"
74#define STAR_LEVEL_UP_NAME "ON + RIGHT"
75#define STAR_LEVEL_DOWN_NAME "ON + LEFT"
76#define STAR_LEVEL_REPEAT_NAME "ON + NAVI"
77
78#define STAR_RC_QUIT BUTTON_RC_STOP
79#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
80 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
81 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
82
83#define STAR_QUIT (BUTTON_SELECT | BUTTON_REPEAT)
84#define STAR_LEFT BUTTON_LEFT
85#define STAR_RIGHT BUTTON_RIGHT
86#define STAR_UP BUTTON_MENU
87#define STAR_DOWN BUTTON_PLAY
88#define STAR_TOGGLE_CONTROL_PRE BUTTON_SELECT
89#define STAR_TOGGLE_CONTROL (BUTTON_SELECT | BUTTON_REL)
90#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
91#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
92#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_PLAY)
93#define STAR_TOGGLE_CONTROL_NAME "SELECT"
94#define STAR_QUIT_NAME "Long SELECT"
95#define STAR_LEVEL_UP_NAME "S >"
96#define STAR_LEVEL_DOWN_NAME "S <"
97#define STAR_LEVEL_REPEAT_NAME "S + PLAY"
98
99#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
100
101#define STAR_QUIT BUTTON_POWER
102#define STAR_LEFT BUTTON_LEFT
103#define STAR_RIGHT BUTTON_RIGHT
104#define STAR_UP BUTTON_UP
105#define STAR_DOWN BUTTON_DOWN
106#define STAR_TOGGLE_CONTROL BUTTON_SELECT
107#define STAR_LEVEL_UP_PRE BUTTON_REC
108#define STAR_LEVEL_UP (BUTTON_REC|BUTTON_REL)
109#define STAR_LEVEL_DOWN_PRE BUTTON_REC
110#define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_REPEAT)
111#define STAR_LEVEL_REPEAT BUTTON_PLAY
112#define STAR_TOGGLE_CONTROL_NAME "SELECT"
113#define STAR_QUIT_NAME "POWER"
114#define STAR_LEVEL_UP_NAME "REC"
115#define STAR_LEVEL_DOWN_NAME "REC.."
116#define STAR_LEVEL_REPEAT_NAME "PLAY"
117
118#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
119
120#define STAR_QUIT BUTTON_POWER
121#define STAR_LEFT BUTTON_LEFT
122#define STAR_RIGHT BUTTON_RIGHT
123#define STAR_UP BUTTON_UP
124#define STAR_DOWN BUTTON_DOWN
125#define STAR_TOGGLE_CONTROL BUTTON_SELECT
126#define STAR_LEVEL_UP BUTTON_VOL_UP
127#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
128#define STAR_LEVEL_REPEAT BUTTON_A
129#define STAR_TOGGLE_CONTROL_NAME "SELECT"
130#define STAR_QUIT_NAME "POWER"
131#define STAR_LEVEL_UP_NAME "VOL UP"
132#define STAR_LEVEL_DOWN_NAME "VOL DOWN"
133#define STAR_LEVEL_REPEAT_NAME "A"
134
135#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
136(CONFIG_KEYPAD == SANSA_C200_PAD) || \
137(CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
138(CONFIG_KEYPAD == SANSA_M200_PAD)
139
140#define STAR_QUIT BUTTON_POWER
141#define STAR_LEFT BUTTON_LEFT
142#define STAR_RIGHT BUTTON_RIGHT
143#define STAR_UP BUTTON_UP
144#define STAR_DOWN BUTTON_DOWN
145#define STAR_TOGGLE_CONTROL BUTTON_SELECT
146#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
147#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
148#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
149#define STAR_TOGGLE_CONTROL_NAME "SELECT"
150#define STAR_QUIT_NAME "POWER"
151#define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
152#define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
153#define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
154
155#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
156
157#define STAR_QUIT (BUTTON_HOME|BUTTON_REPEAT)
158#define STAR_LEFT BUTTON_LEFT
159#define STAR_RIGHT BUTTON_RIGHT
160#define STAR_UP BUTTON_UP
161#define STAR_DOWN BUTTON_DOWN
162#define STAR_TOGGLE_CONTROL BUTTON_SELECT
163#define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
164#define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
165#define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
166#define STAR_TOGGLE_CONTROL_NAME "SELECT"
167#define STAR_QUIT_NAME "HOME"
168#define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
169#define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
170#define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
171
172#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
173
174#define STAR_QUIT BUTTON_POWER
175#define STAR_LEFT BUTTON_LEFT
176#define STAR_RIGHT BUTTON_RIGHT
177#define STAR_UP BUTTON_SCROLL_UP
178#define STAR_DOWN BUTTON_SCROLL_DOWN
179#define STAR_TOGGLE_CONTROL BUTTON_REW
180#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP)
181#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN)
182#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT)
183#define STAR_TOGGLE_CONTROL_NAME "REW"
184#define STAR_QUIT_NAME "POWER"
185#define STAR_LEVEL_UP_NAME "PLAY+UP"
186#define STAR_LEVEL_DOWN_NAME "PLAY+DOWN"
187#define STAR_LEVEL_REPEAT_NAME "PLAY+RIGHT"
188
189#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
190
191#define STAR_QUIT BUTTON_BACK
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_VOL_UP
198#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
199#define STAR_LEVEL_REPEAT BUTTON_MENU
200#define STAR_TOGGLE_CONTROL_NAME "SELECT"
201#define STAR_QUIT_NAME "BACK"
202#define STAR_LEVEL_UP_NAME "VOL UP"
203#define STAR_LEVEL_DOWN_NAME "VOL DOWN"
204#define STAR_LEVEL_REPEAT_NAME "MENU"
205
206#elif (CONFIG_KEYPAD == MROBE100_PAD)
207
208#define STAR_QUIT BUTTON_POWER
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_PLAY
215#define STAR_LEVEL_DOWN BUTTON_MENU
216#define STAR_LEVEL_REPEAT BUTTON_DISPLAY
217#define STAR_TOGGLE_CONTROL_NAME "SELECT"
218#define STAR_QUIT_NAME "POWER"
219#define STAR_LEVEL_UP_NAME "PLAY"
220#define STAR_LEVEL_DOWN_NAME "MENU"
221#define STAR_LEVEL_REPEAT_NAME "DISPLAY"
222
223#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
224
225#define STAR_QUIT BUTTON_RC_REC
226#define STAR_LEFT BUTTON_RC_REW
227#define STAR_RIGHT BUTTON_RC_FF
228#define STAR_UP BUTTON_RC_VOL_UP
229#define STAR_DOWN BUTTON_RC_VOL_DOWN
230#define STAR_TOGGLE_CONTROL BUTTON_RC_MODE
231#define STAR_LEVEL_UP (BUTTON_RC_PLAY|BUTTON_RC_VOL_UP)
232#define STAR_LEVEL_DOWN (BUTTON_RC_PLAY|BUTTON_RC_VOL_DOWN)
233#define STAR_LEVEL_REPEAT (BUTTON_RC_PLAY|BUTTON_RC_MENU)
234#define STAR_TOGGLE_CONTROL_NAME "MODE"
235#define STAR_QUIT_NAME "REC"
236#define STAR_LEVEL_UP_NAME "PLAY+VOL+"
237#define STAR_LEVEL_DOWN_NAME "PLAY+VOL-"
238#define STAR_LEVEL_REPEAT_NAME "PLAY+MENU"
239
240#elif (CONFIG_KEYPAD == COWON_D2_PAD)
241
242#define STAR_QUIT BUTTON_POWER
243#define STAR_QUIT_NAME "POWER"
244
245#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
246
247#define STAR_QUIT BUTTON_BACK
248#define STAR_LEFT BUTTON_LEFT
249#define STAR_RIGHT BUTTON_RIGHT
250#define STAR_UP BUTTON_UP
251#define STAR_DOWN BUTTON_DOWN
252#define STAR_TOGGLE_CONTROL BUTTON_PLAY
253#define STAR_LEVEL_UP (BUTTON_CUSTOM | BUTTON_UP)
254#define STAR_LEVEL_DOWN (BUTTON_CUSTOM | BUTTON_DOWN)
255#define STAR_LEVEL_REPEAT (BUTTON_CUSTOM | BUTTON_RIGHT)
256#define STAR_TOGGLE_CONTROL_NAME "PLAY"
257#define STAR_QUIT_NAME "BACK"
258#define STAR_LEVEL_UP_NAME "CUSTOM+UP"
259#define STAR_LEVEL_DOWN_NAME "CUSTOM+DOWN"
260#define STAR_LEVEL_REPEAT_NAME "CUSTOM+RIGHT"
261
262#elif CONFIG_KEYPAD == CREATIVE_ZENXFI3_PAD
263
264#define STAR_QUIT BUTTON_POWER
265#define STAR_LEFT BUTTON_BACK
266#define STAR_RIGHT BUTTON_MENU
267#define STAR_UP BUTTON_UP
268#define STAR_DOWN BUTTON_DOWN
269#define STAR_TOGGLE_CONTROL BUTTON_PLAY
270#define STAR_LEVEL_UP BUTTON_VOL_UP
271#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
272#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_REPEAT)
273#define STAR_TOGGLE_CONTROL_NAME "PLAY"
274#define STAR_QUIT_NAME "POWER"
275#define STAR_LEVEL_UP_NAME "VOL+"
276#define STAR_LEVEL_DOWN_NAME "VOL-"
277#define STAR_LEVEL_REPEAT_NAME "Hold PLAY button"
278
279#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
280
281#define STAR_QUIT BUTTON_POWER
282#define STAR_LEFT BUTTON_LEFT
283#define STAR_RIGHT BUTTON_RIGHT
284#define STAR_UP BUTTON_UP
285#define STAR_DOWN BUTTON_DOWN
286#define STAR_TOGGLE_CONTROL BUTTON_SELECT
287#define STAR_LEVEL_UP BUTTON_VOL_UP
288#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
289#define STAR_LEVEL_REPEAT BUTTON_VIEW
290#define STAR_TOGGLE_CONTROL_NAME "SELECT"
291#define STAR_QUIT_NAME "POWER"
292#define STAR_LEVEL_UP_NAME "VOL UP"
293#define STAR_LEVEL_DOWN_NAME "VOL DOWN"
294#define STAR_LEVEL_REPEAT_NAME "VIEW"
295
296#elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
297
298#define STAR_QUIT BUTTON_POWER
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_VOL_UP
305#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
306#define STAR_LEVEL_REPEAT BUTTON_NEXT
307#define STAR_TOGGLE_CONTROL_NAME "PLAY"
308#define STAR_QUIT_NAME "POWER"
309#define STAR_LEVEL_UP_NAME "VOL +"
310#define STAR_LEVEL_DOWN_NAME "VOL -"
311#define STAR_LEVEL_REPEAT_NAME "NEXT"
312
313#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
314
315#define STAR_QUIT BUTTON_POWER
316#define STAR_LEFT BUTTON_PREV
317#define STAR_RIGHT BUTTON_NEXT
318#define STAR_UP BUTTON_UP
319#define STAR_DOWN BUTTON_DOWN
320#define STAR_TOGGLE_CONTROL BUTTON_PLAY
321#define STAR_LEVEL_UP BUTTON_VOL_UP
322#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
323#define STAR_LEVEL_REPEAT BUTTON_RIGHT
324#define STAR_TOGGLE_CONTROL_NAME "PLAY"
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 "RIGHT"
329
330#elif (CONFIG_KEYPAD == ONDAVX747_PAD)
331
332#define STAR_QUIT BUTTON_POWER
333#define STAR_QUIT_NAME "POWER"
334
335#elif (CONFIG_KEYPAD == ONDAVX777_PAD)
336#define STAR_QUIT BUTTON_POWER
337#define STAR_QUIT_NAME "POWER"
338
339#elif CONFIG_KEYPAD == MROBE500_PAD
340#define STAR_QUIT BUTTON_POWER
341#define STAR_QUIT_NAME "POWER"
342
343#elif CONFIG_KEYPAD == SAMSUNG_YH820_PAD
344
345#define STAR_QUIT (BUTTON_REW|BUTTON_REPEAT)
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 (BUTTON_REC|BUTTON_UP)
351#define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_DOWN)
352#define STAR_TOGGLE_CONTROL BUTTON_PLAY
353#define STAR_LEVEL_REPEAT_PRE BUTTON_FFWD
354#define STAR_LEVEL_REPEAT (BUTTON_FFWD|BUTTON_REPEAT)
355#define STAR_TOGGLE_CONTROL_NAME "PLAY"
356#define STAR_QUIT_NAME "LONG REW"
357#define STAR_LEVEL_UP_NAME "REC+UP"
358#define STAR_LEVEL_DOWN_NAME "REC+DOWN"
359#define STAR_LEVEL_REPEAT_NAME "LONG FFWD"
360
361#elif CONFIG_KEYPAD == SAMSUNG_YH92X_PAD
362
363#define STAR_QUIT (BUTTON_REW|BUTTON_REPEAT)
364#define STAR_LEFT BUTTON_LEFT
365#define STAR_RIGHT BUTTON_RIGHT
366#define STAR_UP BUTTON_UP
367#define STAR_DOWN BUTTON_DOWN
368#define STAR_LEVEL_UP (BUTTON_FFWD|BUTTON_UP)
369#define STAR_LEVEL_DOWN (BUTTON_FFWD|BUTTON_DOWN)
370#define STAR_TOGGLE_CONTROL (BUTTON_PLAY|BUTTON_REL)
371#define STAR_LEVEL_REPEAT_PRE (BUTTON_FFWD|BUTTON_REPEAT)
372#define STAR_LEVEL_REPEAT (BUTTON_FFWD|BUTTON_REL)
373#define STAR_TOGGLE_CONTROL_NAME "PLAY"
374#define STAR_QUIT_NAME "LONG REW"
375#define STAR_LEVEL_UP_NAME "FFWD+UP"
376#define STAR_LEVEL_DOWN_NAME "FFWD+DOWN"
377#define STAR_LEVEL_REPEAT_NAME "LONG FFWD"
378
379#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
380
381#define STAR_QUIT BUTTON_REC
382#define STAR_LEFT BUTTON_PREV
383#define STAR_RIGHT BUTTON_NEXT
384#define STAR_UP BUTTON_UP
385#define STAR_DOWN BUTTON_DOWN
386#define STAR_TOGGLE_CONTROL BUTTON_PLAY
387#define STAR_LEVEL_UP BUTTON_OK
388#define STAR_LEVEL_DOWN BUTTON_CANCEL
389#define STAR_LEVEL_REPEAT BUTTON_MENU
390#define STAR_TOGGLE_CONTROL_NAME "PLAY"
391#define STAR_QUIT_NAME "REC"
392#define STAR_LEVEL_UP_NAME "OK"
393#define STAR_LEVEL_DOWN_NAME "CANCEL"
394#define STAR_LEVEL_REPEAT_NAME "MENU"
395
396#elif CONFIG_KEYPAD == MPIO_HD200_PAD
397
398#define STAR_QUIT (BUTTON_REC | BUTTON_PLAY)
399#define STAR_LEFT BUTTON_VOL_DOWN
400#define STAR_RIGHT BUTTON_VOL_UP
401#define STAR_UP BUTTON_REW
402#define STAR_DOWN BUTTON_FF
403#define STAR_TOGGLE_CONTROL_PRE BUTTON_FUNC
404#define STAR_TOGGLE_CONTROL (BUTTON_FUNC | BUTTON_REL)
405#define STAR_LEVEL_UP BUTTON_PLAY
406#define STAR_LEVEL_DOWN BUTTON_REC
407#define STAR_LEVEL_REPEAT (BUTTON_FUNC | BUTTON_REPEAT)
408#define STAR_TOGGLE_CONTROL_NAME "FUNC"
409#define STAR_QUIT_NAME "REC + PLAY"
410#define STAR_LEVEL_UP_NAME "PLAY"
411#define STAR_LEVEL_DOWN_NAME "REC"
412#define STAR_LEVEL_REPEAT_NAME "FUNC LONG"
413
414#elif CONFIG_KEYPAD == MPIO_HD300_PAD
415
416#define STAR_QUIT (BUTTON_MENU | BUTTON_REPEAT)
417#define STAR_LEFT BUTTON_REW
418#define STAR_RIGHT BUTTON_FF
419#define STAR_UP BUTTON_UP
420#define STAR_DOWN BUTTON_DOWN
421#define STAR_TOGGLE_CONTROL_PRE BUTTON_ENTER
422#define STAR_TOGGLE_CONTROL (BUTTON_ENTER | BUTTON_REL)
423#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_FF)
424#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_REW)
425#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_REPEAT)
426#define STAR_TOGGLE_CONTROL_NAME "ENTER"
427#define STAR_QUIT_NAME "LONG MENU"
428#define STAR_LEVEL_UP_NAME "PLAY + FF"
429#define STAR_LEVEL_DOWN_NAME "PLAY + REW"
430#define STAR_LEVEL_REPEAT_NAME "LONG PLAY"
431
432#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
433
434#define STAR_QUIT BUTTON_POWER
435#define STAR_LEFT BUTTON_LEFT
436#define STAR_RIGHT BUTTON_RIGHT
437#define STAR_UP BUTTON_UP
438#define STAR_DOWN BUTTON_DOWN
439#define STAR_TOGGLE_CONTROL BUTTON_PLAYPAUSE
440#define STAR_LEVEL_UP BUTTON_VOL_UP
441#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
442#define STAR_LEVEL_REPEAT (BUTTON_BACK | BUTTON_REPEAT)
443#define STAR_TOGGLE_CONTROL_NAME "SELECT"
444#define STAR_QUIT_NAME "POWER"
445#define STAR_LEVEL_UP_NAME "Vol+"
446#define STAR_LEVEL_DOWN_NAME "Vol-"
447#define STAR_LEVEL_REPEAT_NAME "BACK LONG"
448
449#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
450
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_SELECT
457#define STAR_LEVEL_UP BUTTON_VOL_UP
458#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
459#define STAR_LEVEL_REPEAT (BUTTON_PREV | 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 "PREV LONG"
465
466#elif (CONFIG_KEYPAD == SAMSUNG_YPR0_PAD)
467
468#define STAR_QUIT BUTTON_BACK
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_MENU
475#define STAR_LEVEL_DOWN BUTTON_POWER
476#define STAR_LEVEL_REPEAT BUTTON_USER
477#define STAR_TOGGLE_CONTROL_NAME "Select"
478#define STAR_QUIT_NAME "Back"
479#define STAR_LEVEL_UP_NAME "Menu"
480#define STAR_LEVEL_DOWN_NAME "Power"
481#define STAR_LEVEL_REPEAT_NAME "User"
482
483#elif (CONFIG_KEYPAD == HM60X_PAD)
484
485#define STAR_QUIT BUTTON_POWER
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_POWER | BUTTON_UP)
492#define STAR_LEVEL_DOWN (BUTTON_POWER | BUTTON_DOWN)
493#define STAR_LEVEL_REPEAT (BUTTON_POWER | BUTTON_SELECT)
494#define STAR_TOGGLE_CONTROL_NAME "SELECT"
495#define STAR_QUIT_NAME "POWER"
496#define STAR_LEVEL_UP_NAME "POWER + UP"
497#define STAR_LEVEL_DOWN_NAME "POWER + DOWN"
498#define STAR_LEVEL_REPEAT_NAME "POWER + SELECT"
499
500#elif (CONFIG_KEYPAD == HM801_PAD)
501
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_NEXT
509#define STAR_LEVEL_DOWN BUTTON_PREV
510#define STAR_LEVEL_REPEAT BUTTON_PLAY
511#define STAR_TOGGLE_CONTROL_NAME "SELECT"
512#define STAR_QUIT_NAME "POWER"
513#define STAR_LEVEL_UP_NAME "NEXT"
514#define STAR_LEVEL_DOWN_NAME "PREV"
515#define STAR_LEVEL_REPEAT_NAME "PLAY"
516
517#elif CONFIG_KEYPAD == SONY_NWZ_PAD
518#define STAR_QUIT BUTTON_BACK
519#define STAR_LEFT BUTTON_LEFT
520#define STAR_RIGHT BUTTON_RIGHT
521#define STAR_UP BUTTON_UP
522#define STAR_DOWN BUTTON_DOWN
523#define STAR_TOGGLE_CONTROL BUTTON_PLAY
524#define STAR_LEVEL_UP (BUTTON_POWER|BUTTON_UP)
525#define STAR_LEVEL_DOWN (BUTTON_POWER|BUTTON_DOWN)
526#define STAR_LEVEL_REPEAT (BUTTON_POWER|BUTTON_PLAY)
527#define STAR_LEVEL_UP_NAME "Option+Up"
528#define STAR_LEVEL_DOWN_NAME "Option+Down"
529#define STAR_LEVEL_REPEAT_NAME "Option+Play"
530#define STAR_TOGGLE_CONTROL_NAME "Play"
531#define STAR_QUIT_NAME "Back"
532
533#elif CONFIG_KEYPAD == CREATIVE_ZEN_PAD
534#define STAR_QUIT BUTTON_BACK
535#define STAR_LEFT BUTTON_LEFT
536#define STAR_RIGHT BUTTON_RIGHT
537#define STAR_UP BUTTON_UP
538#define STAR_DOWN BUTTON_DOWN
539#define STAR_TOGGLE_CONTROL BUTTON_SELECT
540#define STAR_LEVEL_UP BUTTON_MENU
541#define STAR_LEVEL_DOWN BUTTON_PLAYPAUSE
542#define STAR_LEVEL_REPEAT BUTTON_SHORTCUT
543#define STAR_LEVEL_UP_NAME "Menu"
544#define STAR_LEVEL_DOWN_NAME "Play/pause"
545#define STAR_LEVEL_REPEAT_NAME "Shortcut"
546#define STAR_TOGGLE_CONTROL_NAME "Select"
547#define STAR_QUIT_NAME "Back"
548
549#elif (CONFIG_KEYPAD == DX50_PAD)
550#define STAR_QUIT BUTTON_POWER
551#define STAR_QUIT_NAME "Power"
552
553#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD
554#define STAR_QUIT BUTTON_POWER
555#define STAR_QUIT_NAME "POWER"
556#define STAR_TOGGLE_CONTROL BUTTON_MENU
557#define STAR_TOGGLE_CONTROL_NAME "MENU"
558
559#elif CONFIG_KEYPAD == AGPTEK_ROCKER_PAD
560#define STAR_QUIT BUTTON_POWER
561#define STAR_LEFT BUTTON_LEFT
562#define STAR_RIGHT BUTTON_RIGHT
563#define STAR_UP BUTTON_UP
564#define STAR_DOWN BUTTON_DOWN
565#define STAR_TOGGLE_CONTROL BUTTON_SELECT
566#define STAR_LEVEL_UP (BUTTON_VOLUP|BUTTON_UP)
567#define STAR_LEVEL_DOWN (BUTTON_VOLUP|BUTTON_DOWN)
568#define STAR_LEVEL_REPEAT (BUTTON_VOLUP|BUTTON_SELECT)
569#define STAR_LEVEL_UP_NAME "Option+Up"
570#define STAR_LEVEL_DOWN_NAME "Option+Down"
571#define STAR_LEVEL_REPEAT_NAME "Option+Play"
572#define STAR_TOGGLE_CONTROL_NAME "Play"
573#define STAR_QUIT_NAME "Back"
574
575#elif CONFIG_KEYPAD == XDUOO_X3_PAD
576#define STAR_QUIT BUTTON_POWER
577#define STAR_LEFT BUTTON_PREV
578#define STAR_RIGHT BUTTON_NEXT
579#define STAR_UP BUTTON_HOME
580#define STAR_DOWN BUTTON_OPTION
581#define STAR_TOGGLE_CONTROL BUTTON_PLAY
582#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT)
583#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV)
584#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION)
585#define STAR_TOGGLE_CONTROL_NAME "PLAY"
586#define STAR_QUIT_NAME "POWER"
587#define STAR_LEVEL_UP_NAME "PLAY + NEXT"
588#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
589#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
590
591#elif CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD
592#define STAR_QUIT BUTTON_POWER
593#define STAR_LEFT BUTTON_PREV
594#define STAR_RIGHT BUTTON_NEXT
595#define STAR_UP BUTTON_HOME
596#define STAR_DOWN BUTTON_OPTION
597#define STAR_TOGGLE_CONTROL BUTTON_PLAY
598#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT)
599#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV)
600#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION)
601#define STAR_TOGGLE_CONTROL_NAME "PLAY"
602#define STAR_QUIT_NAME "POWER"
603#define STAR_LEVEL_UP_NAME "PLAY + NEXT"
604#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
605#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
606
607#elif CONFIG_KEYPAD == FIIO_M3K_LINUX_PAD
608#define STAR_QUIT BUTTON_POWER
609#define STAR_LEFT BUTTON_PREV
610#define STAR_RIGHT BUTTON_NEXT
611#define STAR_UP BUTTON_HOME
612#define STAR_DOWN BUTTON_OPTION
613#define STAR_TOGGLE_CONTROL BUTTON_PLAY
614#define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_NEXT)
615#define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_PREV)
616#define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_OPTION)
617#define STAR_TOGGLE_CONTROL_NAME "PLAY"
618#define STAR_QUIT_NAME "POWER"
619#define STAR_LEVEL_UP_NAME "PLAY + NEXT"
620#define STAR_LEVEL_DOWN_NAME "PLAY + PREV"
621#define STAR_LEVEL_REPEAT_NAME "PLAY + OPTION"
622
623#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD
624#define STAR_QUIT BUTTON_POWER
625#define STAR_LEFT BUTTON_HOME
626#define STAR_RIGHT BUTTON_VOL_DOWN
627#define STAR_UP BUTTON_PREV
628#define STAR_DOWN BUTTON_NEXT
629#define STAR_TOGGLE_CONTROL BUTTON_PLAY
630#define STAR_LEVEL_UP (BUTTON_POWER | BUTTON_VOL_UP)
631#define STAR_LEVEL_DOWN (BUTTON_POWER | BUTTON_VOL_DOWN)
632#define STAR_LEVEL_REPEAT (BUTTON_POWER | BUTTON_HOME)
633#define STAR_TOGGLE_CONTROL_NAME "PLAY"
634#define STAR_QUIT_NAME "POWER"
635#define STAR_LEVEL_UP_NAME "POWER + VOL+"
636#define STAR_LEVEL_DOWN_NAME "POWER + VOL-"
637#define STAR_LEVEL_REPEAT_NAME "POWER + HOME"
638
639#elif CONFIG_KEYPAD == EROSQ_PAD
640#define STAR_QUIT BUTTON_POWER
641#define STAR_LEFT BUTTON_SCROLL_BACK
642#define STAR_RIGHT BUTTON_SCROLL_FWD
643#define STAR_UP BUTTON_PREV
644#define STAR_DOWN BUTTON_NEXT
645#define STAR_TOGGLE_CONTROL BUTTON_PLAY
646#define STAR_LEVEL_UP BUTTON_VOL_UP
647#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
648#define STAR_LEVEL_REPEAT BUTTON_BACK
649#define STAR_TOGGLE_CONTROL_NAME "PLAY"
650#define STAR_QUIT_NAME "POWER"
651#define STAR_LEVEL_UP_NAME "VOL UP"
652#define STAR_LEVEL_DOWN_NAME "VOL DN"
653#define STAR_LEVEL_REPEAT_NAME "BACK"
654
655#elif CONFIG_KEYPAD == FIIO_M3K_PAD
656#define STAR_QUIT BUTTON_POWER
657#define STAR_LEFT BUTTON_LEFT
658#define STAR_RIGHT BUTTON_RIGHT
659#define STAR_UP BUTTON_UP
660#define STAR_DOWN BUTTON_DOWN
661#define STAR_TOGGLE_CONTROL BUTTON_PLAY
662#define STAR_LEVEL_UP BUTTON_VOL_UP
663#define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
664#define STAR_LEVEL_REPEAT BUTTON_BACK
665#define STAR_TOGGLE_CONTROL_NAME "PLAY"
666#define STAR_QUIT_NAME "POWER"
667#define STAR_LEVEL_UP_NAME "VOL+"
668#define STAR_LEVEL_DOWN_NAME "VOL-"
669#define STAR_LEVEL_REPEAT_NAME "BACK"
670
671#elif CONFIG_KEYPAD == SHANLING_Q1_PAD
672#define STAR_QUIT BUTTON_POWER
673#define STAR_QUIT_NAME "POWER"
674
675
676#elif CONFIG_KEYPAD == SDL_PAD
677/* use touch screen */
678#elif CONFIG_KEYPAD == MA_PAD
679#define STAR_QUIT BUTTON_BACK
680#define STAR_LEFT BUTTON_LEFT
681#define STAR_RIGHT BUTTON_RIGHT
682#define STAR_UP BUTTON_UP
683#define STAR_DOWN BUTTON_DOWN
684#define STAR_TOGGLE_CONTROL BUTTON_PLAY
685#define STAR_LEVEL_UP (BUTTON_MENU|BUTTON_UP)
686#define STAR_LEVEL_DOWN (BUTTON_MENU|BUTTON_DOWN)
687#define STAR_LEVEL_REPEAT BUTTON_MENU
688#define STAR_TOGGLE_CONTROL_NAME "PLAY"
689#define STAR_QUIT_NAME "BACK"
690#define STAR_LEVEL_UP_NAME "MENU+UP"
691#define STAR_LEVEL_DOWN_NAME "MENU+DOWN"
692#define STAR_LEVEL_REPEAT_NAME "MENU"
693
694#elif CONFIG_KEYPAD == RG_NANO_PAD
695
696#define STAR_QUIT BUTTON_START
697#define STAR_LEFT BUTTON_LEFT
698#define STAR_RIGHT BUTTON_RIGHT
699#define STAR_UP BUTTON_UP
700#define STAR_DOWN BUTTON_DOWN
701#define STAR_TOGGLE_CONTROL BUTTON_A
702#define STAR_LEVEL_UP BUTTON_R
703#define STAR_LEVEL_DOWN BUTTON_L
704#define STAR_LEVEL_REPEAT BUTTON_B
705#define STAR_TOGGLE_CONTROL_NAME "A"
706#define STAR_QUIT_NAME "START"
707#define STAR_LEVEL_UP_NAME "R"
708#define STAR_LEVEL_DOWN_NAME "L"
709#define STAR_LEVEL_REPEAT_NAME "B"
710
711#else
712#error No keymap defined!
713#endif
714
715#ifdef HAVE_TOUCHSCREEN
716#ifndef STAR_QUIT
717#define STAR_QUIT BUTTON_TOPLEFT | BUTTON_CENTER
718#define STAR_QUIT_NAME "TOPLEFT"
719#endif
720#ifndef STAR_LEFT
721#define STAR_LEFT BUTTON_MIDLEFT
722#endif
723#ifndef STAR_RIGHT
724#define STAR_RIGHT BUTTON_MIDRIGHT
725#endif
726#ifndef STAR_UP
727#define STAR_UP BUTTON_TOPMIDDLE
728#endif
729#ifndef STAR_DOWN
730#define STAR_DOWN BUTTON_BOTTOMMIDDLE
731#endif
732#ifndef STAR_TOGGLE_CONTROL
733#define STAR_TOGGLE_CONTROL BUTTON_CENTER
734#define STAR_TOGGLE_CONTROL_NAME "CENTER"
735#endif
736#ifndef STAR_LEVEL_UP
737#define STAR_LEVEL_UP BUTTON_TOPLEFT
738#define STAR_LEVEL_UP_NAME "TOPLEFT"
739#endif
740#ifndef STAR_LEVEL_DOWN
741#define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT
742#define STAR_LEVEL_DOWN_NAME "BOTTOMLEFT"
743#endif
744#ifndef STAR_LEVEL_REPEAT
745#define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT
746#define STAR_LEVEL_REPEAT_NAME "BOTTOMRIGHT"
747#endif
748#endif
749
750/* function returns because of USB? */
751static bool usb_detected = false;
752
753/* position of the ball */
754static int ball_x, ball_y;
755
756/* position of the block */
757static int block_x, block_y;
758
759/* number of stars to get to finish the level */
760static int star_count;
761
762/* the object we control : ball or block */
763static int control;
764
765/* the current board */
766static char board[STAR_HEIGHT][STAR_WIDTH];
767
768#include "pluginbitmaps/star_tiles.h"
769
770#define TILE_WIDTH BMPWIDTH_star_tiles
771#define TILE_HEIGHT (BMPHEIGHT_star_tiles/5)
772#define STAR_OFFSET_X ((LCD_WIDTH - STAR_WIDTH * TILE_WIDTH) / 2)
773#define STAR_OFFSET_Y ((LCD_HEIGHT - STAR_HEIGHT * TILE_HEIGHT - MAX(TILE_HEIGHT, 8)) / 2)
774
775#define WALL 0
776#define SPACE 1
777#define BLOCK 2
778#define STAR 3
779#define BALL 4
780
781/* char font size */
782static int char_width = -1;
783static int char_height = -1;
784
785/* this arrays contains a group of levels loaded into memory */
786static unsigned char* levels =
787"****************\n"
788"*X**........o*x*\n"
789"*..........o.***\n"
790"*.......**o....*\n"
791"*...**.o......**\n"
792"**.o..o.....o..*\n"
793"*.o......o**.o.*\n"
794"*.....**o.....o*\n"
795"****************\n"
796"\n"
797".*..*.*.*...*.**\n"
798"*...o.........X*\n"
799"...*o..*o...o...\n"
800"*.*.o.....o..*.*\n"
801"......*...o...*.\n"
802"*....*x*..o....*\n"
803"...*..*.*...*oo*\n"
804"*.............*.\n"
805".*..*........*..\n"
806"\n"
807"****************\n"
808"*...........o*x*\n"
809"*...**......**X*\n"
810"*...*o.........*\n"
811"*.o.....o**...o*\n"
812"*.*o..o..o*..o**\n"
813"*.**o.*o..o.o***\n"
814"*o....**o......*\n"
815"****************\n"
816"\n"
817"****************\n"
818"*............*x*\n"
819"*.....*........*\n"
820"**o*o.o*o*o*o*o*\n"
821"*.*.*o.o*.*.*.**\n"
822"**o*o*o.o*o*o*o*\n"
823"*.....*........*\n"
824"*...*.......*X.*\n"
825"****************\n"
826"\n"
827".**************.\n"
828"*X..*...*..*...*\n"
829"*..*o.*.o..o.*.*\n"
830"**......*..*...*\n"
831"*o.*o*........**\n"
832"**.....*.o.*...*\n"
833"*o*..*.*.*...*x*\n"
834"*...*....o*..*o*\n"
835".**************.\n"
836"\n"
837"....************\n"
838"...*...o...*o.o*\n"
839"..*....o....*.**\n"
840".*.....o.......*\n"
841"*X.....o.......*\n"
842"**.....o..*...**\n"
843"*......o....*..*\n"
844"*x.*...o..**o..*\n"
845"****************\n"
846"\n"
847"****************\n"
848"*..............*\n"
849".**.***..*o.**o*\n"
850".*o..*o.*.*.*.*.\n"
851"..*..*..***.**..\n"
852".**..*..*o*.*o**\n"
853"*..............*\n"
854"*..X*o....x..*o*\n"
855"****************\n"
856"\n"
857"***************.\n"
858"*..o**.........*\n"
859"*..*o..**.o....*\n"
860"*..o**.*.*o....*\n"
861"**.....**..*o*.*\n"
862"**.*.......o*o.*\n"
863"*oxo*...o..*X*.*\n"
864"**.............*\n"
865".***************\n"
866"\n"
867"..*.***********.\n"
868".*o*o......*..X*\n"
869"*o.o*....o....*.\n"
870".*.*..o**..o*..*\n"
871"*..*o.*oxo....o*\n"
872"*.....o**.....*.\n"
873"*o*o.........*..\n"
874"*...........*...\n"
875".***********....\n"
876"\n"
877"....***********.\n"
878"*****.o........*\n"
879"*...x.***o.o*.o*\n"
880"*.o...*o.*o...*.\n"
881"*.....*..o..*.o*\n"
882"*o*o..*.o*..*X*.\n"
883".*o...***..***..\n"
884"*.........*.*.*.\n"
885".*********..*..*\n"
886"\n"
887"****************\n"
888"*......*......X*\n"
889"*..*oo.....oo.**\n"
890"**...o...**...o*\n"
891"*o....*o*oo..***\n"
892"**.**....**....*\n"
893"*o..o*.o....x.o*\n"
894"**o***....*...**\n"
895"***************.\n"
896"\n"
897"**.....**..****.\n"
898"*X*****o.***.o**\n"
899"*....oo.....o..*\n"
900"*.**..**o..*o*.*\n"
901"*.*.o.*.*o.**..*\n"
902"*.**..**...*x*.*\n"
903"*.....o........*\n"
904"*........o.....*\n"
905"****************\n"
906"\n"
907".**************.\n"
908"*.X*........o.**\n"
909"*.*...*o...o**.*\n"
910"*.......o....*.*\n"
911"*.o..........*o*\n"
912"*.*......o.....*\n"
913"**......o.o..*o*\n"
914"*x..*....o.*.*.*\n"
915".**************.\n"
916"\n"
917"****************\n"
918"*o*o........o*o*\n"
919"*.o*X......**..*\n"
920"*.x........o...*\n"
921"*........o*....*\n"
922"*......o.......*\n"
923"*.o*........*..*\n"
924"*o*o........o*o*\n"
925"****************\n"
926"\n"
927".******.********\n"
928"*.....o*.....o.*\n"
929"*.*.o.*..*...o.*\n"
930"*..X*...*oo.*o.*\n"
931".*.*...*.o..x*.*\n"
932"*o.......*..*o.*\n"
933".*......o.....*.\n"
934"*o............o*\n"
935"****************\n"
936"\n"
937"****************\n"
938"**.x*o.o......o*\n"
939"*o.Xo*o.......**\n"
940"**.***........**\n"
941"**.....o*o*....*\n"
942"*oo.......o*o..*\n"
943"**.o....****o..*\n"
944"**o*..*........*\n"
945"****************\n"
946"\n"
947"****************\n"
948"*.o*........*X.*\n"
949"*.*..o*oo*o..*.*\n"
950"*....*o**o*.o..*\n"
951"*.o*.......o*..*\n"
952"*..o*o....o*...*\n"
953"*.*..*.**o*..*.*\n"
954"*....o.*o...x..*\n"
955"****************\n"
956"\n"
957"****************\n"
958"*.o....o..x*...*\n"
959"*..*o*o...*o...*\n"
960"*...*o*....*o..*\n"
961"*...o..*...o*o.*\n"
962"*.*o*...*.o*...*\n"
963"*.o*o.*.o.*....*\n"
964"*o*X..*.....*..*\n"
965"****************\n"
966"\n"
967"****************\n"
968"*o...**.....**o*\n"
969"*.*..*......*o.*\n"
970"*.o*...o**..o..*\n"
971"*.*....*o......*\n"
972"*....*...o*....*\n"
973"*.**.o*.**o..*x*\n"
974"*.o*.*o.....**X*\n"
975"****************\n"
976"\n"
977"****************\n"
978"*...o*o........*\n"
979"**o..o*.**o...**\n"
980"*.*.*.o...*..*.*\n"
981"*.x.*..**..*.Xo*\n"
982"*.*..*...o.*.*.*\n"
983"**...o**.*o..o**\n"
984"*........o*o...*\n"
985"****************";
986
987/**
988 * Do a pretty transition from one level to another.
989 */
990static void star_transition_update(void)
991{
992 const int center_x = LCD_WIDTH / 2;
993 const int center_y = LCD_HEIGHT / 2;
994 int x = 0;
995 int y = 0;
996#if LCD_WIDTH >= LCD_HEIGHT
997#if defined(IPOD_VIDEO)
998 const int step = 4;
999#else
1000 const int step = 1;
1001#endif
1002 const int lcd_demi_width = LCD_WIDTH / 2;
1003 int var_y = 0;
1004
1005 for (; x < lcd_demi_width ; x+=step)
1006 {
1007 var_y += LCD_HEIGHT;
1008 if (var_y > LCD_WIDTH)
1009 {
1010 var_y -= LCD_WIDTH;
1011 y+=step;
1012 }
1013 if( x )
1014 {
1015 rb->lcd_update_rect(center_x - x, center_y - y, x*2, step);
1016 rb->lcd_update_rect(center_x - x, center_y + y - step, x*2, step);
1017 }
1018 if( y )
1019 {
1020 rb->lcd_update_rect(center_x - x, center_y - y, step, y*2);
1021 rb->lcd_update_rect(center_x + x - step, center_y - y, step, y*2);
1022 }
1023 STAR_SLEEP
1024 }
1025#else
1026 int lcd_demi_height = LCD_HEIGHT / 2;
1027 int var_x = 0;
1028
1029 for (; y < lcd_demi_height ; y++)
1030 {
1031 var_x += LCD_WIDTH;
1032 if (var_x > LCD_HEIGHT)
1033 {
1034 var_x -= LCD_HEIGHT;
1035 x++;
1036 }
1037 if( x )
1038 {
1039 rb->lcd_update_rect(center_x - x, center_y - y, x * 2, 1);
1040 rb->lcd_update_rect(center_x - x, center_y + y - 1, x * 2, 1);
1041 }
1042 if( y )
1043 {
1044 rb->lcd_update_rect(center_x - x, center_y - y, 1, y * 2);
1045 rb->lcd_update_rect(center_x + x - 1, center_y - y, 1, y * 2);
1046 }
1047 STAR_SLEEP
1048 }
1049#endif
1050 rb->lcd_update();
1051}
1052
1053/**
1054 * Display information board of the current level.
1055 */
1056static void star_display_board_info(int current_level)
1057{
1058 int label_pos_y, tile_pos_y;
1059
1060 if (TILE_HEIGHT > char_height)
1061 {
1062 tile_pos_y = LCD_HEIGHT - TILE_HEIGHT;
1063 label_pos_y = tile_pos_y + (TILE_HEIGHT - char_height) / 2;
1064 }
1065 else
1066 {
1067 label_pos_y = LCD_HEIGHT - char_height;
1068 tile_pos_y = label_pos_y + (char_height - TILE_HEIGHT) / 2;
1069 }
1070
1071 rb->lcd_putsxyf(STAR_OFFSET_X, label_pos_y, "L:%02d", current_level + 1);
1072 rb->lcd_putsxyf(LCD_WIDTH/2 - 2 * char_width, label_pos_y, "S:%02d",
1073 star_count);
1074 rb->lcd_putsxy(STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH - 2 * char_width,
1075 label_pos_y, "C:");
1076
1077 rb->lcd_bitmap_part(star_tiles, 0, control == STAR_CONTROL_BALL ?
1078 BALL*TILE_HEIGHT : BLOCK*TILE_HEIGHT,
1079 STRIDE( SCREEN_MAIN,
1080 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
1081 STAR_OFFSET_X + (STAR_WIDTH-1) * TILE_WIDTH,
1082 tile_pos_y, TILE_WIDTH, TILE_HEIGHT);
1083
1084 rb->lcd_update_rect(0, MIN(label_pos_y, tile_pos_y), LCD_WIDTH,
1085 MAX(TILE_HEIGHT, char_height));
1086}
1087
1088
1089/**
1090 * Load a level into board array.
1091 */
1092static int star_load_level(int current_level)
1093{
1094 int x, y;
1095 char *ptr_tab;
1096
1097 if (current_level < 0)
1098 current_level = 0;
1099 else if (current_level > STAR_LEVEL_COUNT-1)
1100 current_level = STAR_LEVEL_COUNT-1;
1101
1102
1103 ptr_tab = levels + current_level * STAR_LEVEL_SIZE;
1104 control = STAR_CONTROL_BALL;
1105 star_count = 0;
1106
1107 rb->lcd_clear_display();
1108
1109 for (y = 0 ; y < STAR_HEIGHT ; y++)
1110 {
1111 for (x = 0 ; x < STAR_WIDTH ; x++)
1112 {
1113 board[y][x] = *ptr_tab;
1114 switch (*ptr_tab)
1115 {
1116# define DRAW_TILE( a ) \
1117 rb->lcd_bitmap_part( star_tiles, 0, \
1118 a*TILE_HEIGHT, \
1119 STRIDE( SCREEN_MAIN, \
1120 BMPWIDTH_star_tiles, \
1121 BMPHEIGHT_star_tiles), \
1122 STAR_OFFSET_X + x * TILE_WIDTH, \
1123 STAR_OFFSET_Y + y * TILE_HEIGHT, \
1124 TILE_WIDTH, TILE_HEIGHT);
1125
1126 case STAR_VOID:
1127 DRAW_TILE( SPACE );
1128 break;
1129
1130 case STAR_WALL:
1131 DRAW_TILE( WALL );
1132 break;
1133
1134 case STAR_STAR:
1135 DRAW_TILE( STAR );
1136 star_count++;
1137 break;
1138
1139 case STAR_BALL:
1140 ball_x = x;
1141 ball_y = y;
1142 DRAW_TILE( BALL );
1143 break;
1144
1145
1146 case STAR_BLOCK:
1147 block_x = x;
1148 block_y = y;
1149 DRAW_TILE( BLOCK );
1150 break;
1151 }
1152 ptr_tab++;
1153 }
1154 ptr_tab++;
1155 }
1156 star_display_board_info(current_level);
1157 star_transition_update();
1158 return 1;
1159}
1160
1161static void star_animate_tile(int tile_no, int start_x, int start_y,
1162 int delta_x, int delta_y)
1163{
1164 int i;
1165
1166 if (delta_x != 0) /* horizontal */
1167 {
1168 for (i = 1 ; i <= TILE_WIDTH ; i++)
1169 {
1170 STAR_SLEEP
1171 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT,
1172 STRIDE( SCREEN_MAIN,
1173 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
1174 start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
1175 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT,
1176 STRIDE( SCREEN_MAIN,
1177 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
1178 start_x + delta_x * i, start_y, TILE_WIDTH, TILE_HEIGHT);
1179 rb->lcd_update_rect(start_x + delta_x * i - (delta_x>0?1:0),
1180 start_y, TILE_WIDTH + 1, TILE_HEIGHT);
1181 }
1182 }
1183 else /* vertical */
1184 {
1185 for (i = 1 ; i <= TILE_HEIGHT ; i++)
1186 {
1187 STAR_SLEEP
1188 rb->lcd_bitmap_part(star_tiles, 0, SPACE * TILE_HEIGHT,
1189 STRIDE( SCREEN_MAIN,
1190 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
1191 start_x, start_y, TILE_WIDTH, TILE_HEIGHT);
1192 rb->lcd_bitmap_part(star_tiles, 0, tile_no * TILE_HEIGHT,
1193 STRIDE( SCREEN_MAIN,
1194 BMPWIDTH_star_tiles, BMPHEIGHT_star_tiles),
1195 start_x, start_y + delta_y * i, TILE_WIDTH, TILE_HEIGHT);
1196 rb->lcd_update_rect(start_x, start_y + delta_y * i - (delta_y>0?1:0),
1197 TILE_WIDTH, TILE_HEIGHT + 1);
1198 }
1199 }
1200}
1201
1202/**
1203 * Run the game.
1204 */
1205static int star_run_game(int current_level)
1206{
1207 int move_x = 0;
1208 int move_y = 0;
1209 int key;
1210#if defined(STAR_LEVEL_DOWN_PRE) || \
1211 defined(STAR_LEVEL_UP_PRE) || \
1212 defined(STAR_TOGGLE_CONTROL_PRE)
1213 int lastkey = BUTTON_NONE;
1214#endif
1215
1216 if (!star_load_level(current_level))
1217 return 0;
1218
1219 while (true)
1220 {
1221 move_x = 0;
1222 move_y = 0;
1223
1224 while ((move_x == 0) && (move_y == 0))
1225 {
1226 key = rb->button_get(true);
1227 switch (key)
1228 {
1229#ifdef STAR_RC_QUIT
1230 case STAR_RC_QUIT:
1231#endif
1232 case STAR_QUIT:
1233 return -1;
1234
1235 case STAR_LEFT:
1236 move_x = -1;
1237 break;
1238
1239 case STAR_RIGHT:
1240 move_x = 1;
1241 break;
1242
1243 case STAR_UP:
1244 move_y = -1;
1245 break;
1246
1247 case STAR_DOWN:
1248 move_y = 1;
1249 break;
1250
1251 case STAR_LEVEL_DOWN:
1252#ifdef STAR_LEVEL_DOWN_PRE
1253 if (lastkey != STAR_LEVEL_DOWN_PRE)
1254 break;
1255#endif
1256 if (current_level > 0)
1257 {
1258 current_level--;
1259 star_load_level(current_level);
1260 }
1261 break;
1262
1263 case STAR_LEVEL_REPEAT:
1264 star_load_level(current_level);
1265 break;
1266
1267 case STAR_LEVEL_UP:
1268#ifdef STAR_LEVEL_UP_PRE
1269 if (lastkey != STAR_LEVEL_UP_PRE)
1270 break;
1271#endif
1272 if (current_level < STAR_LEVEL_COUNT - 1)
1273 {
1274 current_level++;
1275 star_load_level(current_level);
1276 }
1277 break;
1278
1279 case STAR_TOGGLE_CONTROL:
1280#ifdef STAR_TOGGLE_CONTROL_PRE
1281 if (lastkey != STAR_TOGGLE_CONTROL_PRE)
1282 break;
1283#endif
1284#ifdef STAR_TOGGLE_CONTROL2
1285 case STAR_TOGGLE_CONTROL2:
1286#endif
1287 if (control == STAR_CONTROL_BALL)
1288 control = STAR_CONTROL_BLOCK;
1289 else
1290 control = STAR_CONTROL_BALL;
1291 star_display_board_info(current_level);
1292 break;
1293
1294 default:
1295 if (rb->default_event_handler(key) == SYS_USB_CONNECTED)
1296 {
1297 usb_detected = true;
1298 return 0;
1299 }
1300 break;
1301 }
1302#if defined(STAR_LEVEL_DOWN_PRE) || \
1303 defined(STAR_LEVEL_UP_PRE) || \
1304 defined(STAR_TOGGLE_CONTROL_PRE)
1305 if (key != BUTTON_NONE)
1306 lastkey = key;
1307#endif
1308 }
1309
1310 if (control == STAR_CONTROL_BALL)
1311 {
1312 board[ball_y][ball_x] = STAR_VOID;
1313 while ((board[ball_y + move_y][ball_x + move_x] == STAR_VOID
1314 || board[ball_y + move_y][ball_x + move_x] == STAR_STAR))
1315
1316 {
1317 star_animate_tile(BALL, STAR_OFFSET_X + ball_x * TILE_WIDTH,
1318 STAR_OFFSET_Y + ball_y * TILE_HEIGHT,
1319 move_x, move_y);
1320 ball_x += move_x;
1321 ball_y += move_y;
1322
1323 if (board[ball_y][ball_x] == STAR_STAR)
1324 {
1325 board[ball_y][ball_x] = STAR_VOID;
1326 star_count--;
1327
1328 star_display_board_info(current_level);
1329 }
1330 }
1331 board[ball_y][ball_x] = STAR_BALL;
1332 }
1333 else
1334 {
1335 board[block_y][block_x] = STAR_VOID;
1336 while (board[block_y + move_y][block_x + move_x] == STAR_VOID)
1337 {
1338 star_animate_tile(BLOCK, STAR_OFFSET_X + block_x * TILE_WIDTH,
1339 STAR_OFFSET_Y + block_y * TILE_HEIGHT,
1340 move_x, move_y);
1341 block_x += move_x;
1342 block_y += move_y;
1343 }
1344 board[block_y][block_x] = STAR_BLOCK;
1345 }
1346
1347 if (star_count == 0)
1348 {
1349 current_level++;
1350 if (current_level == STAR_LEVEL_COUNT)
1351 {
1352 rb->lcd_clear_display();
1353 rb->splash(HZ*2, "Congratulations!");
1354 rb->lcd_update();
1355
1356 /* There is no such level as STAR_LEVEL_COUNT so it can't be the
1357 * current_level */
1358 current_level--;
1359 return 1;
1360 }
1361 star_load_level(current_level);
1362 }
1363 }
1364}
1365
1366/**
1367 * Display help text.
1368 */
1369static bool star_help(void)
1370{
1371 static char* help_text[] = {
1372 "Star", "", "Aim", "",
1373 "Take", "all", "the", "stars", "to", "go", "to", "the", "next", "level.",
1374 "You", "can", "toggle", "control", "with", "the", "block", "to", "use",
1375 "it", "as", "a", "mobile", "wall.", "The", "block", "cannot", "take",
1376 "stars.", "", "",
1377 "Controls", "",
1378 STAR_TOGGLE_CONTROL_NAME":", "Toggle", "control", "",
1379 STAR_QUIT_NAME":", "Exit", "",
1380 STAR_LEVEL_DOWN_NAME":", "Prev.", "level", "",
1381 STAR_LEVEL_REPEAT_NAME":", "Reset", "level", "",
1382 STAR_LEVEL_UP_NAME":", "Next", "level"
1383 };
1384 static struct style_text formation[]={
1385 { 0, TEXT_CENTER|TEXT_UNDERLINE },
1386 { 2, C_RED },
1387 { 35, C_RED },
1388 LAST_STYLE_ITEM
1389 };
1390#if LCD_DEPTH > 1 && !defined(HAVE_LCD_COLOR)
1391 rb->lcd_set_background(LCD_WHITE);
1392 rb->lcd_set_foreground(LCD_BLACK);
1393#endif
1394 if (display_text(ARRAYLEN(help_text), help_text, formation, NULL, true))
1395 return true;
1396#if LCD_DEPTH > 1 && !defined(HAVE_LCD_COLOR)
1397 rb->lcd_set_background(LCD_BLACK);
1398 rb->lcd_set_foreground(LCD_WHITE);
1399#endif
1400 return false;
1401}
1402
1403/**
1404 * Display the choice menu.
1405 */
1406static int star_menu(void)
1407{
1408 int selection, level=1;
1409 bool menu_quit = false;
1410
1411 MENUITEM_STRINGLIST(menu, "Star Menu", NULL,
1412 "Start Game","Choose Level",
1413 "Help", "Playback Control", "Quit");
1414
1415 while(!menu_quit)
1416 {
1417 switch(rb->do_menu(&menu, &selection, NULL, false))
1418 {
1419 case 0:
1420 /* use system font and get the size of char */
1421 rb->lcd_setfont(FONT_SYSFIXED);
1422 rb->lcd_getstringsize("a", &char_width, &char_height);
1423 star_run_game(level-1);
1424 rb->lcd_setfont(FONT_UI);
1425 break;
1426 case 1:
1427 rb->set_int("Level", "", UNIT_INT, &level,
1428 NULL, 1, 1, STAR_LEVEL_COUNT, NULL );
1429 break;
1430 case 2:
1431 if(star_help())
1432 usb_detected = true;
1433 break;
1434 case 3:
1435 playback_control(NULL);
1436 break;
1437 case 4:
1438 menu_quit = true;
1439 break;
1440 }
1441 if(usb_detected)
1442 return PLUGIN_USB_CONNECTED;
1443 }
1444
1445 return PLUGIN_OK;
1446}
1447
1448/**
1449 * Main entry point
1450 */
1451enum plugin_status plugin_start(const void* parameter)
1452{
1453 (void)parameter;
1454
1455#if LCD_DEPTH > 1
1456 rb->lcd_set_backdrop(NULL);
1457 rb->lcd_set_background( LCD_BLACK );
1458 rb->lcd_set_foreground( LCD_WHITE );
1459#endif
1460
1461 /* display choice menu */
1462 return star_menu();
1463}