diff --git a/apps/plugins/bitmaps/native/SOURCES b/apps/plugins/bitmaps/native/SOURCES index 357480a..b9b859f 100644 --- a/apps/plugins/bitmaps/native/SOURCES +++ b/apps/plugins/bitmaps/native/SOURCES @@ -5,9 +5,7 @@ brickmania_gameover.112x54x16.bmp #if LCD_WIDTH >= 220 /* common to all big lcds */ brickmania_ball.5x5x16.bmp -brickmania_menu_items.220x176x16.bmp #if LCD_WIDTH >= 320 /* Ipod Video */ -brickmania_menu_bg.320x240x16.bmp brickmania_bricks.320x240x16.bmp brickmania_pads.320x240x16.bmp brickmania_break.320x240x16.bmp @@ -17,49 +15,34 @@ brickmania_bricks.220x176x16.bmp brickmania_pads.220x176x16.bmp brickmania_break.220x176x16.bmp brickmania_powerups.220x176x16.bmp -#if LCD_HEIGHT == 320 -brickmania_menu_bg.240x320x16.bmp -#elif LCD_HEIGHT == 176 -brickmania_menu_bg.220x176x16.bmp -#endif #endif #elif LCD_WIDTH >= 176 brickmania_ball.5x5x16.bmp -brickmania_menu_items.176x132x16.bmp brickmania_bricks.176x132x16.bmp -brickmania_menu_bg.176x132x16.bmp brickmania_pads.176x132x16.bmp brickmania_powerups.176x132x16.bmp brickmania_break.176x132x16.bmp #elif LCD_WIDTH >= 160 brickmania_ball.5x5x16.bmp -brickmania_menu_items.160x128x16.bmp brickmania_bricks.160x128x16.bmp -brickmania_menu_bg.160x128x16.bmp brickmania_pads.160x128x16.bmp brickmania_powerups.160x128x16.bmp brickmania_break.160x128x16.bmp #elif LCD_WIDTH >= 132 brickmania_ball.4x4x16.bmp -brickmania_menu_items.132x80x16.bmp brickmania_bricks.132x80x16.bmp -brickmania_menu_bg.132x80x16.bmp brickmania_pads.132x80x16.bmp brickmania_powerups.132x80x16.bmp brickmania_break.132x80x16.bmp #elif LCD_WIDTH >= 128 brickmania_ball.4x4x16.bmp -brickmania_menu_items.132x80x16.bmp brickmania_bricks.128x128x16.bmp -brickmania_menu_bg.128x128x16.bmp brickmania_pads.132x80x16.bmp brickmania_powerups.132x80x16.bmp brickmania_break.132x80x16.bmp #endif /* different colour displays */ #elif LCD_DEPTH > 1 brickmania_gameover.86x43x2.bmp -brickmania_menu_items.160x128x2.bmp -brickmania_menu_bg.160x128x2.bmp brickmania_pads.160x128x2.bmp brickmania_powerups.160x128x2.bmp #if (LCD_WIDTH >= 160) @@ -74,7 +57,6 @@ brickmania_bricks.128x96x2.bmp #endif #else /* mono */ brickmania_gameover.59x30x1.bmp -brickmania_menu_items.112x64x1.bmp brickmania_bricks.112x64x1.bmp brickmania_ball.3x3x1.bmp brickmania_pads.112x64x1.bmp diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c index 15c1641..226bb4c 100644 --- a/apps/plugins/brickmania.c +++ b/apps/plugins/brickmania.c @@ -220,21 +220,23 @@ CONFIG_KEYPAD == SANSA_M200_PAD enum menu_items { BM_START, - BM_SEL_START, BM_RESUME, - BM_SEL_RESUME, - BM_NO_RESUME, BM_HELP, - BM_SEL_HELP, - BM_QUIT, - BM_SEL_QUIT, + BM_HIGHSCORE, + BM_QUIT }; +MENUITEM_STRINGLIST (main_menu, "Brickmania", NULL, + "Start", + "Resume", + "Help", + "High Score", + "Quit"); + #include "pluginbitmaps/brickmania_pads.h" #include "pluginbitmaps/brickmania_bricks.h" #include "pluginbitmaps/brickmania_powerups.h" #include "pluginbitmaps/brickmania_ball.h" -#include "pluginbitmaps/brickmania_menu_items.h" #include "pluginbitmaps/brickmania_gameover.h" #define PAD_WIDTH BMPWIDTH_brickmania_pads @@ -246,18 +248,9 @@ enum menu_items { #define POWERUP_WIDTH BMPWIDTH_brickmania_powerups #define BALL BMPHEIGHT_brickmania_ball #define HALFBALL ((BALL+1)/2) -#define MENU_ITEMXOFS ((LCD_WIDTH - BMPWIDTH_brickmania_menu_items)/2) -#define MENU_ITEMHEIGHT (BMPHEIGHT_brickmania_menu_items/9) -#define MENU_ITEMWIDTH BMPWIDTH_brickmania_menu_items #define GAMEOVER_WIDTH BMPWIDTH_brickmania_gameover #define GAMEOVER_HEIGHT BMPHEIGHT_brickmania_gameover -#if LCD_DEPTH > 1 /* currently no background bmp for mono screens */ -#include "pluginbitmaps/brickmania_menu_bg.h" -#define MENU_BGHEIGHT BMPHEIGHT_brickmania_menu_bg -#define MENU_BGWIDTH BMPWIDTH_brickmania_menu_bg -#endif - #ifdef HAVE_LCD_COLOR /* currently no transparency for non-colour */ #include "pluginbitmaps/brickmania_break.h" #endif @@ -273,8 +266,6 @@ enum menu_items { #define TOPMARGIN 30 #define BMPYOFS_start 110 -#define HIGHSCORE_XPOS 57 -#define HIGHSCORE_YPOS 88 #define STRINGPOS_FINISH 140 #define STRINGPOS_CONGRATS 157 @@ -298,8 +289,6 @@ enum menu_items { #define YOFS ((LCD_HEIGHT-176)/BRICK_HEIGHT/2)*BRICK_HEIGHT #define BMPYOFS_start (78+YOFS) -#define HIGHSCORE_XPOS (17+XOFS) -#define HIGHSCORE_YPOS (56+YOFS) #define STRINGPOS_FINISH 140 #define STRINGPOS_CONGRATS 157 @@ -320,8 +309,6 @@ enum menu_items { #else #define BMPYOFS_start 66 #endif -#define HIGHSCORE_XPOS 10 -#define HIGHSCORE_YPOS 38 #define STRINGPOS_FINISH 110 #define STRINGPOS_CONGRATS 100 @@ -339,8 +326,6 @@ enum menu_items { #define TOPMARGIN 10 #define BMPYOFS_start 30 -#define HIGHSCORE_XPOS 68 -#define HIGHSCORE_YPOS 8 #define STRINGPOS_FINISH 55 #define STRINGPOS_CONGRATS 45 @@ -359,8 +344,6 @@ enum menu_items { #define TOPMARGIN 15 #define BMPYOFS_start 70 -#define HIGHSCORE_XPOS 8 -#define HIGHSCORE_YPOS 36 #define STRINGPOS_FINISH 55 #define STRINGPOS_CONGRATS 45 @@ -378,8 +361,6 @@ enum menu_items { #define TOPMARGIN 10 #define BMPYOFS_start 51 -#define HIGHSCORE_XPOS 73 -#define HIGHSCORE_YPOS 25 #define STRINGPOS_FINISH 54 #define STRINGPOS_CONGRATS 44 @@ -397,8 +378,6 @@ enum menu_items { #define TOPMARGIN 10 #define BMPYOFS_start 42 -#define HIGHSCORE_XPOS 65 -#define HIGHSCORE_YPOS 25 #define STRINGPOS_FINISH 54 #define STRINGPOS_CONGRATS 44 @@ -416,8 +395,6 @@ enum menu_items { #define TOPMARGIN 10 #define BMPYOFS_start 22 -#define HIGHSCORE_XPOS 0 -#define HIGHSCORE_YPOS 0 #define STRINGPOS_FINISH 54 #define STRINGPOS_CONGRATS 44 @@ -437,8 +414,6 @@ enum menu_items { #define TOPMARGIN 21 #define BMPYOFS_start 58 -#define HIGHSCORE_XPOS 7 -#define HIGHSCORE_YPOS 36 #define STRINGPOS_FINISH 110 #define STRINGPOS_CONGRATS 110 @@ -454,11 +429,6 @@ enum menu_items { #define GAMESCREEN_HEIGHT LCD_HEIGHT #endif -/* calculate menu item offsets from the first defined and the height*/ -#define BMPYOFS_resume (BMPYOFS_start + MENU_ITEMHEIGHT) -#define BMPYOFS_help (BMPYOFS_start + 2*MENU_ITEMHEIGHT) -#define BMPYOFS_quit (BMPYOFS_start + 3*MENU_ITEMHEIGHT) - /*calculate paddle y-position */ #if GAMESCREEN_HEIGHT >= 128 #define PAD_POS_Y GAMESCREEN_HEIGHT -PAD_HEIGHT - 2 @@ -467,20 +437,6 @@ enum menu_items { #endif -#ifdef HAVE_TOUCHSCREEN -#include "lib/touchscreen.h" - -static struct ts_mapping main_menu_items[4] = -{ - {MENU_ITEMXOFS, BMPYOFS_start, MENU_ITEMWIDTH, MENU_ITEMHEIGHT}, - {MENU_ITEMXOFS, BMPYOFS_resume, MENU_ITEMWIDTH, MENU_ITEMHEIGHT}, - {MENU_ITEMXOFS, BMPYOFS_help, MENU_ITEMWIDTH, MENU_ITEMHEIGHT}, - {MENU_ITEMXOFS, BMPYOFS_quit, MENU_ITEMWIDTH, MENU_ITEMHEIGHT} -}; -static struct ts_mappings main_menu = {main_menu_items, 4}; -#endif - - int levels_num = 29; static unsigned char levels[29][8][10] = { @@ -907,205 +863,64 @@ void sleep (int secs) } +/* forward declaration, used in game_menu */ +int help(int when); + #define HIGH_SCORE "brickmania.score" -#define MENU_LENGTH 4 int game_menu(int when) { - int button,cur=0; - char str[10]; - rb->lcd_clear_display(); -#if LCD_DEPTH > 1 /* currently no background bmp for mono screens */ - rb->lcd_bitmap(brickmania_menu_bg, 0, 0, MENU_BGWIDTH, MENU_BGHEIGHT); -#endif - while (true) { - for(i=0;ilcd_bitmap_transparent_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_SEL_START, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_start, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - else - rb->lcd_bitmap_transparent_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_START, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_start, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - - if (when==1) { - if (cur==1) - rb->lcd_bitmap_transparent_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_SEL_RESUME, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_resume, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); + /* clear any previous button presses (especially when coming from + * game over, but it doesn't hurt to do it always) + */ + rb->button_clear_queue(); + + int choice = 0; + + while (1) { + choice = rb->do_menu(&main_menu, &choice, NULL, false); + + switch (choice) { + case BM_START: + score=0; + vscore=0; + life=2; + cur_level=0; + int_game(1); + return choice; + + case BM_RESUME: + /* resume if we can */ + if (when==1) + return choice; else - rb->lcd_bitmap_transparent_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_RESUME, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_resume, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - - } else { - rb->lcd_bitmap_transparent_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_NO_RESUME, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_resume, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - } - + rb->splash(HZ/2, "Nothing to resume!"); + break; - if (cur==2) - rb->lcd_bitmap_transparent_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_SEL_HELP, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_help, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - else - rb->lcd_bitmap_transparent_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_HELP, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_help, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - - if (cur==3) - rb->lcd_bitmap_transparent_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_SEL_QUIT, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_quit, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - else - rb->lcd_bitmap_transparent_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_QUIT, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_quit, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); -#else - if (cur==0) - rb->lcd_bitmap_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_SEL_START, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_start, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - else - rb->lcd_bitmap_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_START, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_start, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - - if (when==1) { - if (cur==1) - rb->lcd_bitmap_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_SEL_RESUME, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_resume, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); + case BM_HELP: + if (help(when)==1) + return BM_QUIT; else - rb->lcd_bitmap_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_RESUME, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_resume, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - - } else { - rb->lcd_bitmap_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_NO_RESUME, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_resume, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - } - - - if (cur==2) - rb->lcd_bitmap_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_SEL_HELP, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_help, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - else - rb->lcd_bitmap_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_HELP, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_help, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - - if (cur==3) - rb->lcd_bitmap_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_SEL_QUIT, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_quit, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); - else - rb->lcd_bitmap_part(brickmania_menu_items, 0, - MENU_ITEMHEIGHT * BM_QUIT, MENU_ITEMWIDTH, - MENU_ITEMXOFS, BMPYOFS_quit, MENU_ITEMWIDTH, - MENU_ITEMHEIGHT); -#endif - } - rb->lcd_set_drawmode(DRMODE_FG); - /* high score */ -#ifdef HAVE_LCD_COLOR - rb->lcd_set_background(LCD_RGBPACK(0,0,140)); - rb->lcd_set_foreground(LCD_WHITE); -#endif - rb->lcd_putsxy(HIGHSCORE_XPOS, HIGHSCORE_YPOS, "High Score"); - rb->snprintf(str, sizeof(str), "%d", highscore); - rb->lcd_getstringsize("High Score", &sw, NULL); - rb->lcd_getstringsize(str, &w, NULL); - rb->lcd_putsxy(HIGHSCORE_XPOS+sw/2-w/2, HIGHSCORE_YPOS+9, str); - rb->lcd_set_drawmode(DRMODE_SOLID); - - rb->lcd_update(); + return choice; - button = rb->button_get(true); -#ifdef HAVE_TOUCHSCREEN - if(button & BUTTON_TOUCHSCREEN) - { - unsigned int result = touchscreen_map(&main_menu, rb->button_get_data() >> 16, rb->button_get_data() & 0xffff); - if(result != (unsigned)-1 && button & BUTTON_REL) - { - if(cur == (signed)result) - button = SELECT; - cur = result; - } - } -#endif - switch(button) { - case UP: - case UP | BUTTON_REPEAT: - if (cur==0) - cur = MENU_LENGTH-1; - else - cur--; - if (when==0 && cur==1) { - cur = 0; - } + case BM_HIGHSCORE: + rb->splashf(HZ*2, "High Score: %d", highscore); break; - case DOWN: - case DOWN | BUTTON_REPEAT: - if (cur==MENU_LENGTH-1) - cur = 0; - else - cur++; - if (when==0 && cur==1) { - cur=2; - } - break; + case BM_QUIT: + case MENU_ATTACHED_USB: + return BM_QUIT; - case RIGHT: - case SELECT: - if (cur==0) { - score=0; - vscore=0; - return 0; - } else if (cur==1 && when==1) { - return 1; - } else if (cur==2) { - return 2; - } else if (cur==3) { - return 3; - } - break; -#ifdef RC_QUIT - case RC_QUIT: -#endif - case QUIT: - return 3; - break; + case GO_TO_ROOT: + case GO_TO_PREVIOUS: + /* Resume if we can resume, otherwise quit */ + if (when==1) + return BM_RESUME; + else + return BM_QUIT; default: - if(rb->default_event_handler(button) == SYS_USB_CONNECTED) - return 3; break; } - - rb->yield(); } } @@ -1202,20 +1017,12 @@ int help(int when) #endif case QUIT: switch (game_menu(when)) { - case 0: - cur_level=0; - life=2; - int_game(1); - break; - case 1: + case BM_RESUME: con_game=1; break; - case 2: - if (help(when)==1) - return 1; - break; - case 3: + case BM_QUIT: return 1; + default: break; } return 0; @@ -1299,19 +1106,12 @@ int game_loop(void) configfile_load(HIGH_SCORE,config,1,0); switch(game_menu(0)) { - case 0: - cur_level = 0; - life = 2; - int_game(1); - break; - case 1: - con_game = 1; + case BM_RESUME: + con_game=1; break; - case 2: - if (help(0) == 1) return 1; - break; - case 3: + case BM_QUIT: return 1; + default: break; } @@ -1865,19 +1665,12 @@ int game_loop(void) } switch(game_menu(0)) { - case 0: - life=2; - cur_level=0; - int_game(1); - break; - case 1: + case BM_RESUME: con_game=1; break; - case 2: - if (help(0)==1) return 1; - break; - case 3: + case BM_QUIT: return 1; + default: break; } } @@ -2009,22 +1802,14 @@ int game_loop(void) #endif case QUIT: switch(game_menu(1)) { - case 0: - life=2; - cur_level=0; - int_game(1); - break; - case 1: + case BM_RESUME: for(k=0;k