FS#10075 - FUZE: QUIT Plugin by selecting BUTTON_HOME by Johannes Schwarz. Updates...
[kugel-rb/myfork.git] / apps / plugins / rockblox.c
blob1c23663cdb290773420058fd1466f0c5c2535758
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
210 #define ROCKBLOX_ROTATE_RIGHT BUTTON_RC_VOL_UP
211 #define ROCKBLOX_ROTATE_LEFT BUTTON_RC_VOL_DOWN
212 #define ROCKBLOX_DOWN BUTTON_RC_DOWN
213 #define ROCKBLOX_LEFT BUTTON_LEFT
214 #define ROCKBLOX_RIGHT BUTTON_RIGHT
215 #define ROCKBLOX_DROP BUTTON_RC_HEART
216 #define ROCKBLOX_RESTART BUTTON_RC_MODE
218 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
219 #define ROCKBLOX_OFF BUTTON_BACK
220 #define ROCKBLOX_ROTATE_RIGHT BUTTON_VOL_DOWN
221 #define ROCKBLOX_ROTATE_LEFT BUTTON_VOL_UP
222 #define ROCKBLOX_ROTATE BUTTON_UP
223 #define ROCKBLOX_DOWN BUTTON_DOWN
224 #define ROCKBLOX_LEFT BUTTON_LEFT
225 #define ROCKBLOX_RIGHT BUTTON_RIGHT
226 #define ROCKBLOX_DROP BUTTON_SELECT
227 #define ROCKBLOX_RESTART BUTTON_PLAY
229 #elif CONFIG_KEYPAD == MROBE100_PAD
231 #define ROCKBLOX_OFF BUTTON_POWER
232 #define ROCKBLOX_ROTATE_RIGHT BUTTON_MENU
233 #define ROCKBLOX_ROTATE_LEFT BUTTON_PLAY
234 #define ROCKBLOX_ROTATE BUTTON_UP
235 #define ROCKBLOX_DOWN BUTTON_DOWN
236 #define ROCKBLOX_LEFT BUTTON_LEFT
237 #define ROCKBLOX_RIGHT BUTTON_RIGHT
238 #define ROCKBLOX_DROP BUTTON_SELECT
239 #define ROCKBLOX_RESTART BUTTON_DISPLAY
241 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
243 #define ROCKBLOX_OFF BUTTON_RC_REC
244 #define ROCKBLOX_ROTATE_RIGHT BUTTON_RC_VOL_DOWN
245 #define ROCKBLOX_ROTATE_LEFT BUTTON_RC_VOL_UP
246 #define ROCKBLOX_DOWN BUTTON_RC_MENU
247 #define ROCKBLOX_LEFT BUTTON_RC_REW
248 #define ROCKBLOX_RIGHT BUTTON_RC_FF
249 #define ROCKBLOX_DROP BUTTON_RC_PLAY
250 #define ROCKBLOX_RESTART BUTTON_RC_MODE
252 #elif CONFIG_KEYPAD == COWOND2_PAD
253 #define ROCKBLOX_OFF BUTTON_POWER
254 #define ROCKBLOX_RESTART BUTTON_MENU
256 #elif CONFIG_KEYPAD == IAUDIO67_PAD
258 #define ROCKBLOX_OFF BUTTON_POWER
259 #define ROCKBLOX_ROTATE_RIGHT BUTTON_VOLDOWN
260 #define ROCKBLOX_ROTATE_LEFT BUTTON_VOLUP
261 #define ROCKBLOX_DOWN BUTTON_STOP
262 #define ROCKBLOX_LEFT BUTTON_LEFT
263 #define ROCKBLOX_RIGHT BUTTON_RIGHT
264 #define ROCKBLOX_DROP BUTTON_PLAY
265 #define ROCKBLOX_RESTART BUTTON_MENU
267 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
268 #define ROCKBLOX_OFF BUTTON_BACK
269 #define ROCKBLOX_ROTATE_RIGHT BUTTON_UP
270 #define ROCKBLOX_ROTATE_LEFT BUTTON_PLAY
271 #define ROCKBLOX_DOWN BUTTON_DOWN
272 #define ROCKBLOX_LEFT BUTTON_LEFT
273 #define ROCKBLOX_RIGHT BUTTON_RIGHT
274 #define ROCKBLOX_DROP BUTTON_SELECT
275 #define ROCKBLOX_RESTART BUTTON_CUSTOM
277 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
279 #define ROCKBLOX_OFF BUTTON_POWER
280 #define ROCKBLOX_ROTATE_RIGHT BUTTON_VOL_DOWN
281 #define ROCKBLOX_ROTATE_LEFT BUTTON_VOL_UP
282 #define ROCKBLOX_ROTATE BUTTON_UP
283 #define ROCKBLOX_DOWN BUTTON_DOWN
284 #define ROCKBLOX_LEFT BUTTON_LEFT
285 #define ROCKBLOX_RIGHT BUTTON_RIGHT
286 #define ROCKBLOX_DROP BUTTON_SELECT
287 #define ROCKBLOX_RESTART BUTTON_MENU
289 #elif CONFIG_KEYPAD == ONDAVX747_PAD
290 #define ROCKBLOX_OFF BUTTON_POWER
291 #define ROCKBLOX_RESTART BUTTON_MENU
293 #else
294 #error No keymap defined!
295 #endif
297 #ifdef HAVE_TOUCHSCREEN
298 #ifndef ROCKBLOX_OFF
299 #define ROCKBLOX_OFF BUTTON_TOPLEFT
300 #endif
301 #ifndef ROCKBLOX_ROTATE_RIGHT
302 #define ROCKBLOX_ROTATE_RIGHT BUTTON_BOTTOMRIGHT
303 #endif
304 #ifndef ROCKBLOX_ROTATE_LEFT
305 #define ROCKBLOX_ROTATE_LEFT BUTTON_BOTTOMLEFT
306 #endif
307 #ifndef ROCKBLOX_DOWN
308 #define ROCKBLOX_DOWN BUTTON_BOTTOMMIDDLE
309 #endif
310 #ifndef ROCKBLOX_LEFT
311 #define ROCKBLOX_LEFT BUTTON_MIDLEFT
312 #endif
313 #ifndef ROCKBLOX_RIGHT
314 #define ROCKBLOX_RIGHT BUTTON_MIDRIGHT
315 #endif
316 #ifndef ROCKBLOX_DROP
317 #define ROCKBLOX_DROP BUTTON_CENTER
318 #endif
319 #ifndef ROCKBLOX_RESTART
320 #define ROCKBLOX_RESTART BUTTON_TOPRIGHT
321 #endif
322 #endif
324 #define BLOCKS_NUM 7
325 #define EMPTY_BLOCK 7
327 #define BOARD_WIDTH 10
329 #ifdef HAVE_LCD_BITMAP
331 #define BOARD_HEIGHT 20
333 #if (LCD_WIDTH == 640) && (LCD_HEIGHT == 480)
335 #define BLOCK_WIDTH 30
336 #define BLOCK_HEIGHT 30
337 #define BOARD_X 14
338 #define BOARD_Y 2
339 #define PREVIEW_X 342
340 #define PREVIEW_Y 482
341 #define LABEL_X 344
342 #define SCORE_Y 58
343 #define LEVEL_Y 142
344 #define LINES_Y 218
345 #define HIGH_LABEL_X 344
346 #define HIGH_SCORE_Y 326
347 #define HIGH_LEVEL_Y 344
349 #elif (LCD_WIDTH == 480) && (LCD_HEIGHT == 640)
351 #define BLOCK_WIDTH 30
352 #define BLOCK_HEIGHT 30
353 #define BOARD_X 14
354 #define BOARD_Y 2
355 #define PREVIEW_X 342
356 #define PREVIEW_Y 482
357 #define LABEL_X 344
358 #define SCORE_Y 58
359 #define LEVEL_Y 142
360 #define LINES_Y 218
361 #define HIGH_LABEL_X 344
362 #define HIGH_SCORE_Y 326
363 #define HIGH_LEVEL_Y 344
365 #elif (LCD_WIDTH == 320) && (LCD_HEIGHT == 240)
367 #define BLOCK_WIDTH 12
368 #define BLOCK_HEIGHT 12
369 #define BOARD_X 86
370 #define BOARD_Y 0
371 #define PREVIEW_X 12
372 #define PREVIEW_Y 11
373 #define LABEL_X 242
374 #define SCORE_Y 25
375 #define LEVEL_Y 70
376 #define LINES_Y 105
378 #elif (LCD_WIDTH == 240) && ((LCD_HEIGHT == 320) || (LCD_HEIGHT == 400))
380 #define BLOCK_WIDTH 15
381 #define BLOCK_HEIGHT 15
382 #define BOARD_X 7
383 #define BOARD_Y 1
384 #define PREVIEW_X 171
385 #define PREVIEW_Y 241
386 #define LABEL_X 172
387 #define SCORE_Y 29
388 #define LEVEL_Y 71
389 #define LINES_Y 109
390 #define HIGH_LABEL_X 172
391 #define HIGH_SCORE_Y 163
392 #define HIGH_LEVEL_Y 172
394 #elif (LCD_WIDTH == 220) && (LCD_HEIGHT == 176)
396 #define BLOCK_WIDTH 8
397 #define BLOCK_HEIGHT 8
398 #define BOARD_X 27
399 #define BOARD_Y 5
400 #define PREVIEW_X 158
401 #define PREVIEW_Y 130
402 #define LABEL_X 147
403 #define SCORE_Y 20
404 #define LEVEL_Y 65
405 #define LINES_Y 100
407 #elif (LCD_WIDTH == 176) && (LCD_HEIGHT == 132)
409 #define BLOCK_WIDTH 6
410 #define BLOCK_HEIGHT 6
411 #define BOARD_X 25
412 #define BOARD_Y 1
413 #define PREVIEW_X 126
414 #define PREVIEW_Y 102
415 #define LABEL_X 112
416 #define SCORE_Y 17
417 #define LEVEL_Y 49
418 #define LINES_Y 81
420 #elif (LCD_WIDTH == 176) && (LCD_HEIGHT == 220)
422 #define BLOCK_WIDTH 10
423 #define BLOCK_HEIGHT 10
424 #define BOARD_X 6
425 #define BOARD_Y 10
426 #define PREVIEW_X 124
427 #define PREVIEW_Y 167
428 #define LABEL_X 117
429 #define SCORE_Y 24
430 #define LEVEL_Y 65
431 #define LINES_Y 103
432 #elif (LCD_WIDTH == 160) && (LCD_HEIGHT == 128)
434 #define BLOCK_WIDTH 6
435 #define BLOCK_HEIGHT 6
436 #define BOARD_X 22
437 #define BOARD_Y 3
438 #define PREVIEW_X 114
439 #define PREVIEW_Y 100
440 #define LABEL_X 101
441 #define SCORE_Y 17
442 #define LEVEL_Y 49
443 #define LINES_Y 82
445 #elif (LCD_WIDTH == 138) && (LCD_HEIGHT == 110)
447 #define BLOCK_WIDTH 5
448 #define BLOCK_HEIGHT 5
449 #define BOARD_X 14
450 #define BOARD_Y 0
451 #define PREVIEW_X 98
452 #define PREVIEW_Y 88
453 #define LABEL_X 80
454 #define SCORE_Y 15
455 #define LEVEL_Y 45
456 #define LINES_Y 74
458 #elif (LCD_WIDTH == 132) && (LCD_HEIGHT == 80)
460 #define BLOCK_WIDTH 4
461 #define BLOCK_HEIGHT 4
462 #define BOARD_X 10
463 #define BOARD_Y 0
464 #define PREVIEW_X 89
465 #define PREVIEW_Y 61
466 #define LABEL_X 78
467 #define SCORE_Y 10
468 #define LEVEL_Y 30
469 #define LINES_Y 50
471 #elif (LCD_WIDTH == 128) && (LCD_HEIGHT == 128)
473 #define BLOCK_WIDTH 6
474 #define BLOCK_HEIGHT 6
475 #define BOARD_X 4
476 #define BOARD_Y 3
477 #define PREVIEW_X 84
478 #define PREVIEW_Y 100
479 #define LABEL_X 71
480 #define SCORE_Y 17
481 #define LEVEL_Y 49
482 #define LINES_Y 82
484 #elif (LCD_WIDTH == 128) && (LCD_HEIGHT == 96)
486 #define BLOCK_WIDTH 4
487 #define BLOCK_HEIGHT 4
488 #define BOARD_X 14
489 #define BOARD_Y 2
490 #define PREVIEW_X 89
491 #define PREVIEW_Y 76
492 #define LABEL_X 70
493 #define SCORE_Y 14
494 #define LEVEL_Y 39
495 #define LINES_Y 64
497 #elif (LCD_WIDTH == 128) && (LCD_HEIGHT == 64)
499 #define BLOCK_WIDTH 3
500 #define BLOCK_HEIGHT 3
501 #define BOARD_X 9
502 #define BOARD_Y 3
503 #define PREVIEW_X 53
504 #define PREVIEW_Y 5
505 #define LABEL_X 70
506 #define SCORE_Y 32
507 #define LEVEL_Y 13
508 #define LINES_Y 51
510 #elif (LCD_WIDTH == 112) && (LCD_HEIGHT == 64)
512 #define BLOCK_WIDTH 4
513 #define BLOCK_HEIGHT 3
514 #define BOARD_X 9
515 #define BOARD_Y 3
516 #define PREVIEW_X 59
517 #define PREVIEW_Y 5
518 #define LABEL_X 59
519 #define SCORE_Y 32
520 #define LEVEL_Y 13
521 #define LEVEL_X 78
522 #define LINES_Y 51
524 #endif
526 #ifndef LEVEL_X
527 #define LEVEL_X LABEL_X
528 #endif
530 #ifndef LINES_X
531 #define LINES_X LABEL_X
532 #endif
534 #define MYLCD(fn) rb->lcd_ ## fn
536 extern const fb_data rockblox_background[];
538 #else /* HAVE_LCD_CHARCELLS */
540 #define BOARD_HEIGHT 14
542 #define BLOCK_WIDTH 1
543 #define BLOCK_HEIGHT 1
544 #define BOARD_X 5
545 #define BOARD_Y 0
546 #define PREVIEW_X 15
547 #define PREVIEW_Y 1
549 #define MYLCD(fn) pgfx_ ## fn
551 #endif
553 /* <<Explanation on Rockblox shapes>>
556 %% - O has 1 orientation
558 %% %
559 %% %% - Z has 2 orientations
562 %% %
563 %% %% - S has 2 orientations
567 % %%%% - I has 2 orientations
570 % %%
571 % % % %%% - L has 4 orientations
572 %% %%% % %
574 % %%
575 % % % %%% - J has 4 orientations
576 %% %%% % %
578 % % %%%
579 %% % %% % - T has 4 orientations
580 % %%% %
584 static bool gameover = false;
585 /* c=current f=figure o=orientation n=next */
586 static int lines = 0, level = 0, score = 0, cx, cy, cf, co, nf;
587 static short board[BOARD_HEIGHT][BOARD_WIDTH]; /* 20 rows of 10 blocks */
589 #ifdef HAVE_SCROLLWHEEL
590 int wheel_events = 0, last_wheel_event = 0;
591 bool wheel_enabled = false;
592 #endif
594 static const short scoring[4] = { /* scoring for each number of lines */
595 #if BOARD_HEIGHT == 20
596 40 /* single */ , 100 /* double */ , 300 /* triple */ , 1200 /* rockblox */
597 #elif BOARD_HEIGHT == 14 /* Player special values */
598 60 /* single */ , 150 /* double */ , 500 /* triple */ , 2000 /* rockblox */
599 #endif
602 struct figure
604 #if LCD_DEPTH >= 2
605 unsigned short color[3]; /* color of figure (light,middle,shadow) */
606 #endif
607 unsigned short max_or; /* max orientations */
608 signed short shapeX[4], shapeY[4]; /* implementation of figures */
611 /* array of figures */
612 figures[BLOCKS_NUM] = {
613 /* O */
615 #if LCD_DEPTH >= 16
616 {LCD_RGBPACK (153, 255, 255), LCD_RGBPACK(0, 255, 255),
617 LCD_RGBPACK(0,153,153)},
618 #elif LCD_DEPTH == 2
619 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
620 #endif
622 {-1, 0, -1, 0},
623 {0, 0, 1, 1}
625 /* I */
627 #if LCD_DEPTH >= 16
628 {LCD_RGBPACK (255, 153, 128), LCD_RGBPACK (255, 0, 0),
629 LCD_RGBPACK (153, 0, 0)},
630 #elif LCD_DEPTH == 2
631 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
632 #endif
634 {-2, -1, 0, 1},
635 {0, 0, 0, 0}
637 /* 'Z' */
639 #if LCD_DEPTH >= 16
640 {LCD_RGBPACK (153, 255, 153), LCD_RGBPACK (0, 255, 0),
641 LCD_RGBPACK (0, 153, 0)},
642 #elif LCD_DEPTH == 2
643 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
644 #endif
646 {0, 1, -1, 0},
647 {0, 0, 1, 1}
649 /* 'S' */
651 #if LCD_DEPTH >= 16
652 {LCD_RGBPACK (153, 153, 255), LCD_RGBPACK (0, 0, 255),
653 LCD_RGBPACK (0, 0, 153)},
654 #elif LCD_DEPTH == 2
655 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
656 #endif
658 {-1, 0, 0, 1},
659 {0, 0, 1, 1}
661 /* 'L' */
663 #if LCD_DEPTH >= 16
664 {LCD_RGBPACK (255, 255, 153), LCD_RGBPACK (255, 255, 0),
665 LCD_RGBPACK (153, 153, 0)},
666 #elif LCD_DEPTH == 2
667 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
668 #endif
670 {-1, 0, 1, 1},
671 {0, 0, 0, 1}
673 /* 'J' */
675 #if LCD_DEPTH >= 16
676 {LCD_RGBPACK (255, 153, 255), LCD_RGBPACK (255, 0, 255),
677 LCD_RGBPACK (153, 0, 153)},
678 #elif LCD_DEPTH == 2
679 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
680 #endif
682 {-1, 0, 1, -1},
683 {0, 0, 0, 1}
685 /* 'T' */
687 #if LCD_DEPTH >= 16
688 {LCD_RGBPACK (204, 204, 204), LCD_RGBPACK (153, 153, 153),
689 LCD_RGBPACK (85, 85, 85)},
690 #elif LCD_DEPTH == 2
691 {LCD_WHITE, LCD_LIGHTGRAY, LCD_DARKGRAY},
692 #endif
694 {-1, 0, 1, 0},
695 {0, 0, 0, 1}
699 /* Rockbox File System only supports full filenames inc dir */
700 #define HIGH_SCORE PLUGIN_GAMES_DIR "/rockblox.score"
701 #define MAX_HIGH_SCORES 5
702 /* Default High Scores... */
703 struct highscore Highest[MAX_HIGH_SCORES];
705 /* get random number from (0) to (range-1) */
706 static int t_rand (int range)
708 return rb->rand () % range;
711 /* init the board array to have no blocks */
712 static void init_board (void)
714 int i, j;
715 for (i = 0; i < BOARD_WIDTH; i++)
716 for (j = 0; j < BOARD_HEIGHT; j++)
717 board[j][i] = EMPTY_BLOCK;
720 /* show the score, level and lines */
721 static void show_details (void)
723 char str[25]; /* for strings */
725 #ifdef HAVE_LCD_BITMAP
726 #if LCD_DEPTH >= 2
727 rb->lcd_set_foreground (LCD_BLACK);
728 rb->lcd_set_background (LCD_WHITE);
729 #endif
730 rb->snprintf (str, sizeof (str), "%d", score);
731 rb->lcd_putsxy (LABEL_X, SCORE_Y, str);
732 rb->snprintf (str, sizeof (str), "%d", level);
733 rb->lcd_putsxy (LEVEL_X, LEVEL_Y, str);
734 rb->snprintf (str, sizeof (str), "%d", lines);
735 rb->lcd_putsxy (LINES_X, LINES_Y, str);
736 #else /* HAVE_LCD_CHARCELLS */
737 rb->snprintf (str, sizeof (str), "L%d/%d", level, lines);
738 rb->lcd_puts (5, 0, str);
739 rb->snprintf (str, sizeof (str), "S%d", score);
740 rb->lcd_puts (5, 1, str);
741 #endif
744 #ifdef HIGH_SCORE_Y
745 static void show_highscores (void)
747 int i;
748 char str[25]; /* for strings */
750 for (i = MAX_HIGH_SCORES-1; i>=0; i--)
752 rb->snprintf (str, sizeof (str), "%06d L%1d", Highest[i].score, Highest[i].level);
753 rb->lcd_putsxy (HIGH_LABEL_X, HIGH_SCORE_Y + (10 * ((MAX_HIGH_SCORES-1) - i)), str);
756 #endif
758 static void init_rockblox (void)
760 highscore_update(score, level, Highest, MAX_HIGH_SCORES);
762 level = 1;
763 lines = 0;
764 score = 0;
765 gameover = false;
766 nf = t_rand (BLOCKS_NUM);
767 init_board ();
768 #ifdef HAVE_LCD_BITMAP
769 rb->lcd_bitmap (rockblox_background, 0, 0, LCD_WIDTH, LCD_HEIGHT);
770 #else /* HAVE_LCD_CHARCELLS */
771 pgfx_display (0, 0);
772 pgfx_display_block (3, 0, 3, 1);
773 pgfx_display_block (4, 0, 3, 0);
774 pgfx_clear_display();
775 pgfx_fillrect (3, 0, 2, 14);
776 pgfx_fillrect (15, 7, 2, 7);
777 pgfx_update();
778 #endif
779 show_details ();
780 #ifdef HIGH_SCORE_Y
781 show_highscores ();
782 #endif
785 static inline int level_speed(int level)
787 #if BOARD_HEIGHT == 20
788 return (5*HZ) / (level + 9);
789 #elif BOARD_HEIGHT == 14
790 return (7*HZ) / (level + 9);
791 #endif
794 static int getRelativeX (int figure, int square, int orientation)
796 switch (orientation) {
797 case 0:
798 return figures[figure].shapeX[square];
799 case 1:
800 return figures[figure].shapeY[square];
801 case 2:
802 return -figures[figure].shapeX[square];
803 case 3:
804 return -figures[figure].shapeY[square];
805 default:
806 return 0;
810 static int getRelativeY (int figure, int square, int orientation)
812 switch (orientation) {
813 case 0:
814 return figures[figure].shapeY[square];
815 case 1:
816 return -figures[figure].shapeX[square];
817 case 2:
818 return -figures[figure].shapeY[square];
819 case 3:
820 return figures[figure].shapeX[square];
821 default:
822 return 0;
826 /* redraw the while board on the screen */
827 static void refresh_board (void)
829 int i, j, x, y, block;
831 #if LCD_DEPTH >= 2
832 rb->lcd_set_foreground (LCD_BLACK);
833 #elif LCD_DEPTH == 1
834 MYLCD(set_drawmode) (DRMODE_SOLID | DRMODE_INVERSEVID);
835 #endif
837 MYLCD(fillrect) (BOARD_X, BOARD_Y, BOARD_WIDTH * BLOCK_WIDTH,
838 BOARD_HEIGHT * BLOCK_HEIGHT);
840 #if LCD_DEPTH == 1
841 MYLCD(set_drawmode) (DRMODE_SOLID);
842 #endif
844 for (i = 0; i < BOARD_WIDTH; i++)
845 for (j = 0; j < BOARD_HEIGHT; j++) {
846 block = board[j][i];
847 if (block != EMPTY_BLOCK) {
848 #ifdef HAVE_LCD_BITMAP
849 #if LCD_DEPTH >= 2
850 /* middle drawing */
851 rb->lcd_set_foreground (figures[block].color[1]);
852 #endif
853 rb->lcd_fillrect (BOARD_X + i * BLOCK_WIDTH,
854 BOARD_Y + j * BLOCK_HEIGHT,
855 BLOCK_WIDTH, BLOCK_HEIGHT);
856 #if LCD_DEPTH >= 2
857 /* light drawing */
858 rb->lcd_set_foreground (figures[block].color[0]);
859 #endif
860 rb->lcd_vline (BOARD_X + i * BLOCK_WIDTH,
861 BOARD_Y + j * BLOCK_HEIGHT,
862 BOARD_Y + (j + 1) * BLOCK_HEIGHT - 2);
863 rb->lcd_hline (BOARD_X + i * BLOCK_WIDTH,
864 BOARD_X + (i + 1) * BLOCK_WIDTH - 2,
865 BOARD_Y + j * BLOCK_HEIGHT);
866 #if LCD_DEPTH >= 2
867 /* shadow drawing */
868 rb->lcd_set_foreground (figures[block].color[2]);
869 #endif
870 rb->lcd_vline (BOARD_X + (i + 1) * BLOCK_WIDTH - 1,
871 BOARD_Y + j * BLOCK_HEIGHT + 1,
872 BOARD_Y + (j + 1) * BLOCK_HEIGHT - 1);
873 rb->lcd_hline (BOARD_X + i * BLOCK_WIDTH + 1,
874 BOARD_X + (i + 1) * BLOCK_WIDTH - 1,
875 BOARD_Y + (j + 1) * BLOCK_HEIGHT - 1);
876 #else /* HAVE_LCD_CHARCELLS */
877 pgfx_drawpixel (BOARD_X + i, BOARD_Y + j);
878 #endif
882 for (i = 0; i < 4; i++) {
883 x = getRelativeX (cf, i, co) + cx;
884 y = getRelativeY (cf, i, co) + cy;
885 #ifdef HAVE_LCD_BITMAP
886 #if LCD_DEPTH >= 2
887 rb->lcd_set_foreground (figures[cf].color[1]); /* middle drawing */
888 #endif
889 rb->lcd_fillrect (BOARD_X + x * BLOCK_WIDTH,
890 BOARD_Y + y * BLOCK_HEIGHT,
891 BLOCK_WIDTH, BLOCK_HEIGHT);
892 #if LCD_DEPTH >= 2
893 rb->lcd_set_foreground (figures[cf].color[0]); /* light drawing */
894 #endif
895 rb->lcd_vline (BOARD_X + x * BLOCK_WIDTH, BOARD_Y + y * BLOCK_HEIGHT,
896 BOARD_Y + (y + 1) * BLOCK_HEIGHT - 2);
897 rb->lcd_hline (BOARD_X + x * BLOCK_WIDTH,
898 BOARD_X + (x + 1) * BLOCK_WIDTH - 2,
899 BOARD_Y + y * BLOCK_HEIGHT);
900 #if LCD_DEPTH >= 2
901 rb->lcd_set_foreground (figures[cf].color[2]); /* shadow drawing */
902 #endif
903 rb->lcd_vline (BOARD_X + (x + 1) * BLOCK_WIDTH - 1,
904 BOARD_Y + y * BLOCK_HEIGHT + 1,
905 BOARD_Y + (y + 1) * BLOCK_HEIGHT - 1);
906 rb->lcd_hline (BOARD_X + x * BLOCK_WIDTH + 1,
907 BOARD_X + (x + 1) * BLOCK_WIDTH - 1,
908 BOARD_Y + (y + 1) * BLOCK_HEIGHT - 1);
909 #else /* HAVE_LCD_CHARCELLS */
910 pgfx_drawpixel (BOARD_X + x, BOARD_Y + y);
911 #endif
913 MYLCD(update) ();
916 static bool canMoveTo (int x, int y, int newOrientation)
918 int i, rx, ry;
919 for (i = 0; i < 4; i++) {
920 ry = getRelativeY (cf, i, newOrientation) + y;
921 rx = getRelativeX (cf, i, newOrientation) + x;
922 if ((rx < 0 || rx >= BOARD_WIDTH) ||
923 (ry < 0 || ry >= BOARD_HEIGHT) || (board[ry][rx] != EMPTY_BLOCK))
924 return false;
926 return true;
929 /* draws the preview of next block in the preview window */
930 static void draw_next_block (void)
932 int i, rx, ry;
933 /* clear preview window first */
934 #if LCD_DEPTH >= 2
935 rb->lcd_set_foreground (LCD_BLACK);
936 #elif LCD_DEPTH == 1
937 MYLCD(set_drawmode) (DRMODE_SOLID | DRMODE_INVERSEVID);
938 #endif
940 /* 4x4 */
941 MYLCD(fillrect) (PREVIEW_X, PREVIEW_Y, BLOCK_WIDTH * 4, BLOCK_HEIGHT * 4);
943 #if LCD_DEPTH == 1
944 MYLCD(set_drawmode) (DRMODE_SOLID);
945 #endif
947 /* draw the lightgray rectangles */
948 #if LCD_DEPTH >= 16
949 rb->lcd_set_foreground (LCD_RGBPACK (40, 40, 40));
950 #elif LCD_DEPTH == 2
951 rb->lcd_set_foreground (LCD_DARKGRAY);
952 #endif
954 #if LCD_DEPTH >= 2
955 for (rx = 0; rx < 4; rx++)
956 for (ry = 0; ry < 4; ry++)
957 rb->lcd_drawrect (PREVIEW_X + rx * BLOCK_WIDTH,
958 PREVIEW_Y + ry * BLOCK_HEIGHT, BLOCK_WIDTH,
959 BLOCK_HEIGHT);
960 #endif
962 /* draw the figure */
963 for (i = 0; i < 4; i++) {
964 rx = getRelativeX (nf, i, 0) + 2;
965 ry = getRelativeY (nf, i, 0) + 2;
966 #ifdef HAVE_LCD_BITMAP
967 #if LCD_DEPTH >= 2
968 rb->lcd_set_foreground (figures[nf].color[1]); /* middle drawing */
969 #endif
970 rb->lcd_fillrect (PREVIEW_X + rx * BLOCK_WIDTH,
971 PREVIEW_Y + ry * BLOCK_HEIGHT,
972 BLOCK_WIDTH, BLOCK_HEIGHT);
973 #if LCD_DEPTH >= 2
974 rb->lcd_set_foreground (figures[nf].color[0]); /* light drawing */
975 #endif
976 rb->lcd_vline (PREVIEW_X + rx * BLOCK_WIDTH,
977 PREVIEW_Y + ry * BLOCK_HEIGHT,
978 PREVIEW_Y + (ry + 1) * BLOCK_HEIGHT - 2);
979 rb->lcd_hline (PREVIEW_X + rx * BLOCK_WIDTH,
980 PREVIEW_X + (rx + 1) * BLOCK_WIDTH - 2,
981 PREVIEW_Y + ry * BLOCK_HEIGHT);
982 #if LCD_DEPTH >= 2
983 rb->lcd_set_foreground (figures[nf].color[2]); /* shadow drawing */
984 #endif
985 rb->lcd_vline (PREVIEW_X + (rx + 1) * BLOCK_WIDTH - 1,
986 PREVIEW_Y + ry * BLOCK_HEIGHT + 1,
987 PREVIEW_Y + (ry + 1) * BLOCK_HEIGHT - 1);
988 rb->lcd_hline (PREVIEW_X + rx * BLOCK_WIDTH + 1,
989 PREVIEW_X + (rx + 1) * BLOCK_WIDTH - 1,
990 PREVIEW_Y + (ry + 1) * BLOCK_HEIGHT - 1);
991 #else /* HAVE_LCD_CHARCELLS */
992 pgfx_drawpixel (PREVIEW_X + rx, PREVIEW_Y + ry);
993 #endif
998 /* move the block to a relative location */
999 static void move_block (int x, int y, int o)
1001 if (canMoveTo (cx + x, cy + y, o)) {
1002 cy += y;
1003 cx += x;
1004 co = o;
1008 /* try to add a new block to play with (return true if gameover) */
1009 static void new_block (void)
1011 cy = 1;
1012 cx = 5;
1013 cf = nf;
1014 co = 0; /* start at the same orientation all time */
1015 nf = t_rand (BLOCKS_NUM);
1016 gameover = !canMoveTo (cx, cy, co);
1018 draw_next_block ();
1022 /* check for filled lines and do what necessary */
1023 static int check_lines (void)
1025 int i, j, y;
1026 int rockblox = 0;
1028 for (j = 0; j < BOARD_HEIGHT; j++) {
1029 for (i = 0; ((i < BOARD_WIDTH) && (board[j][i] != EMPTY_BLOCK)); i++);
1030 if (i == BOARD_WIDTH) { /* woo hoo, we have a line */
1031 rockblox++;
1032 for (y = j; y > 0; y--)
1033 for (i = 0; i < BOARD_WIDTH; i++)
1034 board[y][i] = board[y - 1][i]; /* fall line */
1038 return rockblox;
1041 /* moves down the figure and returns true if gameover */
1042 static void move_down (void)
1044 int l, i, rx, ry;
1046 if (!canMoveTo (cx, cy + 1, co)) {
1047 /* save figure to board */
1048 for (i = 0; i < 4; i++) {
1049 rx = getRelativeX (cf, i, co) + cx;
1050 ry = getRelativeY (cf, i, co) + cy;
1051 board[ry][rx] = cf;
1053 /* check if formed some lines */
1054 l = check_lines ();
1055 if (l) {
1056 /* the original scoring from "http://en.wikipedia.org/wiki/Rockblox" */
1057 score += scoring[l - 1] * level;
1058 lines += l;
1059 level = (int) lines / 10 + 1;
1062 /* show details */
1063 show_details ();
1065 /* generate a new figure */
1066 new_block ();
1067 } else
1068 move_block (0, 1, co);
1071 static int rockblox_loop (void)
1073 int button;
1074 int lastbutton = BUTTON_NONE;
1075 long next_down_tick = *rb->current_tick + level_speed(level);
1077 new_block ();
1079 while (1) {
1080 #ifdef HAS_BUTTON_HOLD
1081 if (rb->button_hold ()) {
1082 /* Turn on backlight timeout (revert to settings) */
1083 backlight_use_settings(); /* backlight control in lib/helper.c */
1084 rb->splash(0, "Paused");
1085 while (rb->button_hold ())
1086 rb->sleep(HZ/10);
1088 /* Turn off backlight timeout */
1089 backlight_force_on(); /* backlight control in lib/helper.c */
1091 /* get rid of the splash text */
1092 rb->lcd_bitmap (rockblox_background, 0, 0, LCD_WIDTH, LCD_HEIGHT);
1093 show_details ();
1094 #ifdef HIGH_SCORE_Y
1095 show_highscores ();
1096 #endif
1097 draw_next_block ();
1098 refresh_board ();
1100 #endif
1102 button = rb->button_get_w_tmo (MAX(next_down_tick - *rb->current_tick, 1));
1103 switch (button) {
1104 #ifdef ROCKBLOX_RC_OFF
1105 case ROCKBLOX_RC_OFF:
1106 #endif
1107 case ROCKBLOX_OFF:
1108 return PLUGIN_OK;
1110 #if defined(ROCKBLOX_ROTATE)
1111 case ROCKBLOX_ROTATE:
1112 #endif
1113 case ROCKBLOX_ROTATE_RIGHT:
1114 case ROCKBLOX_ROTATE_RIGHT | BUTTON_REPEAT:
1115 #ifdef HAVE_SCROLLWHEEL
1116 /* if the wheel is disabled, add an event to the stack. */
1117 if(wheel_enabled == false)
1118 wheel_events++;
1120 /* if it's enabled, go ahead and rotate.. */
1121 if(wheel_enabled)
1122 #endif
1123 move_block (0, 0, (co + 1) % figures[cf].max_or);
1124 break;
1126 case ROCKBLOX_ROTATE_LEFT:
1127 case ROCKBLOX_ROTATE_LEFT | BUTTON_REPEAT:
1128 #ifdef HAVE_SCROLLWHEEL
1129 if(wheel_enabled == false)
1130 wheel_events++;
1132 if(wheel_enabled)
1133 #endif
1134 move_block (0, 0,
1135 (co + figures[cf].max_or -
1136 1) % figures[cf].max_or);
1137 break;
1139 #ifdef ROCKBLOX_ROTATE_RIGHT2
1140 case ROCKBLOX_ROTATE_RIGHT2:
1141 move_block (0, 0, (co + 1) % figures[cf].max_or);
1142 break;
1143 #endif
1145 case ROCKBLOX_DOWN:
1146 case ROCKBLOX_DOWN | BUTTON_REPEAT:
1147 move_block (0, 1, co);
1148 break;
1150 case ROCKBLOX_RIGHT:
1151 case ROCKBLOX_RIGHT | BUTTON_REPEAT:
1152 move_block (1, 0, co);
1153 break;
1155 case ROCKBLOX_LEFT:
1156 case ROCKBLOX_LEFT | BUTTON_REPEAT:
1157 move_block (-1, 0, co);
1158 break;
1160 case ROCKBLOX_DROP:
1161 #ifdef ROCKBLOX_DROP_PRE
1162 if (lastbutton != ROCKBLOX_DROP_PRE)
1163 break;
1164 #endif
1165 while (canMoveTo (cx, cy + 1, co))
1166 move_block (0, 1, co);
1167 break;
1168 #ifdef ROCKBLOX_RESTART
1169 case ROCKBLOX_RESTART:
1170 rb->splash (HZ * 1, "Restarting...");
1171 init_rockblox ();
1172 new_block ();
1173 break;
1174 #endif
1176 default:
1177 if (rb->default_event_handler (button) == SYS_USB_CONNECTED)
1178 return PLUGIN_USB_CONNECTED;
1179 break;
1181 if (button != BUTTON_NONE)
1182 lastbutton = button;
1184 #ifdef HAVE_SCROLLWHEEL
1185 /* check if we should enable the scroll wheel, if events
1186 * begin to stack up... */
1187 if(wheel_enabled == false)
1189 /* stopped rotating the wheel, reset the count */
1190 if(wheel_events == last_wheel_event)
1192 last_wheel_event = 0;
1193 wheel_events = 0;
1195 /* rotated the wheel a while constantly, enable it. */
1196 else if(wheel_events > 3)
1198 wheel_enabled = true;
1201 /* this evens out the last event and the "current" event.
1202 * if we get an event next time through button reading, it will
1203 * remain ahead of last_event. if we don't, they'll end up equaling
1204 * each other.. thus, the scroll count will be reset. */
1205 if(wheel_enabled == false && wheel_events > last_wheel_event)
1206 last_wheel_event++;
1208 #endif
1210 if (TIME_AFTER(*rb->current_tick, next_down_tick)) {
1211 move_down ();
1212 next_down_tick += level_speed(level);
1213 if (TIME_AFTER(*rb->current_tick, next_down_tick))
1214 /* restart time "raster" when we had to wait longer than usual
1215 * (pause, game restart etc) */
1216 next_down_tick = *rb->current_tick + level_speed(level);
1219 if (gameover) {
1220 #if LCD_DEPTH >= 2
1221 rb->lcd_set_foreground (LCD_BLACK);
1222 #endif
1223 rb->splash (HZ * 2, "Game Over");
1224 init_rockblox ();
1225 new_block ();
1228 refresh_board ();
1231 return PLUGIN_OK;
1234 enum plugin_status plugin_start (const void *parameter)
1236 int ret;
1238 (void) parameter;
1240 rb->srand (*rb->current_tick);
1242 /* Load HighScore if any */
1243 highscore_load(HIGH_SCORE,Highest,MAX_HIGH_SCORES);
1245 #if LCD_DEPTH > 1
1246 rb->lcd_set_backdrop(NULL);
1247 #endif
1249 #ifdef HAVE_LCD_BITMAP
1250 rb->lcd_setfont (FONT_SYSFIXED);
1251 #else
1252 if (!pgfx_init(4, 2))
1254 rb->splash(HZ*2, "Old LCD :(");
1255 return PLUGIN_OK;
1257 #endif
1258 /* Turn off backlight timeout */
1259 backlight_force_on(); /* backlight control in lib/helper.c */
1261 init_rockblox ();
1262 ret = rockblox_loop ();
1264 #ifdef HAVE_LCD_BITMAP
1265 rb->lcd_setfont (FONT_UI);
1266 #else
1267 pgfx_release();
1268 #endif
1269 /* Save user's HighScore */
1270 highscore_save(HIGH_SCORE,Highest,MAX_HIGH_SCORES);
1271 backlight_use_settings(); /* backlight control in lib/helper.c */
1273 return ret;