M:Robe 500: Get the rest of the games except doom working with the touchscreen.
[kugel-rb.git] / apps / plugins / rockblox.c
blob474cc02d4c385b4ab4b0e78ca539b0185a61dc73
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2005 Eli Sherer
12 * Heavily modified for embedded use by Björn Stenberg (bjorn@haxx.se)
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
22 ****************************************************************************/
23 #include "plugin.h"
24 #include "lib/highscore.h"
25 #include "lib/playergfx.h"
26 #include "lib/helper.h"
28 PLUGIN_HEADER
30 #if (CONFIG_KEYPAD == IPOD_4G_PAD) || \
31 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
32 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
34 #define ROCKBLOX_OFF (BUTTON_MENU | BUTTON_SELECT)
35 #define ROCKBLOX_ROTATE_RIGHT BUTTON_SCROLL_BACK
36 #define ROCKBLOX_ROTATE_RIGHT2 (BUTTON_MENU | BUTTON_REL)
37 #define ROCKBLOX_ROTATE_LEFT BUTTON_SCROLL_FWD
38 #define ROCKBLOX_LEFT BUTTON_LEFT
39 #define ROCKBLOX_RIGHT BUTTON_RIGHT
40 #define ROCKBLOX_DOWN BUTTON_PLAY
41 #define ROCKBLOX_RESTART (BUTTON_SELECT | BUTTON_PLAY)
42 #define ROCKBLOX_DROP (BUTTON_SELECT | BUTTON_REL)
44 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
45 (CONFIG_KEYPAD == IRIVER_H300_PAD)
47 #define ROCKBLOX_OFF BUTTON_OFF
48 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
49 #define ROCKBLOX_ROTATE_LEFT BUTTON_SELECT
50 #define ROCKBLOX_DOWN BUTTON_DOWN
51 #define ROCKBLOX_LEFT BUTTON_LEFT
52 #define ROCKBLOX_RIGHT BUTTON_RIGHT
53 #define ROCKBLOX_DROP BUTTON_MODE
54 #define ROCKBLOX_RESTART BUTTON_ON
56 #define ROCKBLOX_RC_OFF BUTTON_RC_STOP
58 #elif CONFIG_KEYPAD == RECORDER_PAD
60 #define ROCKBLOX_OFF BUTTON_OFF
61 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
62 #define ROCKBLOX_ROTATE_LEFT BUTTON_PLAY
63 #define ROCKBLOX_DOWN BUTTON_DOWN
64 #define ROCKBLOX_LEFT BUTTON_LEFT
65 #define ROCKBLOX_RIGHT BUTTON_RIGHT
66 #define ROCKBLOX_DROP BUTTON_ON
67 #define ROCKBLOX_RESTART BUTTON_F1
69 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
71 #define ROCKBLOX_OFF BUTTON_OFF
72 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
73 #define ROCKBLOX_ROTATE_LEFT BUTTON_SELECT
74 #define ROCKBLOX_DOWN BUTTON_DOWN
75 #define ROCKBLOX_LEFT BUTTON_LEFT
76 #define ROCKBLOX_RIGHT BUTTON_RIGHT
77 #define ROCKBLOX_DROP BUTTON_ON
78 #define ROCKBLOX_RESTART BUTTON_F1
80 #elif CONFIG_KEYPAD == PLAYER_PAD
82 #define ROCKBLOX_OFF BUTTON_STOP
83 #define ROCKBLOX_ROTATE_RIGHT BUTTON_PLAY
84 #define ROCKBLOX_ROTATE_LEFT (BUTTON_ON|BUTTON_PLAY)
85 #define ROCKBLOX_DOWN BUTTON_MENU
86 #define ROCKBLOX_LEFT BUTTON_LEFT
87 #define ROCKBLOX_RIGHT BUTTON_RIGHT
88 #define ROCKBLOX_DROP_PRE BUTTON_ON
89 #define ROCKBLOX_DROP (BUTTON_ON|BUTTON_REL)
91 #elif CONFIG_KEYPAD == ONDIO_PAD
93 #define ROCKBLOX_OFF BUTTON_OFF
94 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
95 #define ROCKBLOX_ROTATE_LEFT (BUTTON_MENU|BUTTON_UP)
96 #define ROCKBLOX_DOWN BUTTON_DOWN
97 #define ROCKBLOX_LEFT BUTTON_LEFT
98 #define ROCKBLOX_RIGHT BUTTON_RIGHT
99 #define ROCKBLOX_DROP_PRE BUTTON_MENU
100 #define ROCKBLOX_DROP (BUTTON_MENU|BUTTON_REL)
102 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
104 #define ROCKBLOX_OFF BUTTON_POWER
105 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
106 #define ROCKBLOX_ROTATE_LEFT BUTTON_SELECT
107 #define ROCKBLOX_DOWN BUTTON_DOWN
108 #define ROCKBLOX_LEFT BUTTON_LEFT
109 #define ROCKBLOX_RIGHT BUTTON_RIGHT
110 #define ROCKBLOX_DROP BUTTON_REC
111 #define ROCKBLOX_RESTART BUTTON_PLAY
113 #elif CONFIG_KEYPAD == SANSA_E200_PAD
115 #define ROCKBLOX_OFF BUTTON_POWER
116 #define ROCKBLOX_ROTATE_RIGHT BUTTON_SCROLL_BACK
117 #define ROCKBLOX_ROTATE_RIGHT2 BUTTON_UP
118 #define ROCKBLOX_ROTATE_LEFT BUTTON_SCROLL_FWD
119 #define ROCKBLOX_DOWN BUTTON_DOWN
120 #define ROCKBLOX_LEFT BUTTON_LEFT
121 #define ROCKBLOX_RIGHT BUTTON_RIGHT
122 #define ROCKBLOX_DROP BUTTON_SELECT
123 #define ROCKBLOX_RESTART BUTTON_REC
125 #elif CONFIG_KEYPAD == SANSA_FUZE_PAD
127 #define ROCKBLOX_OFF (BUTTON_HOME|BUTTON_REPEAT)
128 #define ROCKBLOX_ROTATE_RIGHT BUTTON_SCROLL_BACK
129 #define ROCKBLOX_ROTATE_RIGHT2 BUTTON_UP
130 #define ROCKBLOX_ROTATE_LEFT BUTTON_SCROLL_FWD
131 #define ROCKBLOX_DOWN BUTTON_DOWN
132 #define ROCKBLOX_LEFT BUTTON_LEFT
133 #define ROCKBLOX_RIGHT BUTTON_RIGHT
134 #define ROCKBLOX_DROP (BUTTON_SELECT | BUTTON_REL)
135 #define ROCKBLOX_RESTART (BUTTON_SELECT | BUTTON_UP)
138 #elif CONFIG_KEYPAD == SANSA_C200_PAD
140 #define ROCKBLOX_OFF BUTTON_POWER
141 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
142 #define ROCKBLOX_ROTATE_RIGHT2 BUTTON_VOL_DOWN
143 #define ROCKBLOX_ROTATE_LEFT BUTTON_VOL_UP
144 #define ROCKBLOX_DOWN BUTTON_DOWN
145 #define ROCKBLOX_LEFT BUTTON_LEFT
146 #define ROCKBLOX_RIGHT BUTTON_RIGHT
147 #define ROCKBLOX_DROP BUTTON_SELECT
148 #define ROCKBLOX_RESTART BUTTON_REC
150 #elif CONFIG_KEYPAD == SANSA_CLIP_PAD
152 #define ROCKBLOX_OFF BUTTON_POWER
153 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
154 #define ROCKBLOX_ROTATE_RIGHT2 BUTTON_VOL_DOWN
155 #define ROCKBLOX_ROTATE_LEFT BUTTON_VOL_UP
156 #define ROCKBLOX_DOWN BUTTON_DOWN
157 #define ROCKBLOX_LEFT BUTTON_LEFT
158 #define ROCKBLOX_RIGHT BUTTON_RIGHT
159 #define ROCKBLOX_DROP BUTTON_SELECT
160 #define ROCKBLOX_RESTART BUTTON_HOME
162 #elif CONFIG_KEYPAD == SANSA_M200_PAD
164 #define ROCKBLOX_OFF BUTTON_POWER
165 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
166 #define ROCKBLOX_ROTATE_RIGHT2 BUTTON_VOL_DOWN
167 #define ROCKBLOX_ROTATE_LEFT BUTTON_VOL_UP
168 #define ROCKBLOX_DOWN BUTTON_DOWN
169 #define ROCKBLOX_LEFT BUTTON_LEFT
170 #define ROCKBLOX_RIGHT BUTTON_RIGHT
171 #define ROCKBLOX_RESTART (BUTTON_SELECT | BUTTON_UP)
172 #define ROCKBLOX_DROP (BUTTON_SELECT | BUTTON_REL)
174 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
176 #define ROCKBLOX_OFF BUTTON_POWER
177 #define ROCKBLOX_ROTATE_RIGHT BUTTON_SCROLL_UP
178 #define ROCKBLOX_ROTATE_LEFT BUTTON_REW
179 #define ROCKBLOX_DOWN BUTTON_SCROLL_DOWN
180 #define ROCKBLOX_LEFT BUTTON_LEFT
181 #define ROCKBLOX_RIGHT BUTTON_RIGHT
182 #define ROCKBLOX_DROP BUTTON_FF
183 #define ROCKBLOX_RESTART BUTTON_PLAY
185 #elif CONFIG_KEYPAD == GIGABEAT_PAD
187 #define ROCKBLOX_OFF BUTTON_POWER
188 #define ROCKBLOX_ROTATE_RIGHT BUTTON_VOL_DOWN
189 #define ROCKBLOX_ROTATE_LEFT BUTTON_VOL_UP
190 #define ROCKBLOX_ROTATE BUTTON_UP
191 #define ROCKBLOX_DOWN BUTTON_DOWN
192 #define ROCKBLOX_LEFT BUTTON_LEFT
193 #define ROCKBLOX_RIGHT BUTTON_RIGHT
194 #define ROCKBLOX_DROP BUTTON_SELECT
195 #define ROCKBLOX_RESTART BUTTON_A
197 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
199 #define ROCKBLOX_OFF BUTTON_PLAY
200 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
201 #define ROCKBLOX_ROTATE_LEFT BUTTON_SELECT
202 #define ROCKBLOX_DOWN BUTTON_DOWN
203 #define ROCKBLOX_LEFT BUTTON_LEFT
204 #define ROCKBLOX_RIGHT BUTTON_RIGHT
205 #define ROCKBLOX_DROP BUTTON_MODE
206 #define ROCKBLOX_RESTART BUTTON_EQ
208 #elif CONFIG_KEYPAD == MROBE500_PAD
209 #define ROCKBLOX_OFF BUTTON_POWER
211 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
212 #define ROCKBLOX_OFF BUTTON_BACK
213 #define ROCKBLOX_ROTATE_RIGHT BUTTON_VOL_DOWN
214 #define ROCKBLOX_ROTATE_LEFT BUTTON_VOL_UP
215 #define ROCKBLOX_ROTATE BUTTON_UP
216 #define ROCKBLOX_DOWN BUTTON_DOWN
217 #define ROCKBLOX_LEFT BUTTON_LEFT
218 #define ROCKBLOX_RIGHT BUTTON_RIGHT
219 #define ROCKBLOX_DROP BUTTON_SELECT
220 #define ROCKBLOX_RESTART BUTTON_PLAY
222 #elif CONFIG_KEYPAD == MROBE100_PAD
224 #define ROCKBLOX_OFF BUTTON_POWER
225 #define ROCKBLOX_ROTATE_RIGHT BUTTON_MENU
226 #define ROCKBLOX_ROTATE_LEFT BUTTON_PLAY
227 #define ROCKBLOX_ROTATE BUTTON_UP
228 #define ROCKBLOX_DOWN BUTTON_DOWN
229 #define ROCKBLOX_LEFT BUTTON_LEFT
230 #define ROCKBLOX_RIGHT BUTTON_RIGHT
231 #define ROCKBLOX_DROP BUTTON_SELECT
232 #define ROCKBLOX_RESTART BUTTON_DISPLAY
234 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
236 #define ROCKBLOX_OFF BUTTON_RC_REC
237 #define ROCKBLOX_ROTATE_RIGHT BUTTON_RC_VOL_DOWN
238 #define ROCKBLOX_ROTATE_LEFT BUTTON_RC_VOL_UP
239 #define ROCKBLOX_DOWN BUTTON_RC_MENU
240 #define ROCKBLOX_LEFT BUTTON_RC_REW
241 #define ROCKBLOX_RIGHT BUTTON_RC_FF
242 #define ROCKBLOX_DROP BUTTON_RC_PLAY
243 #define ROCKBLOX_RESTART BUTTON_RC_MODE
245 #elif CONFIG_KEYPAD == COWOND2_PAD
246 #define ROCKBLOX_OFF BUTTON_POWER
247 #define ROCKBLOX_RESTART BUTTON_MENU
249 #elif CONFIG_KEYPAD == IAUDIO67_PAD
251 #define ROCKBLOX_OFF BUTTON_POWER
252 #define ROCKBLOX_ROTATE_RIGHT BUTTON_VOLDOWN
253 #define ROCKBLOX_ROTATE_LEFT BUTTON_VOLUP
254 #define ROCKBLOX_DOWN BUTTON_STOP
255 #define ROCKBLOX_LEFT BUTTON_LEFT
256 #define ROCKBLOX_RIGHT BUTTON_RIGHT
257 #define ROCKBLOX_DROP BUTTON_PLAY
258 #define ROCKBLOX_RESTART BUTTON_MENU
260 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
261 #define ROCKBLOX_OFF BUTTON_BACK
262 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
263 #define ROCKBLOX_ROTATE_LEFT BUTTON_PLAY
264 #define ROCKBLOX_DOWN BUTTON_DOWN
265 #define ROCKBLOX_LEFT BUTTON_LEFT
266 #define ROCKBLOX_RIGHT BUTTON_RIGHT
267 #define ROCKBLOX_DROP BUTTON_SELECT
268 #define ROCKBLOX_RESTART BUTTON_CUSTOM
270 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
272 #define ROCKBLOX_OFF BUTTON_POWER
273 #define ROCKBLOX_ROTATE_RIGHT BUTTON_VOL_DOWN
274 #define ROCKBLOX_ROTATE_LEFT BUTTON_VOL_UP
275 #define ROCKBLOX_ROTATE BUTTON_UP
276 #define ROCKBLOX_DOWN BUTTON_DOWN
277 #define ROCKBLOX_LEFT BUTTON_LEFT
278 #define ROCKBLOX_RIGHT BUTTON_RIGHT
279 #define ROCKBLOX_DROP BUTTON_SELECT
280 #define ROCKBLOX_RESTART BUTTON_MENU
282 #elif CONFIG_KEYPAD == ONDAVX747_PAD
283 #define ROCKBLOX_OFF BUTTON_POWER
284 #define ROCKBLOX_RESTART BUTTON_MENU
286 #else
287 #error No keymap defined!
288 #endif
290 #ifdef HAVE_TOUCHSCREEN
291 #ifndef ROCKBLOX_OFF
292 #define ROCKBLOX_OFF BUTTON_TOPLEFT
293 #endif
294 #ifndef ROCKBLOX_ROTATE_RIGHT
295 #define ROCKBLOX_ROTATE_RIGHT BUTTON_BOTTOMRIGHT
296 #endif
297 #ifndef ROCKBLOX_ROTATE_LEFT
298 #define ROCKBLOX_ROTATE_LEFT BUTTON_BOTTOMLEFT
299 #endif
300 #ifndef ROCKBLOX_DOWN
301 #define ROCKBLOX_DOWN BUTTON_BOTTOMMIDDLE
302 #endif
303 #ifndef ROCKBLOX_LEFT
304 #define ROCKBLOX_LEFT BUTTON_MIDLEFT
305 #endif
306 #ifndef ROCKBLOX_RIGHT
307 #define ROCKBLOX_RIGHT BUTTON_MIDRIGHT
308 #endif
309 #ifndef ROCKBLOX_DROP
310 #define ROCKBLOX_DROP BUTTON_CENTER
311 #endif
312 #ifndef ROCKBLOX_RESTART
313 #define ROCKBLOX_RESTART BUTTON_TOPRIGHT
314 #endif
315 #endif
317 #define BLOCKS_NUM 7
318 #define EMPTY_BLOCK 7
320 #define BOARD_WIDTH 10
322 #ifdef HAVE_LCD_BITMAP
324 #define BOARD_HEIGHT 20
326 #if (LCD_WIDTH == 640) && (LCD_HEIGHT == 480)
328 #define BLOCK_WIDTH 30
329 #define BLOCK_HEIGHT 30
330 #define BOARD_X 14
331 #define BOARD_Y 2
332 #define PREVIEW_X 342
333 #define PREVIEW_Y 482
334 #define LABEL_X 344
335 #define SCORE_Y 58
336 #define LEVEL_Y 142
337 #define LINES_Y 218
338 #define HIGH_LABEL_X 344
339 #define HIGH_SCORE_Y 326
340 #define HIGH_LEVEL_Y 344
342 #elif (LCD_WIDTH == 480) && (LCD_HEIGHT == 640)
344 #define BLOCK_WIDTH 30
345 #define BLOCK_HEIGHT 30
346 #define BOARD_X 14
347 #define BOARD_Y 2
348 #define PREVIEW_X 342
349 #define PREVIEW_Y 482
350 #define LABEL_X 344
351 #define SCORE_Y 58
352 #define LEVEL_Y 142
353 #define LINES_Y 218
354 #define HIGH_LABEL_X 344
355 #define HIGH_SCORE_Y 326
356 #define HIGH_LEVEL_Y 344
358 #elif (LCD_WIDTH == 320) && (LCD_HEIGHT == 240)
360 #define BLOCK_WIDTH 12
361 #define BLOCK_HEIGHT 12
362 #define BOARD_X 86
363 #define BOARD_Y 0
364 #define PREVIEW_X 12
365 #define PREVIEW_Y 11
366 #define LABEL_X 242
367 #define SCORE_Y 25
368 #define LEVEL_Y 70
369 #define LINES_Y 105
371 #elif (LCD_WIDTH == 240) && ((LCD_HEIGHT == 320) || (LCD_HEIGHT == 400))
373 #define BLOCK_WIDTH 15
374 #define BLOCK_HEIGHT 15
375 #define BOARD_X 7
376 #define BOARD_Y 1
377 #define PREVIEW_X 171
378 #define PREVIEW_Y 241
379 #define LABEL_X 172
380 #define SCORE_Y 29
381 #define LEVEL_Y 71
382 #define LINES_Y 109
383 #define HIGH_LABEL_X 172
384 #define HIGH_SCORE_Y 163
385 #define HIGH_LEVEL_Y 172
387 #elif (LCD_WIDTH == 220) && (LCD_HEIGHT == 176)
389 #define BLOCK_WIDTH 8
390 #define BLOCK_HEIGHT 8
391 #define BOARD_X 27
392 #define BOARD_Y 5
393 #define PREVIEW_X 158
394 #define PREVIEW_Y 130
395 #define LABEL_X 147
396 #define SCORE_Y 20
397 #define LEVEL_Y 65
398 #define LINES_Y 100
400 #elif (LCD_WIDTH == 176) && (LCD_HEIGHT == 132)
402 #define BLOCK_WIDTH 6
403 #define BLOCK_HEIGHT 6
404 #define BOARD_X 25
405 #define BOARD_Y 1
406 #define PREVIEW_X 126
407 #define PREVIEW_Y 102
408 #define LABEL_X 112
409 #define SCORE_Y 17
410 #define LEVEL_Y 49
411 #define LINES_Y 81
413 #elif (LCD_WIDTH == 176) && (LCD_HEIGHT == 220)
415 #define BLOCK_WIDTH 10
416 #define BLOCK_HEIGHT 10
417 #define BOARD_X 6
418 #define BOARD_Y 10
419 #define PREVIEW_X 124
420 #define PREVIEW_Y 167
421 #define LABEL_X 117
422 #define SCORE_Y 24
423 #define LEVEL_Y 65
424 #define LINES_Y 103
425 #elif (LCD_WIDTH == 160) && (LCD_HEIGHT == 128)
427 #define BLOCK_WIDTH 6
428 #define BLOCK_HEIGHT 6
429 #define BOARD_X 22
430 #define BOARD_Y 3
431 #define PREVIEW_X 114
432 #define PREVIEW_Y 100
433 #define LABEL_X 101
434 #define SCORE_Y 17
435 #define LEVEL_Y 49
436 #define LINES_Y 82
438 #elif (LCD_WIDTH == 138) && (LCD_HEIGHT == 110)
440 #define BLOCK_WIDTH 5
441 #define BLOCK_HEIGHT 5
442 #define BOARD_X 14
443 #define BOARD_Y 0
444 #define PREVIEW_X 98
445 #define PREVIEW_Y 88
446 #define LABEL_X 80
447 #define SCORE_Y 15
448 #define LEVEL_Y 45
449 #define LINES_Y 74
451 #elif (LCD_WIDTH == 132) && (LCD_HEIGHT == 80)
453 #define BLOCK_WIDTH 4
454 #define BLOCK_HEIGHT 4
455 #define BOARD_X 10
456 #define BOARD_Y 0
457 #define PREVIEW_X 89
458 #define PREVIEW_Y 61
459 #define LABEL_X 78
460 #define SCORE_Y 10
461 #define LEVEL_Y 30
462 #define LINES_Y 50
464 #elif (LCD_WIDTH == 128) && (LCD_HEIGHT == 128)
466 #define BLOCK_WIDTH 6
467 #define BLOCK_HEIGHT 6
468 #define BOARD_X 4
469 #define BOARD_Y 3
470 #define PREVIEW_X 84
471 #define PREVIEW_Y 100
472 #define LABEL_X 71
473 #define SCORE_Y 17
474 #define LEVEL_Y 49
475 #define LINES_Y 82
477 #elif (LCD_WIDTH == 128) && (LCD_HEIGHT == 96)
479 #define BLOCK_WIDTH 4
480 #define BLOCK_HEIGHT 4
481 #define BOARD_X 14
482 #define BOARD_Y 2
483 #define PREVIEW_X 89
484 #define PREVIEW_Y 76
485 #define LABEL_X 70
486 #define SCORE_Y 14
487 #define LEVEL_Y 39
488 #define LINES_Y 64
490 #elif (LCD_WIDTH == 128) && (LCD_HEIGHT == 64)
492 #define BLOCK_WIDTH 3
493 #define BLOCK_HEIGHT 3
494 #define BOARD_X 9
495 #define BOARD_Y 3
496 #define PREVIEW_X 53
497 #define PREVIEW_Y 5
498 #define LABEL_X 70
499 #define SCORE_Y 32
500 #define LEVEL_Y 13
501 #define LINES_Y 51
503 #elif (LCD_WIDTH == 112) && (LCD_HEIGHT == 64)
505 #define BLOCK_WIDTH 4
506 #define BLOCK_HEIGHT 3
507 #define BOARD_X 9
508 #define BOARD_Y 3
509 #define PREVIEW_X 59
510 #define PREVIEW_Y 5
511 #define LABEL_X 59
512 #define SCORE_Y 32
513 #define LEVEL_Y 13
514 #define LEVEL_X 78
515 #define LINES_Y 51
517 #endif
519 #ifndef LEVEL_X
520 #define LEVEL_X LABEL_X
521 #endif
523 #ifndef LINES_X
524 #define LINES_X LABEL_X
525 #endif
527 #define MYLCD(fn) rb->lcd_ ## fn
529 extern const fb_data rockblox_background[];
531 #else /* HAVE_LCD_CHARCELLS */
533 #define BOARD_HEIGHT 14
535 #define BLOCK_WIDTH 1
536 #define BLOCK_HEIGHT 1
537 #define BOARD_X 5
538 #define BOARD_Y 0
539 #define PREVIEW_X 15
540 #define PREVIEW_Y 1
542 #define MYLCD(fn) pgfx_ ## fn
544 #endif
546 /* <<Explanation on Rockblox shapes>>
549 %% - O has 1 orientation
551 %% %
552 %% %% - Z has 2 orientations
555 %% %
556 %% %% - S has 2 orientations
560 % %%%% - I has 2 orientations
563 % %%
564 % % % %%% - L has 4 orientations
565 %% %%% % %
567 % %%
568 % % % %%% - J has 4 orientations
569 %% %%% % %
571 % % %%%
572 %% % %% % - T has 4 orientations
573 % %%% %
577 static bool gameover = false;
578 /* c=current f=figure o=orientation n=next */
579 static int lines = 0, level = 0, score = 0, cx, cy, cf, co, nf;
580 static short board[BOARD_HEIGHT][BOARD_WIDTH]; /* 20 rows of 10 blocks */
582 #ifdef HAVE_SCROLLWHEEL
583 int wheel_events = 0, last_wheel_event = 0;
584 bool wheel_enabled = false;
585 #endif
587 static const short scoring[4] = { /* scoring for each number of lines */
588 #if BOARD_HEIGHT == 20
589 40 /* single */ , 100 /* double */ , 300 /* triple */ , 1200 /* rockblox */
590 #elif BOARD_HEIGHT == 14 /* Player special values */
591 60 /* single */ , 150 /* double */ , 500 /* triple */ , 2000 /* rockblox */
592 #endif
595 struct figure
597 #if LCD_DEPTH >= 2
598 unsigned short color[3]; /* color of figure (light,middle,shadow) */
599 #endif
600 unsigned short max_or; /* max orientations */
601 signed short shapeX[4], shapeY[4]; /* implementation of figures */
604 /* array of figures */
605 figures[BLOCKS_NUM] = {
606 /* O */
608 #if LCD_DEPTH >= 16
609 {LCD_RGBPACK (153, 255, 255), LCD_RGBPACK(0, 255, 255),
610 LCD_RGBPACK(0,153,153)},
611 #elif LCD_DEPTH == 2
612 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
613 #endif
615 {-1, 0, -1, 0},
616 {0, 0, 1, 1}
618 /* I */
620 #if LCD_DEPTH >= 16
621 {LCD_RGBPACK (255, 153, 128), LCD_RGBPACK (255, 0, 0),
622 LCD_RGBPACK (153, 0, 0)},
623 #elif LCD_DEPTH == 2
624 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
625 #endif
627 {-2, -1, 0, 1},
628 {0, 0, 0, 0}
630 /* 'Z' */
632 #if LCD_DEPTH >= 16
633 {LCD_RGBPACK (153, 255, 153), LCD_RGBPACK (0, 255, 0),
634 LCD_RGBPACK (0, 153, 0)},
635 #elif LCD_DEPTH == 2
636 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
637 #endif
639 {0, 1, -1, 0},
640 {0, 0, 1, 1}
642 /* 'S' */
644 #if LCD_DEPTH >= 16
645 {LCD_RGBPACK (153, 153, 255), LCD_RGBPACK (0, 0, 255),
646 LCD_RGBPACK (0, 0, 153)},
647 #elif LCD_DEPTH == 2
648 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
649 #endif
651 {-1, 0, 0, 1},
652 {0, 0, 1, 1}
654 /* 'L' */
656 #if LCD_DEPTH >= 16
657 {LCD_RGBPACK (255, 255, 153), LCD_RGBPACK (255, 255, 0),
658 LCD_RGBPACK (153, 153, 0)},
659 #elif LCD_DEPTH == 2
660 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
661 #endif
663 {-1, 0, 1, 1},
664 {0, 0, 0, 1}
666 /* 'J' */
668 #if LCD_DEPTH >= 16
669 {LCD_RGBPACK (255, 153, 255), LCD_RGBPACK (255, 0, 255),
670 LCD_RGBPACK (153, 0, 153)},
671 #elif LCD_DEPTH == 2
672 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
673 #endif
675 {-1, 0, 1, -1},
676 {0, 0, 0, 1}
678 /* 'T' */
680 #if LCD_DEPTH >= 16
681 {LCD_RGBPACK (204, 204, 204), LCD_RGBPACK (153, 153, 153),
682 LCD_RGBPACK (85, 85, 85)},
683 #elif LCD_DEPTH == 2
684 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
685 #endif
687 {-1, 0, 1, 0},
688 {0, 0, 0, 1}
692 /* Rockbox File System only supports full filenames inc dir */
693 #define HIGH_SCORE PLUGIN_GAMES_DIR "/rockblox.score"
694 #define MAX_HIGH_SCORES 5
695 /* Default High Scores... */
696 struct highscore Highest[MAX_HIGH_SCORES];
698 /* get random number from (0) to (range-1) */
699 static int t_rand (int range)
701 return rb->rand () % range;
704 /* init the board array to have no blocks */
705 static void init_board (void)
707 int i, j;
708 for (i = 0; i < BOARD_WIDTH; i++)
709 for (j = 0; j < BOARD_HEIGHT; j++)
710 board[j][i] = EMPTY_BLOCK;
713 /* show the score, level and lines */
714 static void show_details (void)
716 char str[25]; /* for strings */
718 #ifdef HAVE_LCD_BITMAP
719 #if LCD_DEPTH >= 2
720 rb->lcd_set_foreground (LCD_BLACK);
721 rb->lcd_set_background (LCD_WHITE);
722 #endif
723 rb->snprintf (str, sizeof (str), "%d", score);
724 rb->lcd_putsxy (LABEL_X, SCORE_Y, str);
725 rb->snprintf (str, sizeof (str), "%d", level);
726 rb->lcd_putsxy (LEVEL_X, LEVEL_Y, str);
727 rb->snprintf (str, sizeof (str), "%d", lines);
728 rb->lcd_putsxy (LINES_X, LINES_Y, str);
729 #else /* HAVE_LCD_CHARCELLS */
730 rb->snprintf (str, sizeof (str), "L%d/%d", level, lines);
731 rb->lcd_puts (5, 0, str);
732 rb->snprintf (str, sizeof (str), "S%d", score);
733 rb->lcd_puts (5, 1, str);
734 #endif
737 #ifdef HIGH_SCORE_Y
738 static void show_highscores (void)
740 int i;
741 char str[25]; /* for strings */
743 for (i = MAX_HIGH_SCORES-1; i>=0; i--)
745 rb->snprintf (str, sizeof (str), "%06d L%1d", Highest[i].score, Highest[i].level);
746 rb->lcd_putsxy (HIGH_LABEL_X, HIGH_SCORE_Y + (10 * ((MAX_HIGH_SCORES-1) - i)), str);
749 #endif
751 static void init_rockblox (void)
753 highscore_update(score, level, Highest, MAX_HIGH_SCORES);
755 level = 1;
756 lines = 0;
757 score = 0;
758 gameover = false;
759 nf = t_rand (BLOCKS_NUM);
760 init_board ();
761 #ifdef HAVE_LCD_BITMAP
762 rb->lcd_bitmap (rockblox_background, 0, 0, LCD_WIDTH, LCD_HEIGHT);
763 #else /* HAVE_LCD_CHARCELLS */
764 pgfx_display (0, 0);
765 pgfx_display_block (3, 0, 3, 1);
766 pgfx_display_block (4, 0, 3, 0);
767 pgfx_clear_display();
768 pgfx_fillrect (3, 0, 2, 14);
769 pgfx_fillrect (15, 7, 2, 7);
770 pgfx_update();
771 #endif
772 show_details ();
773 #ifdef HIGH_SCORE_Y
774 show_highscores ();
775 #endif
778 static inline int level_speed(int level)
780 #if BOARD_HEIGHT == 20
781 return (5*HZ) / (level + 9);
782 #elif BOARD_HEIGHT == 14
783 return (7*HZ) / (level + 9);
784 #endif
787 static int getRelativeX (int figure, int square, int orientation)
789 switch (orientation) {
790 case 0:
791 return figures[figure].shapeX[square];
792 case 1:
793 return figures[figure].shapeY[square];
794 case 2:
795 return -figures[figure].shapeX[square];
796 case 3:
797 return -figures[figure].shapeY[square];
798 default:
799 return 0;
803 static int getRelativeY (int figure, int square, int orientation)
805 switch (orientation) {
806 case 0:
807 return figures[figure].shapeY[square];
808 case 1:
809 return -figures[figure].shapeX[square];
810 case 2:
811 return -figures[figure].shapeY[square];
812 case 3:
813 return figures[figure].shapeX[square];
814 default:
815 return 0;
819 /* redraw the while board on the screen */
820 static void refresh_board (void)
822 int i, j, x, y, block;
824 #if LCD_DEPTH >= 2
825 rb->lcd_set_foreground (LCD_BLACK);
826 #elif LCD_DEPTH == 1
827 MYLCD(set_drawmode) (DRMODE_SOLID | DRMODE_INVERSEVID);
828 #endif
830 MYLCD(fillrect) (BOARD_X, BOARD_Y, BOARD_WIDTH * BLOCK_WIDTH,
831 BOARD_HEIGHT * BLOCK_HEIGHT);
833 #if LCD_DEPTH == 1
834 MYLCD(set_drawmode) (DRMODE_SOLID);
835 #endif
837 for (i = 0; i < BOARD_WIDTH; i++)
838 for (j = 0; j < BOARD_HEIGHT; j++) {
839 block = board[j][i];
840 if (block != EMPTY_BLOCK) {
841 #ifdef HAVE_LCD_BITMAP
842 #if LCD_DEPTH >= 2
843 /* middle drawing */
844 rb->lcd_set_foreground (figures[block].color[1]);
845 #endif
846 rb->lcd_fillrect (BOARD_X + i * BLOCK_WIDTH,
847 BOARD_Y + j * BLOCK_HEIGHT,
848 BLOCK_WIDTH, BLOCK_HEIGHT);
849 #if LCD_DEPTH >= 2
850 /* light drawing */
851 rb->lcd_set_foreground (figures[block].color[0]);
852 #endif
853 rb->lcd_vline (BOARD_X + i * BLOCK_WIDTH,
854 BOARD_Y + j * BLOCK_HEIGHT,
855 BOARD_Y + (j + 1) * BLOCK_HEIGHT - 2);
856 rb->lcd_hline (BOARD_X + i * BLOCK_WIDTH,
857 BOARD_X + (i + 1) * BLOCK_WIDTH - 2,
858 BOARD_Y + j * BLOCK_HEIGHT);
859 #if LCD_DEPTH >= 2
860 /* shadow drawing */
861 rb->lcd_set_foreground (figures[block].color[2]);
862 #endif
863 rb->lcd_vline (BOARD_X + (i + 1) * BLOCK_WIDTH - 1,
864 BOARD_Y + j * BLOCK_HEIGHT + 1,
865 BOARD_Y + (j + 1) * BLOCK_HEIGHT - 1);
866 rb->lcd_hline (BOARD_X + i * BLOCK_WIDTH + 1,
867 BOARD_X + (i + 1) * BLOCK_WIDTH - 1,
868 BOARD_Y + (j + 1) * BLOCK_HEIGHT - 1);
869 #else /* HAVE_LCD_CHARCELLS */
870 pgfx_drawpixel (BOARD_X + i, BOARD_Y + j);
871 #endif
875 for (i = 0; i < 4; i++) {
876 x = getRelativeX (cf, i, co) + cx;
877 y = getRelativeY (cf, i, co) + cy;
878 #ifdef HAVE_LCD_BITMAP
879 #if LCD_DEPTH >= 2
880 rb->lcd_set_foreground (figures[cf].color[1]); /* middle drawing */
881 #endif
882 rb->lcd_fillrect (BOARD_X + x * BLOCK_WIDTH,
883 BOARD_Y + y * BLOCK_HEIGHT,
884 BLOCK_WIDTH, BLOCK_HEIGHT);
885 #if LCD_DEPTH >= 2
886 rb->lcd_set_foreground (figures[cf].color[0]); /* light drawing */
887 #endif
888 rb->lcd_vline (BOARD_X + x * BLOCK_WIDTH, BOARD_Y + y * BLOCK_HEIGHT,
889 BOARD_Y + (y + 1) * BLOCK_HEIGHT - 2);
890 rb->lcd_hline (BOARD_X + x * BLOCK_WIDTH,
891 BOARD_X + (x + 1) * BLOCK_WIDTH - 2,
892 BOARD_Y + y * BLOCK_HEIGHT);
893 #if LCD_DEPTH >= 2
894 rb->lcd_set_foreground (figures[cf].color[2]); /* shadow drawing */
895 #endif
896 rb->lcd_vline (BOARD_X + (x + 1) * BLOCK_WIDTH - 1,
897 BOARD_Y + y * BLOCK_HEIGHT + 1,
898 BOARD_Y + (y + 1) * BLOCK_HEIGHT - 1);
899 rb->lcd_hline (BOARD_X + x * BLOCK_WIDTH + 1,
900 BOARD_X + (x + 1) * BLOCK_WIDTH - 1,
901 BOARD_Y + (y + 1) * BLOCK_HEIGHT - 1);
902 #else /* HAVE_LCD_CHARCELLS */
903 pgfx_drawpixel (BOARD_X + x, BOARD_Y + y);
904 #endif
906 MYLCD(update) ();
909 static bool canMoveTo (int x, int y, int newOrientation)
911 int i, rx, ry;
912 for (i = 0; i < 4; i++) {
913 ry = getRelativeY (cf, i, newOrientation) + y;
914 rx = getRelativeX (cf, i, newOrientation) + x;
915 if ((rx < 0 || rx >= BOARD_WIDTH) ||
916 (ry < 0 || ry >= BOARD_HEIGHT) || (board[ry][rx] != EMPTY_BLOCK))
917 return false;
919 return true;
922 /* draws the preview of next block in the preview window */
923 static void draw_next_block (void)
925 int i, rx, ry;
926 /* clear preview window first */
927 #if LCD_DEPTH >= 2
928 rb->lcd_set_foreground (LCD_BLACK);
929 #elif LCD_DEPTH == 1
930 MYLCD(set_drawmode) (DRMODE_SOLID | DRMODE_INVERSEVID);
931 #endif
933 /* 4x4 */
934 MYLCD(fillrect) (PREVIEW_X, PREVIEW_Y, BLOCK_WIDTH * 4, BLOCK_HEIGHT * 4);
936 #if LCD_DEPTH == 1
937 MYLCD(set_drawmode) (DRMODE_SOLID);
938 #endif
940 /* draw the lightgray rectangles */
941 #if LCD_DEPTH >= 16
942 rb->lcd_set_foreground (LCD_RGBPACK (40, 40, 40));
943 #elif LCD_DEPTH == 2
944 rb->lcd_set_foreground (LCD_DARKGRAY);
945 #endif
947 #if LCD_DEPTH >= 2
948 for (rx = 0; rx < 4; rx++)
949 for (ry = 0; ry < 4; ry++)
950 rb->lcd_drawrect (PREVIEW_X + rx * BLOCK_WIDTH,
951 PREVIEW_Y + ry * BLOCK_HEIGHT, BLOCK_WIDTH,
952 BLOCK_HEIGHT);
953 #endif
955 /* draw the figure */
956 for (i = 0; i < 4; i++) {
957 rx = getRelativeX (nf, i, 0) + 2;
958 ry = getRelativeY (nf, i, 0) + 2;
959 #ifdef HAVE_LCD_BITMAP
960 #if LCD_DEPTH >= 2
961 rb->lcd_set_foreground (figures[nf].color[1]); /* middle drawing */
962 #endif
963 rb->lcd_fillrect (PREVIEW_X + rx * BLOCK_WIDTH,
964 PREVIEW_Y + ry * BLOCK_HEIGHT,
965 BLOCK_WIDTH, BLOCK_HEIGHT);
966 #if LCD_DEPTH >= 2
967 rb->lcd_set_foreground (figures[nf].color[0]); /* light drawing */
968 #endif
969 rb->lcd_vline (PREVIEW_X + rx * BLOCK_WIDTH,
970 PREVIEW_Y + ry * BLOCK_HEIGHT,
971 PREVIEW_Y + (ry + 1) * BLOCK_HEIGHT - 2);
972 rb->lcd_hline (PREVIEW_X + rx * BLOCK_WIDTH,
973 PREVIEW_X + (rx + 1) * BLOCK_WIDTH - 2,
974 PREVIEW_Y + ry * BLOCK_HEIGHT);
975 #if LCD_DEPTH >= 2
976 rb->lcd_set_foreground (figures[nf].color[2]); /* shadow drawing */
977 #endif
978 rb->lcd_vline (PREVIEW_X + (rx + 1) * BLOCK_WIDTH - 1,
979 PREVIEW_Y + ry * BLOCK_HEIGHT + 1,
980 PREVIEW_Y + (ry + 1) * BLOCK_HEIGHT - 1);
981 rb->lcd_hline (PREVIEW_X + rx * BLOCK_WIDTH + 1,
982 PREVIEW_X + (rx + 1) * BLOCK_WIDTH - 1,
983 PREVIEW_Y + (ry + 1) * BLOCK_HEIGHT - 1);
984 #else /* HAVE_LCD_CHARCELLS */
985 pgfx_drawpixel (PREVIEW_X + rx, PREVIEW_Y + ry);
986 #endif
991 /* move the block to a relative location */
992 static void move_block (int x, int y, int o)
994 if (canMoveTo (cx + x, cy + y, o)) {
995 cy += y;
996 cx += x;
997 co = o;
1001 /* try to add a new block to play with (return true if gameover) */
1002 static void new_block (void)
1004 cy = 1;
1005 cx = 5;
1006 cf = nf;
1007 co = 0; /* start at the same orientation all time */
1008 nf = t_rand (BLOCKS_NUM);
1009 gameover = !canMoveTo (cx, cy, co);
1011 draw_next_block ();
1015 /* check for filled lines and do what necessary */
1016 static int check_lines (void)
1018 int i, j, y;
1019 int rockblox = 0;
1021 for (j = 0; j < BOARD_HEIGHT; j++) {
1022 for (i = 0; ((i < BOARD_WIDTH) && (board[j][i] != EMPTY_BLOCK)); i++);
1023 if (i == BOARD_WIDTH) { /* woo hoo, we have a line */
1024 rockblox++;
1025 for (y = j; y > 0; y--)
1026 for (i = 0; i < BOARD_WIDTH; i++)
1027 board[y][i] = board[y - 1][i]; /* fall line */
1031 return rockblox;
1034 /* moves down the figure and returns true if gameover */
1035 static void move_down (void)
1037 int l, i, rx, ry;
1039 if (!canMoveTo (cx, cy + 1, co)) {
1040 /* save figure to board */
1041 for (i = 0; i < 4; i++) {
1042 rx = getRelativeX (cf, i, co) + cx;
1043 ry = getRelativeY (cf, i, co) + cy;
1044 board[ry][rx] = cf;
1046 /* check if formed some lines */
1047 l = check_lines ();
1048 if (l) {
1049 /* the original scoring from "http://en.wikipedia.org/wiki/Rockblox" */
1050 score += scoring[l - 1] * level;
1051 lines += l;
1052 level = (int) lines / 10 + 1;
1055 /* show details */
1056 show_details ();
1058 /* generate a new figure */
1059 new_block ();
1060 } else
1061 move_block (0, 1, co);
1064 static int rockblox_loop (void)
1066 int button;
1067 int lastbutton = BUTTON_NONE;
1068 long next_down_tick = *rb->current_tick + level_speed(level);
1070 new_block ();
1072 while (1) {
1073 #ifdef HAS_BUTTON_HOLD
1074 if (rb->button_hold ()) {
1075 /* Turn on backlight timeout (revert to settings) */
1076 backlight_use_settings(); /* backlight control in lib/helper.c */
1077 rb->splash(0, "Paused");
1078 while (rb->button_hold ())
1079 rb->sleep(HZ/10);
1081 /* Turn off backlight timeout */
1082 backlight_force_on(); /* backlight control in lib/helper.c */
1084 /* get rid of the splash text */
1085 rb->lcd_bitmap (rockblox_background, 0, 0, LCD_WIDTH, LCD_HEIGHT);
1086 show_details ();
1087 #ifdef HIGH_SCORE_Y
1088 show_highscores ();
1089 #endif
1090 draw_next_block ();
1091 refresh_board ();
1093 #endif
1095 button = rb->button_get_w_tmo (MAX(next_down_tick - *rb->current_tick, 1));
1096 switch (button) {
1097 #ifdef ROCKBLOX_RC_OFF
1098 case ROCKBLOX_RC_OFF:
1099 #endif
1100 case ROCKBLOX_OFF:
1101 return PLUGIN_OK;
1103 #if defined(ROCKBLOX_ROTATE)
1104 case ROCKBLOX_ROTATE:
1105 #endif
1106 case ROCKBLOX_ROTATE_RIGHT:
1107 case ROCKBLOX_ROTATE_RIGHT | BUTTON_REPEAT:
1108 #ifdef HAVE_SCROLLWHEEL
1109 /* if the wheel is disabled, add an event to the stack. */
1110 if(wheel_enabled == false)
1111 wheel_events++;
1113 /* if it's enabled, go ahead and rotate.. */
1114 if(wheel_enabled)
1115 #endif
1116 move_block (0, 0, (co + 1) % figures[cf].max_or);
1117 break;
1119 case ROCKBLOX_ROTATE_LEFT:
1120 case ROCKBLOX_ROTATE_LEFT | BUTTON_REPEAT:
1121 #ifdef HAVE_SCROLLWHEEL
1122 if(wheel_enabled == false)
1123 wheel_events++;
1125 if(wheel_enabled)
1126 #endif
1127 move_block (0, 0,
1128 (co + figures[cf].max_or -
1129 1) % figures[cf].max_or);
1130 break;
1132 #ifdef ROCKBLOX_ROTATE_RIGHT2
1133 case ROCKBLOX_ROTATE_RIGHT2:
1134 move_block (0, 0, (co + 1) % figures[cf].max_or);
1135 break;
1136 #endif
1138 case ROCKBLOX_DOWN:
1139 case ROCKBLOX_DOWN | BUTTON_REPEAT:
1140 move_block (0, 1, co);
1141 break;
1143 case ROCKBLOX_RIGHT:
1144 case ROCKBLOX_RIGHT | BUTTON_REPEAT:
1145 move_block (1, 0, co);
1146 break;
1148 case ROCKBLOX_LEFT:
1149 case ROCKBLOX_LEFT | BUTTON_REPEAT:
1150 move_block (-1, 0, co);
1151 break;
1153 case ROCKBLOX_DROP:
1154 #ifdef ROCKBLOX_DROP_PRE
1155 if (lastbutton != ROCKBLOX_DROP_PRE)
1156 break;
1157 #endif
1158 while (canMoveTo (cx, cy + 1, co))
1159 move_block (0, 1, co);
1160 break;
1161 #ifdef ROCKBLOX_RESTART
1162 case ROCKBLOX_RESTART:
1163 rb->splash (HZ * 1, "Restarting...");
1164 init_rockblox ();
1165 new_block ();
1166 break;
1167 #endif
1169 default:
1170 if (rb->default_event_handler (button) == SYS_USB_CONNECTED)
1171 return PLUGIN_USB_CONNECTED;
1172 break;
1174 if (button != BUTTON_NONE)
1175 lastbutton = button;
1177 #ifdef HAVE_SCROLLWHEEL
1178 /* check if we should enable the scroll wheel, if events
1179 * begin to stack up... */
1180 if(wheel_enabled == false)
1182 /* stopped rotating the wheel, reset the count */
1183 if(wheel_events == last_wheel_event)
1185 last_wheel_event = 0;
1186 wheel_events = 0;
1188 /* rotated the wheel a while constantly, enable it. */
1189 else if(wheel_events > 3)
1191 wheel_enabled = true;
1194 /* this evens out the last event and the "current" event.
1195 * if we get an event next time through button reading, it will
1196 * remain ahead of last_event. if we don't, they'll end up equaling
1197 * each other.. thus, the scroll count will be reset. */
1198 if(wheel_enabled == false && wheel_events > last_wheel_event)
1199 last_wheel_event++;
1201 #endif
1203 if (TIME_AFTER(*rb->current_tick, next_down_tick)) {
1204 move_down ();
1205 next_down_tick += level_speed(level);
1206 if (TIME_AFTER(*rb->current_tick, next_down_tick))
1207 /* restart time "raster" when we had to wait longer than usual
1208 * (pause, game restart etc) */
1209 next_down_tick = *rb->current_tick + level_speed(level);
1212 if (gameover) {
1213 #if LCD_DEPTH >= 2
1214 rb->lcd_set_foreground (LCD_BLACK);
1215 #endif
1216 rb->splash (HZ * 2, "Game Over");
1217 init_rockblox ();
1218 new_block ();
1221 refresh_board ();
1224 return PLUGIN_OK;
1227 enum plugin_status plugin_start (const void *parameter)
1229 int ret;
1231 (void) parameter;
1233 rb->srand (*rb->current_tick);
1235 /* Load HighScore if any */
1236 highscore_load(HIGH_SCORE,Highest,MAX_HIGH_SCORES);
1238 #if LCD_DEPTH > 1
1239 rb->lcd_set_backdrop(NULL);
1240 #endif
1242 #ifdef HAVE_LCD_BITMAP
1243 rb->lcd_setfont (FONT_SYSFIXED);
1244 #else
1245 if (!pgfx_init(4, 2))
1247 rb->splash(HZ*2, "Old LCD :(");
1248 return PLUGIN_OK;
1250 #endif
1251 /* Turn off backlight timeout */
1252 backlight_force_on(); /* backlight control in lib/helper.c */
1254 init_rockblox ();
1255 ret = rockblox_loop ();
1257 #ifdef HAVE_LCD_BITMAP
1258 rb->lcd_setfont (FONT_UI);
1259 #else
1260 pgfx_release();
1261 #endif
1262 /* Save user's HighScore */
1263 highscore_save(HIGH_SCORE,Highest,MAX_HIGH_SCORES);
1264 backlight_use_settings(); /* backlight control in lib/helper.c */
1266 return ret;