summaryrefslogtreecommitdiff
path: root/apps/plugins/jewels.c
diff options
context:
space:
mode:
authorAdam Boot <rotator@gmail.com>2006-02-24 00:24:03 +0000
committerAdam Boot <rotator@gmail.com>2006-02-24 00:24:03 +0000
commit0b489779cee2297e66f999dc68261fa1df9f452f (patch)
treed4c9b7d5693c5ecd5ff66ee58c05fa47b7c181e1 /apps/plugins/jewels.c
parent42295c438d5b973520fae5176d9a3b6ea02fc569 (diff)
downloadrockbox-0b489779cee2297e66f999dc68261fa1df9f452f.tar.gz
rockbox-0b489779cee2297e66f999dc68261fa1df9f452f.zip
new menu system, consolidated button assignments, ipod mini support
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8821 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/jewels.c')
-rw-r--r--apps/plugins/jewels.c562
1 files changed, 362 insertions, 200 deletions
diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c
index 3652839f64..eb44e4bd81 100644
--- a/apps/plugins/jewels.c
+++ b/apps/plugins/jewels.c
@@ -25,71 +25,56 @@
25 25
26PLUGIN_HEADER 26PLUGIN_HEADER
27 27
28/* button definitions */ 28/* button definitions, every keypad must only have directions & select */
29#if CONFIG_KEYPAD == RECORDER_PAD 29#if CONFIG_KEYPAD == RECORDER_PAD
30#define BEJEWELED_UP BUTTON_UP 30#define BEJEWELED_UP BUTTON_UP
31#define BEJEWELED_DOWN BUTTON_DOWN 31#define BEJEWELED_DOWN BUTTON_DOWN
32#define BEJEWELED_LEFT BUTTON_LEFT 32#define BEJEWELED_LEFT BUTTON_LEFT
33#define BEJEWELED_RIGHT BUTTON_RIGHT 33#define BEJEWELED_RIGHT BUTTON_RIGHT
34#define BEJEWELED_QUIT BUTTON_OFF
35#define BEJEWELED_START BUTTON_ON
36#define BEJEWELED_SELECT BUTTON_PLAY 34#define BEJEWELED_SELECT BUTTON_PLAY
37#define BEJEWELED_RESUME BUTTON_F1 35#define BEJEWELED_CANCEL BUTTON_OFF
38 36
39#elif CONFIG_KEYPAD == ONDIO_PAD 37#elif CONFIG_KEYPAD == ONDIO_PAD
40#define BEJEWELED_UP BUTTON_UP 38#define BEJEWELED_UP BUTTON_UP
41#define BEJEWELED_DOWN BUTTON_DOWN 39#define BEJEWELED_DOWN BUTTON_DOWN
42#define BEJEWELED_LEFT BUTTON_LEFT 40#define BEJEWELED_LEFT BUTTON_LEFT
43#define BEJEWELED_RIGHT BUTTON_RIGHT 41#define BEJEWELED_RIGHT BUTTON_RIGHT
44#define BEJEWELED_QUIT BUTTON_OFF 42#define BEJEWELED_SELECT BUTTON_MENU
45#define BEJEWELED_START BUTTON_RIGHT 43#define BEJEWELED_CANCEL BUTTON_OFF
46#define BEJEWELED_SELECT (BUTTON_MENU|BUTTON_REL)
47#define BEJEWELED_SELECT_PRE BUTTON_MENU
48#define BEJEWELED_RESUME (BUTTON_MENU|BUTTON_OFF)
49 44
50#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) 45#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
51#define BEJEWELED_UP BUTTON_UP 46#define BEJEWELED_UP BUTTON_UP
52#define BEJEWELED_DOWN BUTTON_DOWN 47#define BEJEWELED_DOWN BUTTON_DOWN
53#define BEJEWELED_LEFT BUTTON_LEFT 48#define BEJEWELED_LEFT BUTTON_LEFT
54#define BEJEWELED_RIGHT BUTTON_RIGHT 49#define BEJEWELED_RIGHT BUTTON_RIGHT
55#define BEJEWELED_QUIT BUTTON_OFF
56#define BEJEWELED_START BUTTON_ON
57#define BEJEWELED_SELECT BUTTON_SELECT 50#define BEJEWELED_SELECT BUTTON_SELECT
58#define BEJEWELED_RESUME BUTTON_MODE 51#define BEJEWELED_CANCEL BUTTON_OFF
59 52
60#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD) 53#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
61#define BEJEWELED_SCROLLWHEEL 54#define BEJEWELED_SCROLLWHEEL
62#define BEJEWELED_UP BUTTON_MENU 55#define BEJEWELED_UP BUTTON_MENU
63#define BEJEWELED_DOWN BUTTON_PLAY 56#define BEJEWELED_DOWN BUTTON_PLAY
64#define BEJEWELED_LEFT BUTTON_LEFT 57#define BEJEWELED_LEFT BUTTON_LEFT
65#define BEJEWELED_RIGHT BUTTON_RIGHT 58#define BEJEWELED_RIGHT BUTTON_RIGHT
66#define BEJEWELED_PREV BUTTON_SCROLL_BACK 59#define BEJEWELED_PREV BUTTON_SCROLL_BACK
67#define BEJEWELED_NEXT BUTTON_SCROLL_FWD 60#define BEJEWELED_NEXT BUTTON_SCROLL_FWD
68#define BEJEWELED_QUIT (BUTTON_SELECT|BUTTON_MENU) 61#define BEJEWELED_SELECT BUTTON_SELECT
69#define BEJEWELED_START BUTTON_PLAY
70#define BEJEWELED_SELECT (BUTTON_SELECT|BUTTON_REL)
71#define BEJEWELED_SELECT_PRE BUTTON_SELECT
72#define BEJEWELED_RESUME (BUTTON_SELECT|BUTTON_PLAY)
73 62
74#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD 63#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
75#define BEJEWELED_UP BUTTON_UP 64#define BEJEWELED_UP BUTTON_UP
76#define BEJEWELED_DOWN BUTTON_DOWN 65#define BEJEWELED_DOWN BUTTON_DOWN
77#define BEJEWELED_LEFT BUTTON_LEFT 66#define BEJEWELED_LEFT BUTTON_LEFT
78#define BEJEWELED_RIGHT BUTTON_RIGHT 67#define BEJEWELED_RIGHT BUTTON_RIGHT
79#define BEJEWELED_QUIT BUTTON_PLAY
80#define BEJEWELED_START BUTTON_MODE
81#define BEJEWELED_SELECT BUTTON_SELECT 68#define BEJEWELED_SELECT BUTTON_SELECT
82#define BEJEWELED_RESUME BUTTON_EQ 69#define BEJEWELED_CANCEL BUTTON_PLAY
83 70
84#elif CONFIG_KEYPAD == IAUDIO_X5_PAD 71#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
85#define BEJEWELED_UP BUTTON_UP 72#define BEJEWELED_UP BUTTON_UP
86#define BEJEWELED_DOWN BUTTON_DOWN 73#define BEJEWELED_DOWN BUTTON_DOWN
87#define BEJEWELED_LEFT BUTTON_LEFT 74#define BEJEWELED_LEFT BUTTON_LEFT
88#define BEJEWELED_RIGHT BUTTON_RIGHT 75#define BEJEWELED_RIGHT BUTTON_RIGHT
89#define BEJEWELED_QUIT BUTTON_POWER
90#define BEJEWELED_START BUTTON_PLAY
91#define BEJEWELED_SELECT BUTTON_MENU 76#define BEJEWELED_SELECT BUTTON_MENU
92#define BEJEWELED_RESUME BUTTON_REC 77#define BEJEWELED_CANCEL BUTTON_PLAY
93 78
94#else 79#else
95 #error BEJEWELED: Unsupported keypad 80 #error BEJEWELED: Unsupported keypad
@@ -123,6 +108,13 @@ PLUGIN_HEADER
123#define YOFS 0 108#define YOFS 0
124#define NUM_SCORES 10 109#define NUM_SCORES 10
125 110
111/* use 13x13 tiles (iPod Mini) */
112#elif (LCD_HEIGHT == 110) && (LCD_WIDTH == 138)
113#define TILE_WIDTH 13
114#define TILE_HEIGHT 13
115#define YOFS 6
116#define NUM_SCORES 10
117
126/* use 10x8 tiles (iFP 700) */ 118/* use 10x8 tiles (iFP 700) */
127#elif (LCD_HEIGHT == 64) && (LCD_WIDTH == 128) 119#elif (LCD_HEIGHT == 64) && (LCD_WIDTH == 128)
128#define TILE_WIDTH 10 120#define TILE_WIDTH 10
@@ -141,14 +133,6 @@ PLUGIN_HEADER
141 #error BEJEWELED: Unsupported LCD 133 #error BEJEWELED: Unsupported LCD
142#endif 134#endif
143 135
144/* tile background colors */
145#if defined(HAVE_LCD_COLOR)
146static const unsigned bejeweled_bkgd[2] = {
147 LCD_RGBPACK(104, 63, 63),
148 LCD_RGBPACK(83, 44, 44)
149};
150#endif
151
152/* save files */ 136/* save files */
153#define SCORE_FILE PLUGIN_DIR "/bejeweled.score" 137#define SCORE_FILE PLUGIN_DIR "/bejeweled.score"
154#define SAVE_FILE PLUGIN_DIR "/bejeweled.save" 138#define SAVE_FILE PLUGIN_DIR "/bejeweled.save"
@@ -173,7 +157,54 @@ static const unsigned bejeweled_bkgd[2] = {
173#define LEVEL_PTS 100 157#define LEVEL_PTS 100
174 158
175/* animation frame rate */ 159/* animation frame rate */
176#define FPS 20 160#define MAX_FPS 20
161
162/* menu values */
163#define FONT_HEIGHT 8
164#define MAX_MITEMS 5
165#define MENU_WIDTH 100
166
167/* menu results */
168enum menu_result {
169 MRES_NONE,
170 MRES_NEW,
171 MRES_SAVE,
172 MRES_RESUME,
173 MRES_SCORES,
174 MRES_HELP,
175 MRES_QUIT
176};
177
178/* menu commands */
179enum menu_cmd {
180 MCMD_NONE,
181 MCMD_NEXT,
182 MCMD_PREV,
183 MCMD_SELECT
184};
185
186/* menus */
187struct bejeweled_menu {
188 char *title;
189 bool hasframe;
190 int selected;
191 int itemcnt;
192 struct bejeweled_menuitem {
193 char *text;
194 enum menu_result res;
195 } items[MAX_MITEMS];
196} bjmenu[] = {
197 {"Bejeweled", false, 0, 5,
198 {{"New Game", MRES_NEW},
199 {"Resume Game", MRES_RESUME},
200 {"High Scores", MRES_SCORES},
201 {"Help", MRES_HELP},
202 {"Quit", MRES_QUIT}}},
203 {"Menu", true, 0, 3,
204 {{"Resume Game", MRES_RESUME},
205 {"Save Game", MRES_SAVE},
206 {"End Game", MRES_QUIT}}}
207};
177 208
178/* global rockbox api */ 209/* global rockbox api */
179static struct plugin_api* rb; 210static struct plugin_api* rb;
@@ -181,6 +212,14 @@ static struct plugin_api* rb;
181/* external bitmaps */ 212/* external bitmaps */
182extern const fb_data bejeweled_jewels[]; 213extern const fb_data bejeweled_jewels[];
183 214
215/* tile background colors */
216#ifdef HAVE_LCD_COLOR
217static const unsigned bejeweled_bkgd[2] = {
218 LCD_RGBPACK(104, 63, 63),
219 LCD_RGBPACK(83, 44, 44)
220};
221#endif
222
184/* the tile struct 223/* the tile struct
185 * type is the jewel number 0-7 224 * type is the jewel number 0-7
186 * falling if the jewel is falling 225 * falling if the jewel is falling
@@ -318,13 +357,77 @@ static void bejeweled_drawboard(struct game_context* bj) {
318 rb->snprintf(str, 6, "%d", (bj->level-1)*LEVEL_PTS+bj->score); 357 rb->snprintf(str, 6, "%d", (bj->level-1)*LEVEL_PTS+bj->score);
319 rb->lcd_getstringsize(str, &w, &h); 358 rb->lcd_getstringsize(str, &w, &h);
320 rb->lcd_putsxy(LCD_WIDTH-(LCD_WIDTH-BJ_WIDTH*TILE_WIDTH)/2-w/2, 359 rb->lcd_putsxy(LCD_WIDTH-(LCD_WIDTH-BJ_WIDTH*TILE_WIDTH)/2-w/2,
321 LCD_HEIGHT-8, 360 LCD_HEIGHT-8, str);
322 str);
323 361
324 rb->lcd_update(); 362 rb->lcd_update();
325} 363}
326 364
327/***************************************************************************** 365/*****************************************************************************
366* bejeweled_showmenu() displays the chosen menu after performing the chosen
367* menu command.
368******************************************************************************/
369static enum menu_result bejeweled_showmenu(struct bejeweled_menu* menu,
370 enum menu_cmd cmd) {
371 int i;
372 int w, h;
373 int firstline;
374 int adj;
375
376 /* handle menu command */
377 switch(cmd) {
378 case MCMD_NEXT:
379 menu->selected = (menu->selected+1)%menu->itemcnt;
380 break;
381
382 case MCMD_PREV:
383 menu->selected = (menu->selected-1+menu->itemcnt)%menu->itemcnt;
384 break;
385
386 case MCMD_SELECT:
387 return menu->items[menu->selected].res;
388
389 default:
390 break;
391 }
392
393 /* clear menu area */
394 firstline = (LCD_HEIGHT/FONT_HEIGHT-(menu->itemcnt+3))/2;
395
396 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
397 rb->lcd_fillrect((LCD_WIDTH-MENU_WIDTH)/2, firstline*FONT_HEIGHT,
398 MENU_WIDTH, (menu->itemcnt+3)*FONT_HEIGHT);
399 rb->lcd_set_drawmode(DRMODE_SOLID);
400
401 if(menu->hasframe) {
402 rb->lcd_drawrect((LCD_WIDTH-MENU_WIDTH)/2-1, firstline*FONT_HEIGHT-1,
403 MENU_WIDTH+2, (menu->itemcnt+3)*FONT_HEIGHT+2);
404 rb->lcd_hline((LCD_WIDTH-MENU_WIDTH)/2-1,
405 (LCD_WIDTH-MENU_WIDTH)/2-1+MENU_WIDTH+2,
406 (firstline+1)*FONT_HEIGHT);
407 }
408
409 /* draw menu items */
410 rb->lcd_getstringsize(menu->title, &w, &h);
411 rb->lcd_putsxy((LCD_WIDTH-w)/2, firstline*FONT_HEIGHT, menu->title);
412
413 for(i=0; i<menu->itemcnt; i++) {
414 if(i == menu->selected) {
415 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
416 }
417 rb->lcd_putsxy((LCD_WIDTH-MENU_WIDTH)/2, (firstline+i+2)*FONT_HEIGHT,
418 menu->items[i].text);
419 if(i == menu->selected) {
420 rb->lcd_set_drawmode(DRMODE_SOLID);
421 }
422 }
423
424 adj = (firstline == 0 ? 0 : 1);
425 rb->lcd_update_rect((LCD_WIDTH-MENU_WIDTH)/2-1, firstline*FONT_HEIGHT-adj,
426 MENU_WIDTH+2, (menu->itemcnt+3)*FONT_HEIGHT+2*adj);
427 return MRES_NONE;
428}
429
430/*****************************************************************************
328* bejeweled_putjewels() makes the jewels fall to fill empty spots and adds 431* bejeweled_putjewels() makes the jewels fall to fill empty spots and adds
329* new random jewels at the empty spots at the top of each row. 432* new random jewels at the empty spots at the top of each row.
330******************************************************************************/ 433******************************************************************************/
@@ -412,13 +515,15 @@ static void bejeweled_putjewels(struct game_context* bj){
412 } 515 }
413 } 516 }
414 517
415 rb->lcd_update(); 518 rb->lcd_update_rect(0, 0, TILE_WIDTH*8, LCD_HEIGHT);
416 bejeweled_setcolors(); 519 bejeweled_setcolors();
417 520
418 /* framerate limiting */ 521 /* framerate limiting */
419 currenttick = *rb->current_tick; 522 currenttick = *rb->current_tick;
420 if(currenttick-lasttick < HZ/FPS) { 523 if(currenttick-lasttick < HZ/MAX_FPS) {
421 rb->sleep((HZ/FPS)-(currenttick-lasttick)); 524 rb->sleep((HZ/MAX_FPS)-(currenttick-lasttick));
525 } else {
526 rb->yield();
422 } 527 }
423 lasttick = currenttick; 528 lasttick = currenttick;
424 } 529 }
@@ -650,13 +755,15 @@ static unsigned int bejeweled_swapjewels(struct game_context* bj,
650 rb->lcd_set_drawmode(DRMODE_SOLID); 755 rb->lcd_set_drawmode(DRMODE_SOLID);
651#endif 756#endif
652 757
653 rb->lcd_update(); 758 rb->lcd_update_rect(0, 0, TILE_WIDTH*8, LCD_HEIGHT);
654 bejeweled_setcolors(); 759 bejeweled_setcolors();
655 760
656 /* framerate limiting */ 761 /* framerate limiting */
657 currenttick = *rb->current_tick; 762 currenttick = *rb->current_tick;
658 if(currenttick-lasttick < HZ/FPS) { 763 if(currenttick-lasttick < HZ/MAX_FPS) {
659 rb->sleep((HZ/FPS)-(currenttick-lasttick)); 764 rb->sleep((HZ/MAX_FPS)-(currenttick-lasttick));
765 } else {
766 rb->yield();
660 } 767 }
661 lasttick = currenttick; 768 lasttick = currenttick;
662 } 769 }
@@ -939,12 +1046,12 @@ static int bejeweled(struct game_context* bj) {
939 int i, j; 1046 int i, j;
940 int w, h; 1047 int w, h;
941 int button; 1048 int button;
942 int lastbutton = BUTTON_NONE;
943 char str[18]; 1049 char str[18];
944 char *title = "Bejeweled";
945 bool startgame = false; 1050 bool startgame = false;
946 bool showscores = false; 1051 bool inmenu = false;
947 bool selected = false; 1052 bool selected = false;
1053 enum menu_cmd cmd = MCMD_NONE;
1054 enum menu_result res;
948 1055
949 /* the cursor coordinates */ 1056 /* the cursor coordinates */
950 int x=0, y=0; 1057 int x=0, y=0;
@@ -955,128 +1062,138 @@ static int bejeweled(struct game_context* bj) {
955 /******************** 1062 /********************
956 * menu * 1063 * menu *
957 ********************/ 1064 ********************/
958 while(!startgame){ 1065 rb->lcd_clear_display();
959 rb->lcd_clear_display();
960
961 if(!showscores) {
962 /* welcome screen to display key bindings */
963 rb->lcd_getstringsize(title, &w, &h);
964 rb->lcd_putsxy((LCD_WIDTH-w)/2, 0, title);
965#if CONFIG_KEYPAD == RECORDER_PAD
966 rb->lcd_puts(0, 1, "ON to start");
967 rb->lcd_puts(0, 2, "F1 to save/resume");
968 rb->lcd_puts(0, 3, "OFF to exit");
969 rb->lcd_puts(0, 4, "PLAY to select");
970 rb->lcd_puts(0, 5, "& show high scores");
971 rb->lcd_puts(0, 6, "Directions to move");
972 rb->snprintf(str, 18, "High Score: %d", bj->highscores[0]);
973 rb->lcd_puts(0, 7, str);
974#elif CONFIG_KEYPAD == ONDIO_PAD
975 rb->lcd_puts(0, 1, "RIGHT to start");
976 rb->lcd_puts(0, 2, "MENU+OFF to sv/res");
977 rb->lcd_puts(0, 3, "OFF to exit");
978 rb->lcd_puts(0, 4, "MENU to select");
979 rb->lcd_puts(0, 5, "& show high scores");
980 rb->lcd_puts(0, 6, "Directions to move");
981 rb->snprintf(str, 18, "High Score: %d", bj->highscores[0]);
982 rb->lcd_puts(0, 7, str);
983#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
984 rb->lcd_puts(0, 2, "ON to start");
985 rb->lcd_puts(0, 3, "MODE to save/resume");
986 rb->lcd_puts(0, 4, "OFF to exit");
987 rb->lcd_puts(0, 5, "SELECT to select");
988 rb->lcd_puts(0, 6, " and show high scores");
989 rb->lcd_puts(0, 7, "Directions to move");
990 rb->snprintf(str, 18, "High Score: %d", bj->highscores[0]);
991 rb->lcd_puts(0, 9, str);
992#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
993 rb->lcd_puts(0, 2, "PLAY to start");
994 rb->lcd_puts(0, 3, "SELECT+PLAY to save/resume");
995 rb->lcd_puts(0, 4, "SELECT+MENU to exit");
996 rb->lcd_puts(0, 5, "SELECT to select");
997 rb->lcd_puts(0, 6, " and show high scores");
998 rb->lcd_puts(0, 7, "Scroll or Directions to move");
999 rb->lcd_puts(0, 8, "Directions to swap");
1000 rb->snprintf(str, 18, "High Score: %d", bj->highscores[0]);
1001 rb->lcd_puts(0, 10, str);
1002#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
1003 rb->lcd_puts(0, 1, "MODE to start");
1004 rb->lcd_puts(0, 2, "EQ to save/resume");
1005 rb->lcd_puts(0, 3, "PLAY to exit");
1006 rb->lcd_puts(0, 4, "SELECT to select");
1007 rb->lcd_puts(0, 5, "& show high scores");
1008 rb->lcd_puts(0, 6, "Directions to move");
1009 rb->snprintf(str, 18, "High Score: %d", bj->highscores[0]);
1010 rb->lcd_puts(0, 7, str);
1011#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
1012 rb->lcd_puts(0, 2, "PLAY to start");
1013 rb->lcd_puts(0, 3, "REC to save/resume");
1014 rb->lcd_puts(0, 4, "POWER to exit");
1015 rb->lcd_puts(0, 5, "MENU to select");
1016 rb->lcd_puts(0, 6, " and show high scores");
1017 rb->lcd_puts(0, 7, "Directions to move");
1018 rb->snprintf(str, 18, "High Score: %d", bj->highscores[0]);
1019#endif
1020 } else {
1021 /* room for a title? */
1022 j = 0;
1023 if(LCD_HEIGHT-NUM_SCORES*8 >= 8) {
1024 rb->snprintf(str, 12, "%s", "High Scores");
1025 rb->lcd_getstringsize(str, &w, &h);
1026 rb->lcd_putsxy((LCD_WIDTH-w)/2, 0, str);
1027 j = 2;
1028 }
1029 1066
1030 /* print high scores */ 1067 while(!startgame) {
1031 for(i=0; i<NUM_SCORES; i++) { 1068 res = bejeweled_showmenu(&bjmenu[0], cmd);
1032 rb->snprintf(str, 11, "#%02d: %d", i+1, bj->highscores[i]); 1069 cmd = MCMD_NONE;
1033 rb->lcd_puts(0, i+j, str);
1034 }
1035 }
1036 1070
1071 rb->snprintf(str, 18, "High Score: %d", bj->highscores[0]);
1072 rb->lcd_getstringsize(str, &w, &h);
1073 rb->lcd_putsxy((LCD_WIDTH-w)/2, LCD_HEIGHT-8, str);
1037 rb->lcd_update(); 1074 rb->lcd_update();
1038 1075
1039 /* handle menu button presses */ 1076 switch(res) {
1040 button = rb->button_get(true); 1077 case MRES_NEW:
1041 switch(button){
1042 case BEJEWELED_START: /* start playing */
1043 startgame = true; 1078 startgame = true;
1044 break; 1079 continue;
1045 1080
1046 case BEJEWELED_QUIT: /* quit program */ 1081 case MRES_RESUME:
1047 if(showscores) {
1048 showscores = 0;
1049 break;
1050 }
1051 return BJ_QUIT;
1052
1053 case BEJEWELED_RESUME:/* resume game */
1054 if(!bejeweled_loadgame(bj)) { 1082 if(!bejeweled_loadgame(bj)) {
1055 rb->splash(HZ*2, true, "Nothing to resume"); 1083 rb->splash(HZ*2, true, "Nothing to resume");
1084 rb->lcd_clear_display();
1056 } else { 1085 } else {
1057 startgame = true; 1086 startgame = true;
1058 } 1087 }
1088 continue;
1089
1090 case MRES_SCORES:
1091 rb->lcd_clear_display();
1092
1093 /* room for a title? */
1094 j = 0;
1095 if(LCD_HEIGHT-NUM_SCORES*8 >= 8) {
1096 rb->snprintf(str, 12, "%s", "High Scores");
1097 rb->lcd_getstringsize(str, &w, &h);
1098 rb->lcd_putsxy((LCD_WIDTH-w)/2, 0, str);
1099 j = 2;
1100 }
1101
1102 /* print high scores */
1103 for(i=0; i<NUM_SCORES; i++) {
1104 rb->snprintf(str, 11, "#%02d: %d", i+1, bj->highscores[i]);
1105 rb->lcd_puts(0, i+j, str);
1106 }
1107
1108 rb->lcd_update();
1109 while(true) {
1110 button = rb->button_get(true);
1111 if(button != BUTTON_NONE && !(button&BUTTON_REL)) break;
1112 }
1113 rb->lcd_clear_display();
1114 continue;
1115
1116 case MRES_HELP:
1117 /* welcome screen to display key bindings */
1118 rb->lcd_clear_display();
1119 rb->snprintf(str, 5, "%s", "Help");
1120 rb->lcd_getstringsize(str, &w, &h);
1121 rb->lcd_putsxy((LCD_WIDTH-w)/2, 0, str);
1122#if (LCD_HEIGHT <= 64)
1123 rb->lcd_puts(0, 2, "Controls:");
1124 rb->lcd_puts(0, 3, "Directions = move");
1125 rb->lcd_puts(0, 4, "SELECT = select");
1126 rb->lcd_puts(0, 5, "Long SELECT = menu");
1127#elif (LCD_HEIGHT <= 132)
1128 rb->lcd_puts(0, 2, "Swap pairs of jewels to");
1129 rb->lcd_puts(0, 3, "form connected segments");
1130 rb->lcd_puts(0, 4, "of three or more of the");
1131 rb->lcd_puts(0, 5, "same type.");
1132 rb->lcd_puts(0, 7, "Controls:");
1133 rb->lcd_puts(0, 8, "Directions to move");
1134 rb->lcd_puts(0, 9, "SELECT to select");
1135 rb->lcd_puts(0, 10, "Long SELECT to show menu");
1136#else
1137 rb->lcd_puts(0, 2, "Swap pairs of jewels to form");
1138 rb->lcd_puts(0, 3, "connected segments of three");
1139 rb->lcd_puts(0, 4, "or more of the same type.");
1140 rb->lcd_puts(0, 6, "Controls:");
1141 rb->lcd_puts(0, 7, "Directions to move cursor");
1142 rb->lcd_puts(0, 8, "SELECT to select");
1143 rb->lcd_puts(0, 9, "Long SELECT to show menu");
1144#endif
1145 rb->lcd_update();
1146 while(true) {
1147 button = rb->button_get(true);
1148 if(button != BUTTON_NONE && !(button&BUTTON_REL)) break;
1149 }
1150 rb->lcd_clear_display();
1151 continue;
1152
1153 case MRES_QUIT:
1154 return BJ_QUIT;
1155
1156 default:
1157 break;
1158 }
1159
1160 /* handle menu button presses */
1161 button = rb->button_get(true);
1162 switch(button){
1163#ifdef BEJEWELED_SCROLLWHEEL
1164 case BEJEWELED_PREV:
1165#endif
1166 case BEJEWELED_UP:
1167 case (BEJEWELED_UP|BUTTON_REPEAT):
1168 cmd = MCMD_PREV;
1059 break; 1169 break;
1060 1170
1061 case BEJEWELED_SELECT:/* toggle high scores */ 1171#ifdef BEJEWELED_SCROLLWHEEL
1062#ifdef BEJEWELED_SELECT_PRE 1172 case BEJEWELED_NEXT:
1063 if(lastbutton != BEJEWELED_SELECT_PRE) break;
1064#endif 1173#endif
1065 showscores = !showscores; 1174 case BEJEWELED_DOWN:
1175 case (BEJEWELED_DOWN|BUTTON_REPEAT):
1176 cmd = MCMD_NEXT;
1066 break; 1177 break;
1067 1178
1179 case BEJEWELED_SELECT:
1180 case BEJEWELED_RIGHT:
1181 cmd = MCMD_SELECT;
1182 break;
1183
1184#ifdef BEJEWELED_CANCEL
1185 case BEJEWELED_CANCEL:
1186 return BJ_QUIT;
1187#endif
1188
1068 default: 1189 default:
1069 if(rb->default_event_handler_ex(button, bejeweled_callback, 1190 if(rb->default_event_handler_ex(button, bejeweled_callback,
1070 (void*) bj) == SYS_USB_CONNECTED) 1191 (void*) bj) == SYS_USB_CONNECTED)
1071 return BJ_USB; 1192 return BJ_USB;
1072 break; 1193 break;
1073 } 1194 }
1074
1075 if(button != BUTTON_NONE) lastbutton = button;
1076 } 1195 }
1077 1196
1078 lastbutton = BUTTON_NONE;
1079
1080 /******************** 1197 /********************
1081 * init * 1198 * init *
1082 ********************/ 1199 ********************/
@@ -1094,33 +1211,47 @@ static int bejeweled(struct game_context* bj) {
1094 * play * 1211 * play *
1095 **********************/ 1212 **********************/
1096 while(true) { 1213 while(true) {
1097 /* refresh the board */ 1214 if(!inmenu) {
1098 bejeweled_drawboard(bj); 1215 /* refresh the board */
1099 1216 bejeweled_drawboard(bj);
1100 /* display the cursor */ 1217
1101 if(selected) { 1218 /* display the cursor */
1102 rb->lcd_set_drawmode(DRMODE_COMPLEMENT); 1219 if(selected) {
1103 rb->lcd_fillrect(x*TILE_WIDTH, y*TILE_HEIGHT+YOFS, 1220 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
1104 TILE_WIDTH, TILE_HEIGHT); 1221 rb->lcd_fillrect(x*TILE_WIDTH, y*TILE_HEIGHT+YOFS,
1105 rb->lcd_set_drawmode(DRMODE_SOLID); 1222 TILE_WIDTH, TILE_HEIGHT);
1223 rb->lcd_set_drawmode(DRMODE_SOLID);
1224 } else {
1225 rb->lcd_drawrect(x*TILE_WIDTH, y*TILE_HEIGHT+YOFS,
1226 TILE_WIDTH, TILE_HEIGHT);
1227 }
1228 rb->lcd_update_rect(x*TILE_WIDTH, y*TILE_HEIGHT+YOFS,
1229 TILE_WIDTH, TILE_HEIGHT);
1106 } else { 1230 } else {
1107 rb->lcd_drawrect(x*TILE_WIDTH, y*TILE_HEIGHT+YOFS, 1231 res = bejeweled_showmenu(&bjmenu[1], cmd);
1108 TILE_WIDTH, TILE_HEIGHT); 1232 cmd = MCMD_NONE;
1233 switch(res) {
1234 case MRES_RESUME:
1235 inmenu = false;
1236 selected = false;
1237 continue;
1238
1239 case MRES_SAVE:
1240 rb->splash(HZ, true, "Saving game...");
1241 bejeweled_savegame(bj);
1242 return BJ_END;
1243
1244 case MRES_QUIT:
1245 return BJ_END;
1246
1247 default:
1248 break;
1249 }
1109 } 1250 }
1110 rb->lcd_update_rect(x*TILE_WIDTH, y*TILE_HEIGHT+YOFS,
1111 TILE_WIDTH, TILE_HEIGHT);
1112 1251
1113 /* handle game button presses */ 1252 /* handle game button presses */
1114 button = rb->button_get(true); 1253 button = rb->button_get(true);
1115 switch(button){ 1254 switch(button){
1116 case BEJEWELED_RESUME: /* save and end game */
1117 rb->splash(HZ, true, "Saving game...");
1118 bejeweled_savegame(bj);
1119 return BJ_END;
1120
1121 case BEJEWELED_QUIT: /* end game */
1122 return BJ_END;
1123
1124 case BEJEWELED_LEFT: /* move cursor left */ 1255 case BEJEWELED_LEFT: /* move cursor left */
1125 case (BEJEWELED_LEFT|BUTTON_REPEAT): 1256 case (BEJEWELED_LEFT|BUTTON_REPEAT):
1126 if(selected) { 1257 if(selected) {
@@ -1134,66 +1265,98 @@ static int bejeweled(struct game_context* bj) {
1134 1265
1135 case BEJEWELED_RIGHT: /* move cursor right */ 1266 case BEJEWELED_RIGHT: /* move cursor right */
1136 case (BEJEWELED_RIGHT|BUTTON_REPEAT): 1267 case (BEJEWELED_RIGHT|BUTTON_REPEAT):
1137 if(selected) { 1268 if(!inmenu) {
1138 bj->score += bejeweled_swapjewels(bj, x, y, SWAP_RIGHT); 1269 if(selected) {
1139 selected = false; 1270 bj->score += bejeweled_swapjewels(bj, x, y, SWAP_RIGHT);
1140 if (!bejeweled_movesavail(bj)) return BJ_LOSE; 1271 selected = false;
1272 if (!bejeweled_movesavail(bj)) return BJ_LOSE;
1273 } else {
1274 x = (x+1)%BJ_WIDTH;
1275 }
1141 } else { 1276 } else {
1142 x = (x+1)%BJ_WIDTH; 1277 cmd = MCMD_SELECT;
1143 } 1278 }
1144 break; 1279 break;
1145 1280
1146 case BEJEWELED_DOWN: /* move cursor down */ 1281 case BEJEWELED_DOWN: /* move cursor down */
1147 case (BEJEWELED_DOWN|BUTTON_REPEAT): 1282 case (BEJEWELED_DOWN|BUTTON_REPEAT):
1148 if(selected) { 1283 if(!inmenu) {
1149 bj->score += bejeweled_swapjewels(bj, x, y, SWAP_DOWN); 1284 if(selected) {
1150 selected = false; 1285 bj->score += bejeweled_swapjewels(bj, x, y, SWAP_DOWN);
1151 if (!bejeweled_movesavail(bj)) return BJ_LOSE; 1286 selected = false;
1287 if (!bejeweled_movesavail(bj)) return BJ_LOSE;
1288 } else {
1289 y = (y+1)%(BJ_HEIGHT-1);
1290 }
1152 } else { 1291 } else {
1153 y = (y+1)%(BJ_HEIGHT-1); 1292 cmd = MCMD_NEXT;
1154 } 1293 }
1155 break; 1294 break;
1156 1295
1157 case BEJEWELED_UP: /* move cursor up */ 1296 case BEJEWELED_UP: /* move cursor up */
1158 case (BEJEWELED_UP|BUTTON_REPEAT): 1297 case (BEJEWELED_UP|BUTTON_REPEAT):
1159 if(selected) { 1298 if(!inmenu) {
1160 bj->score += bejeweled_swapjewels(bj, x, y, SWAP_UP); 1299 if(selected) {
1161 selected = false; 1300 bj->score += bejeweled_swapjewels(bj, x, y, SWAP_UP);
1162 if (!bejeweled_movesavail(bj)) return BJ_LOSE; 1301 selected = false;
1302 if (!bejeweled_movesavail(bj)) return BJ_LOSE;
1303 } else {
1304 y = (y+(BJ_HEIGHT-1)-1)%(BJ_HEIGHT-1);
1305 }
1163 } else { 1306 } else {
1164 y = (y+(BJ_HEIGHT-1)-1)%(BJ_HEIGHT-1); 1307 cmd = MCMD_PREV;
1165 } 1308 }
1166 break; 1309 break;
1167 1310
1168#ifdef BEJEWELED_SCROLLWHEEL 1311#ifdef BEJEWELED_SCROLLWHEEL
1169 case BEJEWELED_PREV: /* scroll backwards */ 1312 case BEJEWELED_PREV: /* scroll backwards */
1170 case (BEJEWELED_PREV|BUTTON_REPEAT): 1313 case (BEJEWELED_PREV|BUTTON_REPEAT):
1171 if(!selected) { 1314 if(!inmenu) {
1172 if(x == 0) { 1315 if(!selected) {
1173 y = (y+(BJ_HEIGHT-1)-1)%(BJ_HEIGHT-1); 1316 if(x == 0) {
1317 y = (y+(BJ_HEIGHT-1)-1)%(BJ_HEIGHT-1);
1318 }
1319 x = (x+BJ_WIDTH-1)%BJ_WIDTH;
1174 } 1320 }
1175 x = (x+BJ_WIDTH-1)%BJ_WIDTH; 1321 } else {
1322 cmd = MCMD_PREV;
1176 } 1323 }
1177 break; 1324 break;
1178 1325
1179 case BEJEWELED_NEXT: /* scroll forwards */ 1326 case BEJEWELED_NEXT: /* scroll forwards */
1180 case (BEJEWELED_NEXT|BUTTON_REPEAT): 1327 case (BEJEWELED_NEXT|BUTTON_REPEAT):
1181 if(!selected) { 1328 if(!inmenu) {
1182 if(x == BJ_WIDTH-1) { 1329 if(!selected) {
1183 y = (y+1)%(BJ_HEIGHT-1); 1330 if(x == BJ_WIDTH-1) {
1331 y = (y+1)%(BJ_HEIGHT-1);
1332 }
1333 x = (x+1)%BJ_WIDTH;
1184 } 1334 }
1185 x = (x+1)%BJ_WIDTH; 1335 } else {
1336 cmd = MCMD_NEXT;
1186 } 1337 }
1187 break; 1338 break;
1188#endif 1339#endif
1189 1340
1190 case BEJEWELED_SELECT: /* toggle selected */ 1341 case BEJEWELED_SELECT: /* toggle selected */
1191#ifdef BEJEWELED_SELECT_PRE 1342 if(!inmenu) {
1192 if(lastbutton != BEJEWELED_SELECT_PRE) break; 1343 selected = !selected;
1193#endif 1344 } else {
1194 selected = !selected; 1345 cmd = MCMD_SELECT;
1346 }
1195 break; 1347 break;
1196 1348
1349 case (BEJEWELED_SELECT|BUTTON_REPEAT): /* show menu */
1350 if(!inmenu) inmenu = true;
1351 break;
1352
1353#ifdef BEJEWELED_CANCEL
1354 case BEJEWELED_CANCEL: /* toggle menu */
1355 inmenu = !inmenu;
1356 selected = false;
1357 break;
1358#endif
1359
1197 default: 1360 default:
1198 if(rb->default_event_handler_ex(button, bejeweled_callback, 1361 if(rb->default_event_handler_ex(button, bejeweled_callback,
1199 (void*) bj) == SYS_USB_CONNECTED) 1362 (void*) bj) == SYS_USB_CONNECTED)
@@ -1201,7 +1364,6 @@ static int bejeweled(struct game_context* bj) {
1201 break; 1364 break;
1202 } 1365 }
1203 1366
1204 if(button != BUTTON_NONE) lastbutton = button;
1205 if(bj->score >= LEVEL_PTS) bj->score = bejeweled_nextlevel(bj); 1367 if(bj->score >= LEVEL_PTS) bj->score = bejeweled_nextlevel(bj);
1206 } 1368 }
1207} 1369}