1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
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 ****************************************************************************/
22 #ifdef HAVE_LCD_BITMAP
26 /* size of a level in file */
27 #define STAR_LEVEL_SIZE ((STAR_WIDTH + 1) * STAR_HEIGHT + 1)
29 /* size of the game board */
34 #define STAR_LEVEL_COUNT 20
36 /* values of object in the board */
41 #define STAR_BLOCK 'x'
43 /* sleep time between two frames */
44 #if (LCD_HEIGHT * LCD_WIDTH >= 70000) && defined(IPOD_ARCH)
45 /* iPod 5G LCD is *slow* */
46 #define STAR_SLEEP rb->yield();
47 #elif (LCD_HEIGHT * LCD_WIDTH >= 30000)
48 #define STAR_SLEEP rb->sleep(0);
50 #define STAR_SLEEP rb->sleep(1);
53 /* value of ball and block control */
54 #define STAR_CONTROL_BALL 0
55 #define STAR_CONTROL_BLOCK 1
57 /* variable button definitions */
58 #if CONFIG_KEYPAD == RECORDER_PAD
59 #define STAR_QUIT BUTTON_OFF
60 #define STAR_LEFT BUTTON_LEFT
61 #define STAR_RIGHT BUTTON_RIGHT
62 #define STAR_UP BUTTON_UP
63 #define STAR_DOWN BUTTON_DOWN
64 #define STAR_TOGGLE_CONTROL BUTTON_ON
65 #define STAR_TOGGLE_CONTROL2 BUTTON_PLAY
66 #define STAR_LEVEL_UP BUTTON_F3
67 #define STAR_LEVEL_DOWN BUTTON_F1
68 #define STAR_LEVEL_REPEAT BUTTON_F2
69 #define STAR_MENU_RUN BUTTON_PLAY
70 #define STAR_MENU_RUN2 BUTTON_RIGHT
71 #define STAR_MENU_RUN3 BUTTON_ON
73 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
74 #define STAR_QUIT BUTTON_OFF
75 #define STAR_LEFT BUTTON_LEFT
76 #define STAR_RIGHT BUTTON_RIGHT
77 #define STAR_UP BUTTON_UP
78 #define STAR_DOWN BUTTON_DOWN
79 #define STAR_TOGGLE_CONTROL BUTTON_ON
80 #define STAR_TOGGLE_CONTROL2 BUTTON_SELECT
81 #define STAR_LEVEL_UP BUTTON_F3
82 #define STAR_LEVEL_DOWN BUTTON_F1
83 #define STAR_LEVEL_REPEAT BUTTON_F2
84 #define STAR_MENU_RUN BUTTON_SELECT
85 #define STAR_MENU_RUN2 BUTTON_RIGHT
86 #define STAR_MENU_RUN3 BUTTON_ON
88 #elif CONFIG_KEYPAD == ONDIO_PAD
89 #define STAR_QUIT BUTTON_OFF
90 #define STAR_LEFT BUTTON_LEFT
91 #define STAR_RIGHT BUTTON_RIGHT
92 #define STAR_UP BUTTON_UP
93 #define STAR_DOWN BUTTON_DOWN
94 #define STAR_TOGGLE_CONTROL_PRE BUTTON_MENU
95 #define STAR_TOGGLE_CONTROL (BUTTON_MENU | BUTTON_REL)
96 #define STAR_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT)
97 #define STAR_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT)
98 #define STAR_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP)
99 #define STAR_MENU_RUN BUTTON_RIGHT
101 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
102 (CONFIG_KEYPAD == IRIVER_H300_PAD)
103 #define STAR_QUIT BUTTON_OFF
104 #define STAR_LEFT BUTTON_LEFT
105 #define STAR_RIGHT BUTTON_RIGHT
106 #define STAR_UP BUTTON_UP
107 #define STAR_DOWN BUTTON_DOWN
108 #define STAR_TOGGLE_CONTROL BUTTON_MODE
109 #define STAR_TOGGLE_CONTROL2 BUTTON_SELECT
110 #define STAR_LEVEL_UP (BUTTON_ON | BUTTON_RIGHT)
111 #define STAR_LEVEL_DOWN (BUTTON_ON | BUTTON_LEFT)
112 #define STAR_LEVEL_REPEAT (BUTTON_ON | BUTTON_SELECT)
113 #define STAR_MENU_RUN BUTTON_RIGHT
114 #define STAR_MENU_RUN2 BUTTON_SELECT
116 #define STAR_RC_QUIT BUTTON_RC_STOP
117 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
118 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
119 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
121 #define STAR_QUIT (BUTTON_SELECT | BUTTON_MENU)
122 #define STAR_LEFT BUTTON_LEFT
123 #define STAR_RIGHT BUTTON_RIGHT
124 #define STAR_UP BUTTON_MENU
125 #define STAR_DOWN BUTTON_PLAY
126 #define STAR_TOGGLE_CONTROL_PRE BUTTON_SELECT
127 #define STAR_TOGGLE_CONTROL (BUTTON_SELECT | BUTTON_REL)
128 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
129 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
130 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_PLAY)
131 #define STAR_MENU_RUN BUTTON_RIGHT
132 #define STAR_MENU_RUN2 BUTTON_SELECT
134 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
136 #define STAR_QUIT BUTTON_POWER
137 #define STAR_LEFT BUTTON_LEFT
138 #define STAR_RIGHT BUTTON_RIGHT
139 #define STAR_UP BUTTON_UP
140 #define STAR_DOWN BUTTON_DOWN
141 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
142 #define STAR_LEVEL_UP_PRE BUTTON_REC
143 #define STAR_LEVEL_UP (BUTTON_REC|BUTTON_REL)
144 #define STAR_LEVEL_DOWN_PRE BUTTON_REC
145 #define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_REPEAT)
146 #define STAR_LEVEL_REPEAT BUTTON_PLAY
147 #define STAR_MENU_RUN BUTTON_RIGHT
148 #define STAR_MENU_RUN2 BUTTON_SELECT
150 #elif (CONFIG_KEYPAD == GIGABEAT_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 BUTTON_VOL_UP
159 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
160 #define STAR_LEVEL_REPEAT BUTTON_A
161 #define STAR_MENU_RUN BUTTON_SELECT
164 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
165 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
166 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
167 (CONFIG_KEYPAD == SANSA_M200_PAD)
169 #define STAR_QUIT BUTTON_POWER
170 #define STAR_LEFT BUTTON_LEFT
171 #define STAR_RIGHT BUTTON_RIGHT
172 #define STAR_UP BUTTON_UP
173 #define STAR_DOWN BUTTON_DOWN
174 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
175 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
176 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
177 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
178 #define STAR_MENU_RUN BUTTON_SELECT
181 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
183 #define STAR_QUIT (BUTTON_HOME|BUTTON_REPEAT)
184 #define STAR_LEFT BUTTON_LEFT
185 #define STAR_RIGHT BUTTON_RIGHT
186 #define STAR_UP BUTTON_UP
187 #define STAR_DOWN BUTTON_DOWN
188 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
189 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
190 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
191 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
192 #define STAR_MENU_RUN BUTTON_SELECT
195 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
197 #define STAR_QUIT BUTTON_POWER
198 #define STAR_LEFT BUTTON_LEFT
199 #define STAR_RIGHT BUTTON_RIGHT
200 #define STAR_UP BUTTON_SCROLL_UP
201 #define STAR_DOWN BUTTON_SCROLL_DOWN
202 #define STAR_TOGGLE_CONTROL BUTTON_REW
203 #define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP)
204 #define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN)
205 #define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT)
206 #define STAR_MENU_RUN BUTTON_FF
208 #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
210 #define STAR_QUIT BUTTON_BACK
211 #define STAR_LEFT BUTTON_LEFT
212 #define STAR_RIGHT BUTTON_RIGHT
213 #define STAR_UP BUTTON_UP
214 #define STAR_DOWN BUTTON_DOWN
215 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
216 #define STAR_LEVEL_UP BUTTON_VOL_UP
217 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
218 #define STAR_LEVEL_REPEAT BUTTON_MENU
219 #define STAR_MENU_RUN BUTTON_SELECT
221 #elif (CONFIG_KEYPAD == MROBE100_PAD)
223 #define STAR_QUIT BUTTON_POWER
224 #define STAR_LEFT BUTTON_LEFT
225 #define STAR_RIGHT BUTTON_RIGHT
226 #define STAR_UP BUTTON_UP
227 #define STAR_DOWN BUTTON_DOWN
228 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
229 #define STAR_LEVEL_UP BUTTON_PLAY
230 #define STAR_LEVEL_DOWN BUTTON_MENU
231 #define STAR_LEVEL_REPEAT BUTTON_DISPLAY
232 #define STAR_MENU_RUN BUTTON_SELECT
234 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
236 #define STAR_QUIT BUTTON_RC_REC
237 #define STAR_LEFT BUTTON_RC_REW
238 #define STAR_RIGHT BUTTON_RC_FF
239 #define STAR_UP BUTTON_RC_VOL_UP
240 #define STAR_DOWN BUTTON_RC_VOL_DOWN
241 #define STAR_TOGGLE_CONTROL BUTTON_RC_MODE
242 #define STAR_LEVEL_UP (BUTTON_RC_PLAY|BUTTON_RC_VOL_UP)
243 #define STAR_LEVEL_DOWN (BUTTON_RC_PLAY|BUTTON_RC_VOL_DOWN)
244 #define STAR_LEVEL_REPEAT (BUTTON_RC_PLAY|BUTTON_RC_MENU)
245 #define STAR_MENU_RUN BUTTON_RC_FF
247 #elif (CONFIG_KEYPAD == COWOND2_PAD)
249 #define STAR_QUIT BUTTON_POWER
250 #define STAR_QUIT_NAME "[POWER]"
251 #define STAR_MENU_RUN BUTTON_MENU
253 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
255 #define STAR_QUIT BUTTON_BACK
256 #define STAR_LEFT BUTTON_LEFT
257 #define STAR_RIGHT BUTTON_RIGHT
258 #define STAR_UP BUTTON_UP
259 #define STAR_DOWN BUTTON_DOWN
260 #define STAR_TOGGLE_CONTROL BUTTON_PLAY
261 #define STAR_LEVEL_UP (BUTTON_CUSTOM | BUTTON_UP)
262 #define STAR_LEVEL_DOWN (BUTTON_CUSTOM | BUTTON_DOWN)
263 #define STAR_LEVEL_REPEAT (BUTTON_CUSTOM | BUTTON_RIGHT)
264 #define STAR_MENU_RUN BUTTON_MENU
266 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
268 #define STAR_QUIT BUTTON_POWER
269 #define STAR_LEFT BUTTON_LEFT
270 #define STAR_RIGHT BUTTON_RIGHT
271 #define STAR_UP BUTTON_UP
272 #define STAR_DOWN BUTTON_DOWN
273 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
274 #define STAR_LEVEL_UP BUTTON_VOL_UP
275 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
276 #define STAR_LEVEL_REPEAT BUTTON_VIEW
277 #define STAR_MENU_RUN BUTTON_MENU
279 #elif (CONFIG_KEYPAD == ONDAVX747_PAD)
281 #define STAR_QUIT BUTTON_POWER
282 #define STAR_QUIT_NAME "[POWER]"
283 #define STAR_MENU_RUN BUTTON_MENU
285 #elif CONFIG_KEYPAD == MROBE500_PAD
286 #define STAR_QUIT BUTTON_POWER
287 #define STAR_QUIT_NAME "[POWER]"
290 #error No keymap defined!
293 #ifdef HAVE_TOUCHSCREEN
295 //#define STAR_QUIT BUTTON_TOPLEFT
296 //#define STAR_QUIT_NAME "[TOPLEFT]"
298 #ifndef STAR_MENU_RUN
299 #define STAR_MENU_RUN BUTTON_TOPRIGHT
302 #define STAR_LEFT BUTTON_MIDLEFT
305 #define STAR_RIGHT BUTTON_MIDRIGHT
308 #define STAR_UP BUTTON_TOPMIDDLE
311 #define STAR_DOWN BUTTON_BOTTOMMIDDLE
313 #ifndef STAR_TOGGLE_CONTROL
314 #define STAR_TOGGLE_CONTROL BUTTON_CENTER
315 #define STAR_TOGGLE_CONTROL_NAME "[CENTER]"
317 #ifndef STAR_LEVEL_UP
318 #define STAR_LEVEL_UP BUTTON_TOPLEFT
319 #define STAR_LEVEL_UP_NAME "[TOPLEFT]"
321 #ifndef STAR_LEVEL_DOWN
322 #define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT
323 #define STAR_LEVEL_DOWN_NAME "[BOTTOMLEFT]"
325 #ifndef STAR_LEVEL_REPEAT
326 #define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT
327 #define STAR_LEVEL_REPEAT_NAME "[BOTTOMRIGHT]"
331 /* function returns because of USB? */
332 static bool usb_detected
= false;
334 /* position of the ball */
335 static int ball_x
, ball_y
;
337 /* position of the block */
338 static int block_x
, block_y
;
340 /* number of stars to get to finish the level */
341 static int star_count
;
343 /* the object we control : ball or block */
346 /* the current board */
347 static char board
[STAR_HEIGHT
][STAR_WIDTH
];
349 #include "pluginbitmaps/star_tiles.h"
351 #define TILE_WIDTH BMPWIDTH_star_tiles
352 #define TILE_HEIGHT (BMPHEIGHT_star_tiles/5)
353 #define STAR_OFFSET_X ((LCD_WIDTH - STAR_WIDTH * TILE_WIDTH) / 2)
354 #define STAR_OFFSET_Y ((LCD_HEIGHT - STAR_HEIGHT * TILE_HEIGHT - MAX(TILE_HEIGHT, 8)) / 2)
365 static int char_width
= -1;
366 static int char_height
= -1;
368 /* this arrays contains a group of levels loaded into memory */
369 static unsigned char* levels
=
573 void star_display_text(char *str
, bool waitkey
)
578 int current_line
= 0;
579 int first_char_index
= 0;
587 rb
->lcd_clear_display();
589 chars_by_line
= LCD_WIDTH
/ char_width
;
590 lines_by_screen
= LCD_HEIGHT
/ char_height
;
594 ptr_char
= str
+ first_char_index
;
598 while (i
< chars_by_line
)
611 *(ptr_line
++) = *ptr_char
;
613 if (*ptr_char
== '\n' || *ptr_char
== '\0')
619 if (chars_for_line
== 0)
622 line
[chars_for_line
] = '\0';
624 /* test if we have cut a word. If it is the case we don't have to */
626 if (i
== chars_by_line
&& chars_for_line
== chars_by_line
)
627 first_char_index
+= chars_for_line
;
629 first_char_index
+= chars_for_line
+ 1;
631 /* print the line on the screen */
632 rb
->lcd_putsxy(0, current_line
* char_height
, line
);
634 /* if the number of line showed on the screen is equals to the */
635 /* maximum number of line we can show, we wait for a key pressed to */
636 /* clear and show the remaining text. */
638 if (current_line
== lines_by_screen
|| *ptr_char
== '\0')
643 while (waitkey
&& !go_on
)
645 key
= rb
->button_get(true);
655 if (rb
->default_event_handler(key
) == SYS_USB_CONNECTED
)
663 rb
->lcd_clear_display();
665 } while (*ptr_char
!= '\0');
669 * Do a pretty transition from one level to another.
671 static void star_transition_update(void)
673 const int center_x
= LCD_WIDTH
/ 2;
674 const int center_y
= LCD_HEIGHT
/ 2;
677 #if LCD_WIDTH >= LCD_HEIGHT
678 #if defined(IPOD_VIDEO)
683 const int lcd_demi_width
= LCD_WIDTH
/ 2;
686 for (; x
< lcd_demi_width
; x
+=step
)
689 if (var_y
> LCD_WIDTH
)
696 rb
->lcd_update_rect(center_x
- x
, center_y
- y
, x
*2, step
);
697 rb
->lcd_update_rect(center_x
- x
, center_y
+ y
- step
, x
*2, step
);
701 rb
->lcd_update_rect(center_x
- x
, center_y
- y
, step
, y
*2);
702 rb
->lcd_update_rect(center_x
+ x
- step
, center_y
- y
, step
, y
*2);
707 int lcd_demi_height
= LCD_HEIGHT
/ 2;
710 for (; y
< lcd_demi_height
; y
++)
713 if (var_x
> LCD_HEIGHT
)
720 rb
->lcd_update_rect(center_x
- x
, center_y
- y
, x
* 2, 1);
721 rb
->lcd_update_rect(center_x
- x
, center_y
+ y
- 1, x
* 2, 1);
725 rb
->lcd_update_rect(center_x
- x
, center_y
- y
, 1, y
* 2);
726 rb
->lcd_update_rect(center_x
+ x
- 1, center_y
- y
, 1, y
* 2);
735 * Display information board of the current level.
737 static void star_display_board_info(int current_level
)
739 int label_pos_y
, tile_pos_y
;
742 if (TILE_HEIGHT
> char_height
)
744 tile_pos_y
= LCD_HEIGHT
- TILE_HEIGHT
;
745 label_pos_y
= tile_pos_y
+ (TILE_HEIGHT
- char_height
) / 2;
749 label_pos_y
= LCD_HEIGHT
- char_height
;
750 tile_pos_y
= label_pos_y
+ (char_height
- TILE_HEIGHT
) / 2;
753 rb
->snprintf(str_info
, sizeof(str_info
), "L:%02d", current_level
+ 1);
754 rb
->lcd_putsxy(STAR_OFFSET_X
, label_pos_y
, str_info
);
755 rb
->snprintf(str_info
, sizeof(str_info
), "S:%02d", star_count
);
756 rb
->lcd_putsxy(LCD_WIDTH
/2 - 2 * char_width
, label_pos_y
, str_info
);
757 rb
->lcd_putsxy(STAR_OFFSET_X
+ (STAR_WIDTH
-1) * TILE_WIDTH
- 2 * char_width
,
760 rb
->lcd_bitmap_part(star_tiles
, 0, control
== STAR_CONTROL_BALL
?
761 BALL
*TILE_HEIGHT
: BLOCK
*TILE_HEIGHT
, TILE_WIDTH
,
762 STAR_OFFSET_X
+ (STAR_WIDTH
-1) * TILE_WIDTH
,
763 tile_pos_y
, TILE_WIDTH
, TILE_HEIGHT
);
765 rb
->lcd_update_rect(0, MIN(label_pos_y
, tile_pos_y
), LCD_WIDTH
,
766 MAX(TILE_HEIGHT
, char_height
));
771 * Load a level into board array.
773 static int star_load_level(int current_level
)
778 if (current_level
< 0)
780 else if (current_level
> STAR_LEVEL_COUNT
-1)
781 current_level
= STAR_LEVEL_COUNT
-1;
784 ptr_tab
= levels
+ current_level
* STAR_LEVEL_SIZE
;
785 control
= STAR_CONTROL_BALL
;
788 rb
->lcd_clear_display();
790 for (y
= 0 ; y
< STAR_HEIGHT
; y
++)
792 for (x
= 0 ; x
< STAR_WIDTH
; x
++)
794 board
[y
][x
] = *ptr_tab
;
797 # define DRAW_TILE( a ) \
798 rb->lcd_bitmap_part( star_tiles, 0, \
799 a*TILE_HEIGHT, TILE_WIDTH, \
800 STAR_OFFSET_X + x * TILE_WIDTH, \
801 STAR_OFFSET_Y + y * TILE_HEIGHT, \
802 TILE_WIDTH, TILE_HEIGHT);
833 star_display_board_info(current_level
);
834 star_transition_update();
838 static void star_animate_tile(int tile_no
, int start_x
, int start_y
,
839 int delta_x
, int delta_y
)
843 if (delta_x
!= 0) /* horizontal */
845 for (i
= 1 ; i
<= TILE_WIDTH
; i
++)
848 rb
->lcd_bitmap_part(star_tiles
, 0, SPACE
* TILE_HEIGHT
, TILE_WIDTH
,
849 start_x
, start_y
, TILE_WIDTH
, TILE_HEIGHT
);
850 rb
->lcd_bitmap_part(star_tiles
, 0, tile_no
* TILE_HEIGHT
, TILE_WIDTH
,
851 start_x
+ delta_x
* i
, start_y
, TILE_WIDTH
, TILE_HEIGHT
);
852 rb
->lcd_update_rect(start_x
+ delta_x
* i
- (delta_x
>0?1:0),
853 start_y
, TILE_WIDTH
+ 1, TILE_HEIGHT
);
858 for (i
= 1 ; i
<= TILE_HEIGHT
; i
++)
861 rb
->lcd_bitmap_part(star_tiles
, 0, SPACE
* TILE_HEIGHT
, TILE_WIDTH
,
862 start_x
, start_y
, TILE_WIDTH
, TILE_HEIGHT
);
863 rb
->lcd_bitmap_part(star_tiles
, 0, tile_no
* TILE_HEIGHT
, TILE_WIDTH
,
864 start_x
, start_y
+ delta_y
* i
, TILE_WIDTH
, TILE_HEIGHT
);
865 rb
->lcd_update_rect(start_x
, start_y
+ delta_y
* i
- (delta_y
>0?1:0),
866 TILE_WIDTH
, TILE_HEIGHT
+ 1);
874 static int star_run_game(int current_level
)
879 int lastkey
= BUTTON_NONE
;
883 label_offset_y
= LCD_HEIGHT
- char_height
;
885 if (!star_load_level(current_level
))
893 while ((move_x
== 0) && (move_y
== 0))
895 key
= rb
->button_get(true);
920 case STAR_LEVEL_DOWN
:
921 #ifdef STAR_LEVEL_DOWN_PRE
922 if (lastkey
!= STAR_LEVEL_DOWN_PRE
)
925 if (current_level
> 0)
928 star_load_level(current_level
);
932 case STAR_LEVEL_REPEAT
:
933 star_load_level(current_level
);
937 #ifdef STAR_LEVEL_UP_PRE
938 if (lastkey
!= STAR_LEVEL_UP_PRE
)
941 if (current_level
< STAR_LEVEL_COUNT
- 1)
944 star_load_level(current_level
);
948 case STAR_TOGGLE_CONTROL
:
949 #ifdef STAR_TOGGLE_CONTROL_PRE
950 if (lastkey
!= STAR_TOGGLE_CONTROL_PRE
)
953 #ifdef STAR_TOGGLE_CONTROL2
954 case STAR_TOGGLE_CONTROL2
:
956 if (control
== STAR_CONTROL_BALL
)
957 control
= STAR_CONTROL_BLOCK
;
959 control
= STAR_CONTROL_BALL
;
960 star_display_board_info(current_level
);
964 if (rb
->default_event_handler(key
) == SYS_USB_CONNECTED
)
971 if (key
!= BUTTON_NONE
)
975 if (control
== STAR_CONTROL_BALL
)
977 board
[ball_y
][ball_x
] = STAR_VOID
;
978 while ((board
[ball_y
+ move_y
][ball_x
+ move_x
] == STAR_VOID
979 || board
[ball_y
+ move_y
][ball_x
+ move_x
] == STAR_STAR
))
982 star_animate_tile(BALL
, STAR_OFFSET_X
+ ball_x
* TILE_WIDTH
,
983 STAR_OFFSET_Y
+ ball_y
* TILE_HEIGHT
,
988 if (board
[ball_y
][ball_x
] == STAR_STAR
)
990 board
[ball_y
][ball_x
] = STAR_VOID
;
993 star_display_board_info(current_level
);
996 board
[ball_y
][ball_x
] = STAR_BALL
;
1000 board
[block_y
][block_x
] = STAR_VOID
;
1001 while (board
[block_y
+ move_y
][block_x
+ move_x
] == STAR_VOID
)
1003 star_animate_tile(BLOCK
, STAR_OFFSET_X
+ block_x
* TILE_WIDTH
,
1004 STAR_OFFSET_Y
+ block_y
* TILE_HEIGHT
,
1009 board
[block_y
][block_x
] = STAR_BLOCK
;
1012 if (star_count
== 0)
1015 if (current_level
== STAR_LEVEL_COUNT
)
1017 rb
->lcd_clear_display();
1018 star_display_text("Congratulations!", true);
1021 /* There is no such level as STAR_LEVEL_COUNT so it can't be the
1026 star_load_level(current_level
);
1032 * Display the choice menu.
1034 static int star_menu(void)
1036 int selection
, level
=1;
1037 bool menu_quit
= false;
1038 struct viewport vp
[NB_SCREENS
];
1039 /* get the size of char */
1040 rb
->lcd_getstringsize("a", &char_width
, &char_height
);
1042 MENUITEM_STRINGLIST(menu
,"Star Menu",NULL
,"Play","Choose Level",
1043 "Information","Keys","Quit");
1044 FOR_NB_SCREENS(selection
)
1046 rb
->viewport_set_defaults(&vp
[selection
], selection
);
1048 if (rb
->screens
[selection
]->depth
> 1)
1050 vp
->bg_pattern
= LCD_BLACK
;
1051 vp
->fg_pattern
= LCD_WHITE
;
1057 switch(rb
->do_menu(&menu
, &selection
, vp
, false))
1063 rb
->set_int("Level", "", UNIT_INT
, &level
,
1064 NULL
, 1, 1, STAR_LEVEL_COUNT
, NULL
);
1069 "Take all the stars to go to the next level. "
1070 "You can toggle control with the block to "
1071 "use it as a mobile wall. The block cannot "
1072 "take stars.", true);
1075 #if CONFIG_KEYPAD == RECORDER_PAD
1076 star_display_text("KEYS\n\n"
1077 "[ON] Toggle Ctl.\n"
1079 "[F1] Prev. level\n"
1080 "[F2] Reset level\n"
1081 "[F3] Next level", true);
1082 #elif CONFIG_KEYPAD == ONDIO_PAD
1083 star_display_text("KEYS\n\n"
1084 "[MODE] Toggle Ctl\n"
1086 "[M <] Prev. level\n"
1087 "[M ^] Reset level\n"
1088 "[M >] Next level", true);
1089 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
1090 star_display_text("KEYS\n\n"
1091 "[MODE/NAVI] Toggle Ctrl\n"
1093 "[ON + LEFT] Prev. level\n"
1094 "[ON + NAVI] Reset level\n"
1095 "[ON + RIGHT] Next level", true);
1096 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
1097 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
1098 star_display_text("KEYS\n\n"
1099 "[SELECT] Toggle Ctl\n"
1101 "[S <] Prev. level\n"
1102 "[S + PLAY] Reset level\n"
1103 "[S >] Next level", true);
1104 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
1105 star_display_text("KEYS\n\n"
1106 "[SELECT] Toggle Ctl\n"
1108 "[REC..] Prev. level\n"
1109 "[PLAY] Reset level\n"
1110 "[REC] Next level", true);
1111 #elif CONFIG_KEYPAD == GIGABEAT_PAD
1112 star_display_text("KEYS\n\n"
1113 "[SELECT] Toggle Control\n"
1115 "[VOL DOWN] Prev. level\n"
1117 "[VOL UP] Next level", true);
1118 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
1119 star_display_text("KEYS\n\n"
1120 "[REW] Toggle Ctl\n"
1122 "[PLAY+DOWN] Prev. level\n"
1123 "[PLAY+RIGHT] Reset level\n"
1124 "[PLAY+UP] Next level", true);
1125 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
1126 star_display_text("KEYS\n\n"
1127 "[SELECT] Toggle Control\n"
1129 "[VOL DOWN] Prev. level\n"
1130 "[MENU] Reset level\n"
1131 "[VOL UP] Next level", true);
1133 #ifdef HAVE_TOUCHSCREEN
1134 star_display_text("KEYS\n\n"
1135 STAR_TOGGLE_CONTROL_NAME
" Toggle Control\n"
1136 STAR_QUIT_NAME
" Exit\n"
1137 STAR_LEVEL_DOWN_NAME
" Prev. level\n"
1138 STAR_LEVEL_REPEAT_NAME
" Reset level\n"
1139 STAR_LEVEL_UP_NAME
" Next level", true);
1148 if (selection
== MENU_START
)
1150 rb
->lcd_setfont(FONT_SYSFIXED
);
1151 rb
->lcd_getstringsize("a", &char_width
, &char_height
);
1153 star_run_game(level
);
1161 enum plugin_status
plugin_start(const void* parameter
)
1166 rb
->lcd_set_backdrop(NULL
);
1167 rb
->lcd_set_background( LCD_BLACK
);
1168 rb
->lcd_set_foreground( LCD_WHITE
);
1171 /* display choice menu */