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
23 #include "lib/display_text.h"
27 /* size of a level in file */
28 #define STAR_LEVEL_SIZE ((STAR_WIDTH + 1) * STAR_HEIGHT + 1)
30 /* size of the game board */
35 #define STAR_LEVEL_COUNT 20
37 /* values of object in the board */
42 #define STAR_BLOCK 'x'
44 /* sleep time between two frames */
45 #if (LCD_HEIGHT * LCD_WIDTH >= 70000) && defined(IPOD_ARCH)
46 /* iPod 5G LCD is *slow* */
47 #define STAR_SLEEP rb->yield();
48 #elif (LCD_HEIGHT * LCD_WIDTH >= 30000)
49 #define STAR_SLEEP rb->sleep(0);
51 #define STAR_SLEEP rb->sleep(1);
54 /* value of ball and block control */
55 #define STAR_CONTROL_BALL 0
56 #define STAR_CONTROL_BLOCK 1
58 /* variable button definitions */
59 #if CONFIG_KEYPAD == RECORDER_PAD
60 #define STAR_QUIT BUTTON_OFF
61 #define STAR_LEFT BUTTON_LEFT
62 #define STAR_RIGHT BUTTON_RIGHT
63 #define STAR_UP BUTTON_UP
64 #define STAR_DOWN BUTTON_DOWN
65 #define STAR_TOGGLE_CONTROL BUTTON_ON
66 #define STAR_TOGGLE_CONTROL2 BUTTON_PLAY
67 #define STAR_LEVEL_UP BUTTON_F3
68 #define STAR_LEVEL_DOWN BUTTON_F1
69 #define STAR_LEVEL_REPEAT BUTTON_F2
70 #define STAR_TOGGLE_CONTROL_NAME "ON"
71 #define STAR_QUIT_NAME "OFF"
72 #define STAR_LEVEL_UP_NAME "F3"
73 #define STAR_LEVEL_DOWN_NAME "F1"
74 #define STAR_LEVEL_REPEAT_NAME "F2"
76 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
77 #define STAR_QUIT BUTTON_OFF
78 #define STAR_LEFT BUTTON_LEFT
79 #define STAR_RIGHT BUTTON_RIGHT
80 #define STAR_UP BUTTON_UP
81 #define STAR_DOWN BUTTON_DOWN
82 #define STAR_TOGGLE_CONTROL BUTTON_ON
83 #define STAR_TOGGLE_CONTROL2 BUTTON_SELECT
84 #define STAR_LEVEL_UP BUTTON_F3
85 #define STAR_LEVEL_DOWN BUTTON_F1
86 #define STAR_LEVEL_REPEAT BUTTON_F2
87 #define STAR_TOGGLE_CONTROL_NAME "ON/SELECT"
88 #define STAR_QUIT_NAME "OFF"
89 #define STAR_LEVEL_UP_NAME "F3"
90 #define STAR_LEVEL_DOWN_NAME "F1"
91 #define STAR_LEVEL_REPEAT_NAME "F2"
93 #elif CONFIG_KEYPAD == ONDIO_PAD
94 #define STAR_QUIT BUTTON_OFF
95 #define STAR_LEFT BUTTON_LEFT
96 #define STAR_RIGHT BUTTON_RIGHT
97 #define STAR_UP BUTTON_UP
98 #define STAR_DOWN BUTTON_DOWN
99 #define STAR_TOGGLE_CONTROL_PRE BUTTON_MENU
100 #define STAR_TOGGLE_CONTROL (BUTTON_MENU | BUTTON_REL)
101 #define STAR_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT)
102 #define STAR_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT)
103 #define STAR_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP)
104 #define STAR_TOGGLE_CONTROL_NAME "MODE"
105 #define STAR_QUIT_NAME "OFF"
106 #define STAR_LEVEL_UP_NAME "M >"
107 #define STAR_LEVEL_DOWN_NAME "M <"
108 #define STAR_LEVEL_REPEAT_NAME "M ^"
110 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
111 (CONFIG_KEYPAD == IRIVER_H300_PAD)
112 #define STAR_QUIT BUTTON_OFF
113 #define STAR_LEFT BUTTON_LEFT
114 #define STAR_RIGHT BUTTON_RIGHT
115 #define STAR_UP BUTTON_UP
116 #define STAR_DOWN BUTTON_DOWN
117 #define STAR_TOGGLE_CONTROL BUTTON_MODE
118 #define STAR_TOGGLE_CONTROL2 BUTTON_SELECT
119 #define STAR_LEVEL_UP (BUTTON_ON | BUTTON_RIGHT)
120 #define STAR_LEVEL_DOWN (BUTTON_ON | BUTTON_LEFT)
121 #define STAR_LEVEL_REPEAT (BUTTON_ON | BUTTON_SELECT)
122 #define STAR_TOGGLE_CONTROL_NAME "MODE/SELECT"
123 #define STAR_QUIT_NAME "OFF"
124 #define STAR_LEVEL_UP_NAME "ON + RIGHT"
125 #define STAR_LEVEL_DOWN_NAME "ON + LEFT"
126 #define STAR_LEVEL_REPEAT_NAME "ON + NAVI"
128 #define STAR_RC_QUIT BUTTON_RC_STOP
129 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
130 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
131 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
133 #define STAR_QUIT (BUTTON_SELECT | BUTTON_MENU)
134 #define STAR_LEFT BUTTON_LEFT
135 #define STAR_RIGHT BUTTON_RIGHT
136 #define STAR_UP BUTTON_MENU
137 #define STAR_DOWN BUTTON_PLAY
138 #define STAR_TOGGLE_CONTROL_PRE BUTTON_SELECT
139 #define STAR_TOGGLE_CONTROL (BUTTON_SELECT | BUTTON_REL)
140 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
141 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
142 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_PLAY)
143 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
144 #define STAR_QUIT_NAME "S + MENU"
145 #define STAR_LEVEL_UP_NAME "S >"
146 #define STAR_LEVEL_DOWN_NAME "S <"
147 #define STAR_LEVEL_REPEAT_NAME "S + PLAY"
149 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
151 #define STAR_QUIT BUTTON_POWER
152 #define STAR_LEFT BUTTON_LEFT
153 #define STAR_RIGHT BUTTON_RIGHT
154 #define STAR_UP BUTTON_UP
155 #define STAR_DOWN BUTTON_DOWN
156 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
157 #define STAR_LEVEL_UP_PRE BUTTON_REC
158 #define STAR_LEVEL_UP (BUTTON_REC|BUTTON_REL)
159 #define STAR_LEVEL_DOWN_PRE BUTTON_REC
160 #define STAR_LEVEL_DOWN (BUTTON_REC|BUTTON_REPEAT)
161 #define STAR_LEVEL_REPEAT BUTTON_PLAY
162 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
163 #define STAR_QUIT_NAME "POWER"
164 #define STAR_LEVEL_UP_NAME "REC"
165 #define STAR_LEVEL_DOWN_NAME "REC.."
166 #define STAR_LEVEL_REPEAT_NAME "PLAY"
168 #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
170 #define STAR_QUIT BUTTON_POWER
171 #define STAR_LEFT BUTTON_LEFT
172 #define STAR_RIGHT BUTTON_RIGHT
173 #define STAR_UP BUTTON_UP
174 #define STAR_DOWN BUTTON_DOWN
175 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
176 #define STAR_LEVEL_UP BUTTON_VOL_UP
177 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
178 #define STAR_LEVEL_REPEAT BUTTON_A
179 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
180 #define STAR_QUIT_NAME "POWER"
181 #define STAR_LEVEL_UP_NAME "VOL UP"
182 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
183 #define STAR_LEVEL_REPEAT_NAME "A"
185 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
186 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
187 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
188 (CONFIG_KEYPAD == SANSA_M200_PAD)
190 #define STAR_QUIT BUTTON_POWER
191 #define STAR_LEFT BUTTON_LEFT
192 #define STAR_RIGHT BUTTON_RIGHT
193 #define STAR_UP BUTTON_UP
194 #define STAR_DOWN BUTTON_DOWN
195 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
196 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
197 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
198 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
199 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
200 #define STAR_QUIT_NAME "POWER"
201 #define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
202 #define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
203 #define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
205 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
207 #define STAR_QUIT (BUTTON_HOME|BUTTON_REPEAT)
208 #define STAR_LEFT BUTTON_LEFT
209 #define STAR_RIGHT BUTTON_RIGHT
210 #define STAR_UP BUTTON_UP
211 #define STAR_DOWN BUTTON_DOWN
212 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
213 #define STAR_LEVEL_UP (BUTTON_SELECT | BUTTON_RIGHT)
214 #define STAR_LEVEL_DOWN (BUTTON_SELECT | BUTTON_LEFT)
215 #define STAR_LEVEL_REPEAT (BUTTON_SELECT | BUTTON_DOWN)
216 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
217 #define STAR_QUIT_NAME "HOME"
218 #define STAR_LEVEL_UP_NAME "SELECT + RIGHT"
219 #define STAR_LEVEL_DOWN_NAME "SELECT + LEFT"
220 #define STAR_LEVEL_REPEAT_NAME "SELECT + DOWN"
222 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
224 #define STAR_QUIT BUTTON_POWER
225 #define STAR_LEFT BUTTON_LEFT
226 #define STAR_RIGHT BUTTON_RIGHT
227 #define STAR_UP BUTTON_SCROLL_UP
228 #define STAR_DOWN BUTTON_SCROLL_DOWN
229 #define STAR_TOGGLE_CONTROL BUTTON_REW
230 #define STAR_LEVEL_UP (BUTTON_PLAY | BUTTON_SCROLL_UP)
231 #define STAR_LEVEL_DOWN (BUTTON_PLAY | BUTTON_SCROLL_DOWN)
232 #define STAR_LEVEL_REPEAT (BUTTON_PLAY | BUTTON_RIGHT)
233 #define STAR_TOGGLE_CONTROL_NAME "REW"
234 #define STAR_QUIT_NAME "POWER"
235 #define STAR_LEVEL_UP_NAME "PLAY+UP"
236 #define STAR_LEVEL_DOWN_NAME "PLAY+DOWN"
237 #define STAR_LEVEL_REPEAT_NAME "PLAY+RIGHT"
239 #elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
241 #define STAR_QUIT BUTTON_BACK
242 #define STAR_LEFT BUTTON_LEFT
243 #define STAR_RIGHT BUTTON_RIGHT
244 #define STAR_UP BUTTON_UP
245 #define STAR_DOWN BUTTON_DOWN
246 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
247 #define STAR_LEVEL_UP BUTTON_VOL_UP
248 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
249 #define STAR_LEVEL_REPEAT BUTTON_MENU
250 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
251 #define STAR_QUIT_NAME "BACK"
252 #define STAR_LEVEL_UP_NAME "VOL UP"
253 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
254 #define STAR_LEVEL_REPEAT_NAME "MENU"
256 #elif (CONFIG_KEYPAD == MROBE100_PAD)
258 #define STAR_QUIT BUTTON_POWER
259 #define STAR_LEFT BUTTON_LEFT
260 #define STAR_RIGHT BUTTON_RIGHT
261 #define STAR_UP BUTTON_UP
262 #define STAR_DOWN BUTTON_DOWN
263 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
264 #define STAR_LEVEL_UP BUTTON_PLAY
265 #define STAR_LEVEL_DOWN BUTTON_MENU
266 #define STAR_LEVEL_REPEAT BUTTON_DISPLAY
267 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
268 #define STAR_QUIT_NAME "POWER"
269 #define STAR_LEVEL_UP_NAME "PLAY"
270 #define STAR_LEVEL_DOWN_NAME "MENU"
271 #define STAR_LEVEL_REPEAT_NAME "DISPLAY"
273 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
275 #define STAR_QUIT BUTTON_RC_REC
276 #define STAR_LEFT BUTTON_RC_REW
277 #define STAR_RIGHT BUTTON_RC_FF
278 #define STAR_UP BUTTON_RC_VOL_UP
279 #define STAR_DOWN BUTTON_RC_VOL_DOWN
280 #define STAR_TOGGLE_CONTROL BUTTON_RC_MODE
281 #define STAR_LEVEL_UP (BUTTON_RC_PLAY|BUTTON_RC_VOL_UP)
282 #define STAR_LEVEL_DOWN (BUTTON_RC_PLAY|BUTTON_RC_VOL_DOWN)
283 #define STAR_LEVEL_REPEAT (BUTTON_RC_PLAY|BUTTON_RC_MENU)
284 #define STAR_TOGGLE_CONTROL_NAME "MODE"
285 #define STAR_QUIT_NAME "REC"
286 #define STAR_LEVEL_UP_NAME "PLAY+VOL+"
287 #define STAR_LEVEL_DOWN_NAME "PLAY+VOL-"
288 #define STAR_LEVEL_REPEAT_NAME "PLAY+MENU"
290 #elif (CONFIG_KEYPAD == COWOND2_PAD)
292 #define STAR_QUIT BUTTON_POWER
293 #define STAR_QUIT_NAME "POWER"
295 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
297 #define STAR_QUIT BUTTON_BACK
298 #define STAR_LEFT BUTTON_LEFT
299 #define STAR_RIGHT BUTTON_RIGHT
300 #define STAR_UP BUTTON_UP
301 #define STAR_DOWN BUTTON_DOWN
302 #define STAR_TOGGLE_CONTROL BUTTON_PLAY
303 #define STAR_LEVEL_UP (BUTTON_CUSTOM | BUTTON_UP)
304 #define STAR_LEVEL_DOWN (BUTTON_CUSTOM | BUTTON_DOWN)
305 #define STAR_LEVEL_REPEAT (BUTTON_CUSTOM | BUTTON_RIGHT)
306 #define STAR_TOGGLE_CONTROL_NAME "PLAY"
307 #define STAR_QUIT_NAME "BACK"
308 #define STAR_LEVEL_UP_NAME "CUSTOM+UP"
309 #define STAR_LEVEL_DOWN_NAME "CUSTOM+DOWN"
310 #define STAR_LEVEL_REPEAT_NAME "CUSTOM+RIGHT"
312 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
314 #define STAR_QUIT BUTTON_POWER
315 #define STAR_LEFT BUTTON_LEFT
316 #define STAR_RIGHT BUTTON_RIGHT
317 #define STAR_UP BUTTON_UP
318 #define STAR_DOWN BUTTON_DOWN
319 #define STAR_TOGGLE_CONTROL BUTTON_SELECT
320 #define STAR_LEVEL_UP BUTTON_VOL_UP
321 #define STAR_LEVEL_DOWN BUTTON_VOL_DOWN
322 #define STAR_LEVEL_REPEAT BUTTON_VIEW
323 #define STAR_TOGGLE_CONTROL_NAME "SELECT"
324 #define STAR_QUIT_NAME "POWER"
325 #define STAR_LEVEL_UP_NAME "VOL UP"
326 #define STAR_LEVEL_DOWN_NAME "VOL DOWN"
327 #define STAR_LEVEL_REPEAT_NAME "VIEW"
329 #elif (CONFIG_KEYPAD == ONDAVX747_PAD)
331 #define STAR_QUIT BUTTON_POWER
332 #define STAR_QUIT_NAME "POWER"
334 #elif CONFIG_KEYPAD == MROBE500_PAD
335 #define STAR_QUIT BUTTON_POWER
336 #define STAR_QUIT_NAME "POWER"
339 #error No keymap defined!
342 #ifdef HAVE_TOUCHSCREEN
344 //#define STAR_QUIT BUTTON_TOPLEFT
345 //#define STAR_QUIT_NAME "TOPLEFT"
348 #define STAR_LEFT BUTTON_MIDLEFT
351 #define STAR_RIGHT BUTTON_MIDRIGHT
354 #define STAR_UP BUTTON_TOPMIDDLE
357 #define STAR_DOWN BUTTON_BOTTOMMIDDLE
359 #ifndef STAR_TOGGLE_CONTROL
360 #define STAR_TOGGLE_CONTROL BUTTON_CENTER
361 #define STAR_TOGGLE_CONTROL_NAME "CENTER"
363 #ifndef STAR_LEVEL_UP
364 #define STAR_LEVEL_UP BUTTON_TOPLEFT
365 #define STAR_LEVEL_UP_NAME "TOPLEFT"
367 #ifndef STAR_LEVEL_DOWN
368 #define STAR_LEVEL_DOWN BUTTON_BOTTOMLEFT
369 #define STAR_LEVEL_DOWN_NAME "BOTTOMLEFT"
371 #ifndef STAR_LEVEL_REPEAT
372 #define STAR_LEVEL_REPEAT BUTTON_BOTTOMRIGHT
373 #define STAR_LEVEL_REPEAT_NAME "BOTTOMRIGHT"
377 /* function returns because of USB? */
378 static bool usb_detected
= false;
380 /* position of the ball */
381 static int ball_x
, ball_y
;
383 /* position of the block */
384 static int block_x
, block_y
;
386 /* number of stars to get to finish the level */
387 static int star_count
;
389 /* the object we control : ball or block */
392 /* the current board */
393 static char board
[STAR_HEIGHT
][STAR_WIDTH
];
395 #include "pluginbitmaps/star_tiles.h"
397 #define TILE_WIDTH BMPWIDTH_star_tiles
398 #define TILE_HEIGHT (BMPHEIGHT_star_tiles/5)
399 #define STAR_OFFSET_X ((LCD_WIDTH - STAR_WIDTH * TILE_WIDTH) / 2)
400 #define STAR_OFFSET_Y ((LCD_HEIGHT - STAR_HEIGHT * TILE_HEIGHT - MAX(TILE_HEIGHT, 8)) / 2)
411 static int char_width
= -1;
412 static int char_height
= -1;
414 /* this arrays contains a group of levels loaded into memory */
415 static unsigned char* levels
=
617 * Do a pretty transition from one level to another.
619 static void star_transition_update(void)
621 const int center_x
= LCD_WIDTH
/ 2;
622 const int center_y
= LCD_HEIGHT
/ 2;
625 #if LCD_WIDTH >= LCD_HEIGHT
626 #if defined(IPOD_VIDEO)
631 const int lcd_demi_width
= LCD_WIDTH
/ 2;
634 for (; x
< lcd_demi_width
; x
+=step
)
637 if (var_y
> LCD_WIDTH
)
644 rb
->lcd_update_rect(center_x
- x
, center_y
- y
, x
*2, step
);
645 rb
->lcd_update_rect(center_x
- x
, center_y
+ y
- step
, x
*2, step
);
649 rb
->lcd_update_rect(center_x
- x
, center_y
- y
, step
, y
*2);
650 rb
->lcd_update_rect(center_x
+ x
- step
, center_y
- y
, step
, y
*2);
655 int lcd_demi_height
= LCD_HEIGHT
/ 2;
658 for (; y
< lcd_demi_height
; y
++)
661 if (var_x
> LCD_HEIGHT
)
668 rb
->lcd_update_rect(center_x
- x
, center_y
- y
, x
* 2, 1);
669 rb
->lcd_update_rect(center_x
- x
, center_y
+ y
- 1, x
* 2, 1);
673 rb
->lcd_update_rect(center_x
- x
, center_y
- y
, 1, y
* 2);
674 rb
->lcd_update_rect(center_x
+ x
- 1, center_y
- y
, 1, y
* 2);
683 * Display information board of the current level.
685 static void star_display_board_info(int current_level
)
687 int label_pos_y
, tile_pos_y
;
690 if (TILE_HEIGHT
> char_height
)
692 tile_pos_y
= LCD_HEIGHT
- TILE_HEIGHT
;
693 label_pos_y
= tile_pos_y
+ (TILE_HEIGHT
- char_height
) / 2;
697 label_pos_y
= LCD_HEIGHT
- char_height
;
698 tile_pos_y
= label_pos_y
+ (char_height
- TILE_HEIGHT
) / 2;
701 rb
->snprintf(str_info
, sizeof(str_info
), "L:%02d", current_level
+ 1);
702 rb
->lcd_putsxy(STAR_OFFSET_X
, label_pos_y
, str_info
);
703 rb
->snprintf(str_info
, sizeof(str_info
), "S:%02d", star_count
);
704 rb
->lcd_putsxy(LCD_WIDTH
/2 - 2 * char_width
, label_pos_y
, str_info
);
705 rb
->lcd_putsxy(STAR_OFFSET_X
+ (STAR_WIDTH
-1) * TILE_WIDTH
- 2 * char_width
,
708 rb
->lcd_bitmap_part(star_tiles
, 0, control
== STAR_CONTROL_BALL
?
709 BALL
*TILE_HEIGHT
: BLOCK
*TILE_HEIGHT
, TILE_WIDTH
,
710 STAR_OFFSET_X
+ (STAR_WIDTH
-1) * TILE_WIDTH
,
711 tile_pos_y
, TILE_WIDTH
, TILE_HEIGHT
);
713 rb
->lcd_update_rect(0, MIN(label_pos_y
, tile_pos_y
), LCD_WIDTH
,
714 MAX(TILE_HEIGHT
, char_height
));
719 * Load a level into board array.
721 static int star_load_level(int current_level
)
726 if (current_level
< 0)
728 else if (current_level
> STAR_LEVEL_COUNT
-1)
729 current_level
= STAR_LEVEL_COUNT
-1;
732 ptr_tab
= levels
+ current_level
* STAR_LEVEL_SIZE
;
733 control
= STAR_CONTROL_BALL
;
736 rb
->lcd_clear_display();
738 for (y
= 0 ; y
< STAR_HEIGHT
; y
++)
740 for (x
= 0 ; x
< STAR_WIDTH
; x
++)
742 board
[y
][x
] = *ptr_tab
;
745 # define DRAW_TILE( a ) \
746 rb->lcd_bitmap_part( star_tiles, 0, \
747 a*TILE_HEIGHT, TILE_WIDTH, \
748 STAR_OFFSET_X + x * TILE_WIDTH, \
749 STAR_OFFSET_Y + y * TILE_HEIGHT, \
750 TILE_WIDTH, TILE_HEIGHT);
781 star_display_board_info(current_level
);
782 star_transition_update();
786 static void star_animate_tile(int tile_no
, int start_x
, int start_y
,
787 int delta_x
, int delta_y
)
791 if (delta_x
!= 0) /* horizontal */
793 for (i
= 1 ; i
<= TILE_WIDTH
; i
++)
796 rb
->lcd_bitmap_part(star_tiles
, 0, SPACE
* TILE_HEIGHT
, TILE_WIDTH
,
797 start_x
, start_y
, TILE_WIDTH
, TILE_HEIGHT
);
798 rb
->lcd_bitmap_part(star_tiles
, 0, tile_no
* TILE_HEIGHT
, TILE_WIDTH
,
799 start_x
+ delta_x
* i
, start_y
, TILE_WIDTH
, TILE_HEIGHT
);
800 rb
->lcd_update_rect(start_x
+ delta_x
* i
- (delta_x
>0?1:0),
801 start_y
, TILE_WIDTH
+ 1, TILE_HEIGHT
);
806 for (i
= 1 ; i
<= TILE_HEIGHT
; i
++)
809 rb
->lcd_bitmap_part(star_tiles
, 0, SPACE
* TILE_HEIGHT
, TILE_WIDTH
,
810 start_x
, start_y
, TILE_WIDTH
, TILE_HEIGHT
);
811 rb
->lcd_bitmap_part(star_tiles
, 0, tile_no
* TILE_HEIGHT
, TILE_WIDTH
,
812 start_x
, start_y
+ delta_y
* i
, TILE_WIDTH
, TILE_HEIGHT
);
813 rb
->lcd_update_rect(start_x
, start_y
+ delta_y
* i
- (delta_y
>0?1:0),
814 TILE_WIDTH
, TILE_HEIGHT
+ 1);
822 static int star_run_game(int current_level
)
827 int lastkey
= BUTTON_NONE
;
831 label_offset_y
= LCD_HEIGHT
- char_height
;
833 if (!star_load_level(current_level
))
841 while ((move_x
== 0) && (move_y
== 0))
843 key
= rb
->button_get(true);
868 case STAR_LEVEL_DOWN
:
869 #ifdef STAR_LEVEL_DOWN_PRE
870 if (lastkey
!= STAR_LEVEL_DOWN_PRE
)
873 if (current_level
> 0)
876 star_load_level(current_level
);
880 case STAR_LEVEL_REPEAT
:
881 star_load_level(current_level
);
885 #ifdef STAR_LEVEL_UP_PRE
886 if (lastkey
!= STAR_LEVEL_UP_PRE
)
889 if (current_level
< STAR_LEVEL_COUNT
- 1)
892 star_load_level(current_level
);
896 case STAR_TOGGLE_CONTROL
:
897 #ifdef STAR_TOGGLE_CONTROL_PRE
898 if (lastkey
!= STAR_TOGGLE_CONTROL_PRE
)
901 #ifdef STAR_TOGGLE_CONTROL2
902 case STAR_TOGGLE_CONTROL2
:
904 if (control
== STAR_CONTROL_BALL
)
905 control
= STAR_CONTROL_BLOCK
;
907 control
= STAR_CONTROL_BALL
;
908 star_display_board_info(current_level
);
912 if (rb
->default_event_handler(key
) == SYS_USB_CONNECTED
)
919 if (key
!= BUTTON_NONE
)
923 if (control
== STAR_CONTROL_BALL
)
925 board
[ball_y
][ball_x
] = STAR_VOID
;
926 while ((board
[ball_y
+ move_y
][ball_x
+ move_x
] == STAR_VOID
927 || board
[ball_y
+ move_y
][ball_x
+ move_x
] == STAR_STAR
))
930 star_animate_tile(BALL
, STAR_OFFSET_X
+ ball_x
* TILE_WIDTH
,
931 STAR_OFFSET_Y
+ ball_y
* TILE_HEIGHT
,
936 if (board
[ball_y
][ball_x
] == STAR_STAR
)
938 board
[ball_y
][ball_x
] = STAR_VOID
;
941 star_display_board_info(current_level
);
944 board
[ball_y
][ball_x
] = STAR_BALL
;
948 board
[block_y
][block_x
] = STAR_VOID
;
949 while (board
[block_y
+ move_y
][block_x
+ move_x
] == STAR_VOID
)
951 star_animate_tile(BLOCK
, STAR_OFFSET_X
+ block_x
* TILE_WIDTH
,
952 STAR_OFFSET_Y
+ block_y
* TILE_HEIGHT
,
957 board
[block_y
][block_x
] = STAR_BLOCK
;
963 if (current_level
== STAR_LEVEL_COUNT
)
965 rb
->lcd_clear_display();
966 rb
->splash(HZ
*2, "Congratulations!");
969 /* There is no such level as STAR_LEVEL_COUNT so it can't be the
974 star_load_level(current_level
);
982 static bool star_help(void)
985 #define WORDS (sizeof help_text / sizeof (char*))
986 static char* help_text
[] = {
987 "Star", "", "Aim", "",
988 "Take", "all", "the", "stars", "to", "go", "to", "the", "next", "level.",
989 "You", "can", "toggle", "control", "with", "the", "block", "to", "use",
990 "it", "as", "a", "mobile", "wall.", "The", "block", "cannot", "take",
993 STAR_TOGGLE_CONTROL_NAME
":", "Toggle", "Control", "",
994 STAR_QUIT_NAME
":", "", "Exit", "",
995 STAR_LEVEL_DOWN_NAME
":", "Prev.", "level", "",
996 STAR_LEVEL_REPEAT_NAME
":", "Reset", "level", "",
997 STAR_LEVEL_UP_NAME
":", "Next", "level"
999 static struct style_text formation
[]={
1000 { 0, TEXT_CENTER
|TEXT_UNDERLINE
},
1006 if (display_text(WORDS
, help_text
, formation
, NULL
))
1009 button
= rb
->button_get(true);
1010 if ( rb
->default_event_handler( button
) == SYS_USB_CONNECTED
)
1012 } while( ( button
== BUTTON_NONE
)
1013 || ( button
& (BUTTON_REL
|BUTTON_REPEAT
) ) );
1019 * Display the choice menu.
1021 static int star_menu(void)
1023 int selection
, level
=1;
1024 bool menu_quit
= false;
1025 /* get the size of char */
1026 rb
->lcd_getstringsize("a", &char_width
, &char_height
);
1028 MENUITEM_STRINGLIST(menu
,"Star Menu",NULL
,"Play","Choose Level",
1033 switch(rb
->do_menu(&menu
, &selection
, NULL
, false))
1039 rb
->set_int("Level", "", UNIT_INT
, &level
,
1040 NULL
, 1, 1, STAR_LEVEL_COUNT
, NULL
);
1044 usb_detected
= true;
1052 if (selection
== MENU_START
)
1054 rb
->lcd_setfont(FONT_SYSFIXED
);
1055 rb
->lcd_getstringsize("a", &char_width
, &char_height
);
1057 star_run_game(level
);
1065 enum plugin_status
plugin_start(const void* parameter
)
1070 rb
->lcd_set_backdrop(NULL
);
1071 rb
->lcd_set_background( LCD_BLACK
);
1072 rb
->lcd_set_foreground( LCD_WHITE
);
1075 /* display choice menu */