diff -u -r patch_rockbox/apps/plugins/brickmania.c changed_rockbox/apps/plugins/brickmania.c --- patch_rockbox/apps/plugins/brickmania.c 2009-03-22 19:40:08.000000000 +0100 +++ changed_rockbox/apps/plugins/brickmania.c 2009-03-23 22:06:58.000000000 +0100 @@ -20,27 +20,24 @@ ****************************************************************************/ #include "plugin.h" -#include "lib/configfile.h" /* Part of libplugin */ +#include "lib/configfile.h" #include "lib/helper.h" #include "lib/playback_control.h" +#include "lib/highscore.h" PLUGIN_HEADER - -#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) - +#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ + (CONFIG_KEYPAD == IRIVER_H300_PAD) #define QUIT BUTTON_OFF #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT #define SELECT BUTTON_SELECT #define UP BUTTON_UP #define DOWN BUTTON_DOWN - #define RC_QUIT BUTTON_RC_STOP - #elif CONFIG_KEYPAD == ONDIO_PAD - #define QUIT BUTTON_OFF #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -48,9 +45,7 @@ #define UP BUTTON_UP #define DOWN BUTTON_DOWN - #elif CONFIG_KEYPAD == RECORDER_PAD - #define QUIT BUTTON_OFF #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -58,9 +53,7 @@ #define UP BUTTON_UP #define DOWN BUTTON_DOWN - #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD - #define QUIT BUTTON_OFF #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -68,24 +61,19 @@ #define UP BUTTON_UP #define DOWN BUTTON_DOWN - #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ (CONFIG_KEYPAD == IPOD_3G_PAD) || \ (CONFIG_KEYPAD == IPOD_1G2G_PAD) - #define QUIT BUTTON_MENU #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT #define SELECT BUTTON_SELECT #define UP BUTTON_SCROLL_BACK #define DOWN BUTTON_SCROLL_FWD - #define SCROLL_FWD(x) ((x) & BUTTON_SCROLL_FWD) #define SCROLL_BACK(x) ((x) & BUTTON_SCROLL_BACK) - #elif (CONFIG_KEYPAD == GIGABEAT_PAD) - #define QUIT BUTTON_POWER #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -93,9 +81,7 @@ #define UP BUTTON_UP #define DOWN BUTTON_DOWN - #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD - #define QUIT BUTTON_POWER #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -103,25 +89,19 @@ #define UP BUTTON_UP #define DOWN BUTTON_DOWN - #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \ (CONFIG_KEYPAD == SANSA_FUZE_PAD) - -#define QUIT BUTTON_POWER -#define LEFT BUTTON_LEFT -#define RIGHT BUTTON_RIGHT -#define SELECT BUTTON_SELECT -#define UP BUTTON_SCROLL_BACK -#define DOWN BUTTON_SCROLL_FWD - +#define QUIT BUTTON_POWER +#define LEFT BUTTON_LEFT +#define RIGHT BUTTON_RIGHT +#define SELECT BUTTON_SELECT +#define UP BUTTON_UP +#define DOWN BUTTON_DOWN #define SCROLL_FWD(x) ((x) & BUTTON_SCROLL_FWD) #define SCROLL_BACK(x) ((x) & BUTTON_SCROLL_BACK) - -#elif CONFIG_KEYPAD == SANSA_C200_PAD || \ -CONFIG_KEYPAD == SANSA_CLIP_PAD || \ -CONFIG_KEYPAD == SANSA_M200_PAD - +#elif (CONFIG_KEYPAD == SANSA_C200_PAD) || \ + (CONFIG_KEYPAD == SANSA_M200_PAD) #define QUIT BUTTON_POWER #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -131,9 +111,15 @@ #define UP BUTTON_UP #define DOWN BUTTON_DOWN +#elif CONFIG_KEYPAD == SANSA_CLIP_PAD +#define QUIT BUTTON_POWER +#define LEFT BUTTON_LEFT +#define RIGHT BUTTON_RIGHT +#define SELECT BUTTON_SELECT +#define UP BUTTON_UP +#define DOWN BUTTON_DOWN #elif CONFIG_KEYPAD == IRIVER_H10_PAD - #define QUIT BUTTON_POWER #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -142,7 +128,6 @@ #define DOWN BUTTON_SCROLL_DOWN #elif CONFIG_KEYPAD == GIGABEAT_S_PAD - #define QUIT BUTTON_BACK #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -151,7 +136,6 @@ #define DOWN BUTTON_DOWN #elif (CONFIG_KEYPAD == MROBE100_PAD) - #define QUIT BUTTON_POWER #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -160,21 +144,18 @@ #define DOWN BUTTON_DOWN #elif CONFIG_KEYPAD == IAUDIO_M3_PAD - #define QUIT BUTTON_RC_REC #define LEFT BUTTON_RC_REW #define RIGHT BUTTON_RC_FF #define SELECT BUTTON_RC_PLAY #define UP BUTTON_RC_VOL_UP #define DOWN BUTTON_RC_VOL_DOWN - #define RC_QUIT BUTTON_REC #elif CONFIG_KEYPAD == COWOND2_PAD #define QUIT BUTTON_POWER #elif CONFIG_KEYPAD == CREATIVEZVM_PAD - #define QUIT BUTTON_BACK #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -183,7 +164,6 @@ #define DOWN BUTTON_DOWN #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD - #define QUIT BUTTON_POWER #define LEFT BUTTON_LEFT #define RIGHT BUTTON_RIGHT @@ -196,6 +176,9 @@ #endif #ifdef HAVE_TOUCHSCREEN +#ifndef QUIT +#define QUIT BUTTON_TOUCHSCREEN +#endif #ifndef LEFT #define LEFT BUTTON_MIDLEFT #endif @@ -218,24 +201,6 @@ #define SCROLL_BACK(x) (0) #endif - -enum menu_items { - BM_START, - BM_RESUME, - BM_HELP, - BM_HIGHSCORE, - BM_PLAYBACK_CONTROL, - BM_QUIT -}; - -MENUITEM_STRINGLIST (main_menu, "Brickmania", NULL, - "Start", - "Resume", - "Help", - "High Score", - "Playback Control", - "Quit"); - #include "pluginbitmaps/brickmania_pads.h" #include "pluginbitmaps/brickmania_bricks.h" #include "pluginbitmaps/brickmania_powerups.h" @@ -743,9 +708,12 @@ int pad_type; int score=0,vscore=0; bool flip_sides=false; -int cur_level=0; +int level=0; int brick_on_board=0; int used_balls=1; +int difficult=0; +bool saved_game=false; +int l_score=0; typedef struct cube { int powertop; @@ -776,15 +744,22 @@ } sfire; sfire fire[30]; +#define config_file "brickmania.cfg" -int highscore; -#define MAX_POINTS 200000 /* i dont think it needs to be more */ -static struct configdata config[] = -{ - {TYPE_INT, 0, MAX_POINTS, { .int_p = &highscore }, "highscore", NULL} +static struct configdata config[] = { + {TYPE_INT, 0, 1, { .int_p = &difficult }, "difficult", NULL}, + {TYPE_BOOL, 0, 1, { .bool_p = &saved_game }, "saved_game", NULL}, + {TYPE_INT, 0, 40000, { .int_p = &l_score }, "l_score", NULL}, + {TYPE_INT, 0, 29, { .int_p = &level }, "level", NULL}, + {TYPE_INT, 0, 30, { .int_p = &life }, "life", NULL}, }; -void int_game(int new_game) +#define HIGH_SCORE PLUGIN_GAMES_DIR "/brickmania.score" +#define MAX_HIGH_SCORES 5 + +struct highscore Highest[MAX_HIGH_SCORES]; + +static void brickmania_int_game(int new_game) { int i,j; @@ -807,27 +782,30 @@ flip_sides=false; - if (new_game==1) + if (new_game==1) { brick_on_board=0; - + /* add one life per achieved level */ + if (difficult==0 && life<2) + life++; + } for(i=0;i<=7;i++) { for(j=0;j<=9;j++) { - brick[i*10+j].poweruse=(levels[cur_level][i][j]==0?0:1); + brick[i*10+j].poweruse=(levels[level][i][j]==0?0:1); if (i*10+j<=30) fire[i*10+j].top=-8; if (new_game==1) { brick[i*10+j].power=rb->rand()%25; /* +8 make the game with less powerups */ - brick[i*10+j].hits=levels[cur_level][i][j]>=10? - levels[cur_level][i][j]/16-1:0; + brick[i*10+j].hits=levels[level][i][j]>=10? + levels[level][i][j]/16-1:0; brick[i*10+j].hiteffect=0; brick[i*10+j].powertop=TOPMARGIN+i*BRICK_HEIGHT+BRICK_HEIGHT; - brick[i*10+j].used=(levels[cur_level][i][j]==0?0:1); - brick[i*10+j].color=(levels[cur_level][i][j]>=10? - levels[cur_level][i][j]%16: - levels[cur_level][i][j])-1; - if (levels[cur_level][i][j]!=0) + brick[i*10+j].used=(levels[level][i][j]==0?0:1); + brick[i*10+j].color=(levels[level][i][j]>=10? + levels[level][i][j]%16: + levels[level][i][j])-1; + if (levels[level][i][j]!=0) brick_on_board++; } } @@ -836,8 +814,8 @@ int sw,i,w; -/* sleep timer counting the score */ -void sleep (int secs) +/* brickmania_sleep timer counting the score */ +static void brickmania_sleep(int secs) { bool done=false; char s[20]; @@ -866,72 +844,188 @@ } -/* forward declaration, used in game_menu */ -int help(int when); - -#define HIGH_SCORE "brickmania.score" -int game_menu(int when) +/* display a highscore*/ +static void brickmania_show_highscores(int p) { - /* 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 w; + int h; +#ifdef HAVE_LCD_COLOR + rb->lcd_set_background(LCD_BLACK); + rb->lcd_clear_display(); + rb->lcd_set_background(LCD_BLACK); + rb->lcd_set_foreground(LCD_WHITE); +#else + rb->lcd_clear_display(); +#endif + char str[25]; + int i; + rb->lcd_getstringsize("Highscore", &w, &h); + rb->lcd_putsxy(LCD_WIDTH/2-w/2, 5, "Highscore"); + + rb->lcd_putsxy(30,2*(h+2), "Score"); + rb->lcd_putsxy(80,2*(h+2), "Level"); + + + for (i = 1; i<=MAX_HIGH_SCORES; i++) + { + rb->snprintf (str, sizeof (str), "%d)", i); + rb->lcd_putsxy (5,3*(h+2)+ 10 * (i-1), str); + rb->snprintf (str, sizeof (str), "%d", Highest[i-1].score); + rb->lcd_putsxy (30,3*(h+2)+ 10 * (MAX_HIGH_SCORES-i), str); + rb->snprintf (str, sizeof (str), "%d", (Highest[i-1].level)+1); + rb->lcd_putsxy (80,3*(h+2)+ 10 * (MAX_HIGH_SCORES-i), str); + } - int choice = 0; +#ifdef HAVE_LCD_COLOR + rb->lcd_set_foreground(LCD_RGBPACK(245,0,0)); + rb->snprintf (str, sizeof (str), "%d)", MAX_HIGH_SCORES-p+1); + rb->lcd_putsxy (5,3*(h+2)+ 10 * (MAX_HIGH_SCORES-p), str); + rb->snprintf (str, sizeof (str), "%d", Highest[p-1].score); + rb->lcd_putsxy (30,3*(h+2)+ 10 * (MAX_HIGH_SCORES-p), str); + rb->snprintf (str, sizeof (str), "%d", (Highest[p-1].level)+1); + rb->lcd_putsxy (80,3*(h+2)+ 10 * (MAX_HIGH_SCORES-p), str); + rb->lcd_set_foreground(LCD_WHITE); +#endif + rb->lcd_update(); + rb->button_get(true); +} - 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->splash(HZ/2, "Nothing to resume!"); - break; +/* forward declaration, used in brickmania_game_menu */ +static int brickmania_help(void); +static int brickmania_choose_difficult(void); - case BM_HELP: - if (help(when)==1) - return BM_QUIT; - else - return choice; +static int brickmania_game_menu(int when) +{ + rb->button_clear_queue(); + int choice = 0; - case BM_HIGHSCORE: - rb->splashf(HZ*2, "High Score: %d", highscore); - break; + if (when==1) { + MENUITEM_STRINGLIST (main_menu, "Brickmania Menu", NULL, + "Resume Game", + "Restart Game", + "Difficulty", + "Help", + "High Score", + "Playback Control", + "Quit"); + + while (1) { + choice = rb->do_menu(&main_menu, &choice, NULL, false); + switch (choice) { + case 0: + if (saved_game) { + vscore=l_score-1; + score=l_score; + brickmania_int_game(1); + } + else { + con_game=1; + } + return 0; + case 1: + score=0; + vscore=0; + life=2; + level=0; + brickmania_int_game(1); + return 0; + case 2: + brickmania_choose_difficult(); + break; + case 3: + brickmania_help(); + break; + case 4: + brickmania_show_highscores(MAX_HIGH_SCORES); + break; + case 5: + playback_control(NULL); + break; + case 6: + if (level>0) { + saved_game=true; + } + else { + saved_game=false; + } + configfile_save(config_file,config,5,0); + return 1; + case MENU_ATTACHED_USB: + return 1; + default: + break; + } + } + } + else { + MENUITEM_STRINGLIST (main_menu, "Brickmania Menu", NULL, + "Start New Game", + "Difficulty", + "Help", + "High Score", + "Playback Control", + "Quit"); + + while (1) { + choice = rb->do_menu(&main_menu, &choice, NULL, false); + switch (choice) { + case 0: + score=0; + vscore=0; + life=2; + level=0; + brickmania_int_game(1); + return 0; + case 1: + brickmania_choose_difficult(); + break; + case 2: + brickmania_help(); + break; + case 3: + brickmania_show_highscores(MAX_HIGH_SCORES); + break; + case 4: + playback_control(NULL); + break; + case 5: + configfile_save(config_file,config,1,0); + return 1; + case MENU_ATTACHED_USB: + return 1; + default: + break; + } + } + } +} - case BM_PLAYBACK_CONTROL: - playback_control(NULL); +/* submenu to choose difficult */ +static int brickmania_choose_difficult(void) +{ + rb->button_clear_queue(); + int choice = difficult; + MENUITEM_STRINGLIST (main_menu, "Brickmania Difficulty", NULL, + "Easy", + "Hard"); + choice = rb->do_menu(&main_menu, &choice, NULL, false); + switch (choice) { + case 0: + difficult=0; + break; + case 1: + difficult=1; break; - - case BM_QUIT: - case MENU_ATTACHED_USB: - return BM_QUIT; - - 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: break; } - } + rb->button_clear_queue(); + return 0; } -int help(int when) +static int brickmania_help(void) { int w,h; int button; @@ -942,7 +1036,7 @@ int maxY=180; int maxX=215; - while(true) { + while(1) { #ifdef HAVE_LCD_COLOR rb->lcd_set_background(LCD_BLACK); rb->lcd_clear_display(); @@ -1019,36 +1113,23 @@ #ifdef RC_QUIT case RC_QUIT: #endif -#ifdef HAVE_TOUCHSCREEN - case BUTTON_TOUCHSCREEN: -#endif case QUIT: - switch (game_menu(when)) { - case BM_RESUME: - con_game=1; - break; - case BM_QUIT: - return 1; - default: - break; - } return 0; - break; - case LEFT: - case LEFT | BUTTON_REPEAT: #ifdef ALTLEFT case ALTLEFT: case ALTLEFT | BUTTON_REPEAT: #endif + case LEFT: + case LEFT | BUTTON_REPEAT: if( xoffset<0) xoffset+=2; break; - case RIGHT: - case RIGHT | BUTTON_REPEAT: #ifdef ALTRIGHT case ALTRIGHT: case ALTRIGHT | BUTTON_REPEAT: #endif + case RIGHT: + case RIGHT | BUTTON_REPEAT: if(xoffset+maxX > LCD_WIDTH) xoffset-=2; break; @@ -1062,19 +1143,16 @@ if(yoffset+maxY > LCD_HEIGHT) yoffset-=2; break; - default: if(rb->default_event_handler(button) == SYS_USB_CONNECTED) return 1; break; } - rb->yield(); } - return 0; } -int pad_check(int ballxc, int mode, int pon ,int ballnum) +static int brickmania_pad_check(int ballxc, int mode, int pon ,int ballnum) { /* pon: positive(1) or negative(0) */ @@ -1091,7 +1169,7 @@ } } -int fire_space(void) +static int brickmania_fire_space(void) { int t; for(t=0;t<=30;t++) @@ -1101,28 +1179,30 @@ return 0; } -int game_loop(void) +static int brickmania_game_loop(void) { int j,i,k,bricky,brickx; char s[30]; int sec_count=0,num_count=10; int end; + int position; + + configfile_load(config_file,config,5,0); rb->srand( *rb->current_tick ); - - configfile_load(HIGH_SCORE,config,1,0); - - switch(game_menu(0)) { - case BM_RESUME: - con_game=1; - break; - case BM_QUIT: + if (saved_game) { + + if (brickmania_game_menu(1)!=0) { + return 1; + } + } + else { + if (brickmania_game_menu(0)!=0) { return 1; - default: - break; + } } - while(true) { + while(1) { /* Convert CYCLETIME (in ms) to HZ */ end = *rb->current_tick + (CYCLETIME * HZ) / 1000; @@ -1165,11 +1245,11 @@ #endif #if (LCD_WIDTH == 112) && (LCD_HEIGHT == 64) - rb->snprintf(s, sizeof(s), "L%d", cur_level+1); + rb->snprintf(s, sizeof(s), "L%d", level+1); rb->lcd_getstringsize(s, &sw, NULL); rb->lcd_putsxy(LCD_WIDTH-sw, 0, s); #else - rb->snprintf(s, sizeof(s), "Level %d", cur_level+1); + rb->snprintf(s, sizeof(s), "Level %d", level+1); rb->lcd_getstringsize(s, &sw, NULL); rb->lcd_putsxy(LCD_WIDTH-sw-2, 2, s); #endif @@ -1249,8 +1329,8 @@ case 1: life--; if (life>=0) { - int_game(0); - sleep(2); + brickmania_int_game(0); + brickmania_sleep(2); } break; case 2: @@ -1533,8 +1613,8 @@ } else { life--; if (life>=0) { - int_game(0); - sleep(2); + brickmania_int_game(0); + brickmania_sleep(2); } } } @@ -1561,7 +1641,7 @@ ball[k].y = -2; if (ball[k].pos_x != 0 && ball[k].pos_x+BALL!=LCD_WIDTH) - ball[k].x = pad_check(6,0,ball[k].pos_x+2<= + ball[k].x = brickmania_pad_check(6,0,ball[k].pos_x+2<= pad_pos_x+(PAD_WIDTH/2)? 0:1,k); @@ -1578,7 +1658,7 @@ ball[k].y = -3; if (ball[k].pos_x != 0 && ball[k].pos_x+BALL!=LCD_WIDTH) - ball[k].x = pad_check(4,0,ball[k].pos_x+2<= + ball[k].x = brickmania_pad_check(4,0,ball[k].pos_x+2<= pad_pos_x+(PAD_WIDTH/2)? 0:1,k); @@ -1595,7 +1675,7 @@ ball[k].y = -4; if (ball[k].pos_x != 0 && ball[k].pos_x+BALL!=LCD_WIDTH) - ball[k].x = pad_check(3,0,ball[k].pos_x+2<= + ball[k].x = brickmania_pad_check(3,0,ball[k].pos_x+2<= pad_pos_x+(PAD_WIDTH/2)? 0:1,k); @@ -1611,7 +1691,7 @@ ball[k].y = -4; if (ball[k].pos_x != 0 && ball[k].pos_x+BALL!=LCD_WIDTH) - ball[k].x = pad_check(2,1,0,k); + ball[k].x = brickmania_pad_check(2,1,0,k); } else { @@ -1640,11 +1720,13 @@ rb->lcd_update(); if (brick_on_board < 0) { - if (cur_level+1lcd_getstringsize("Congratulations!", &sw, NULL); @@ -1661,24 +1743,22 @@ "You have finished the game!"); #endif vscore=score; - rb->lcd_update(); - if (score>highscore) { - sleep(2); - highscore=score; - rb->splash(HZ*2, "New High Score"); + brickmania_sleep(2); + position=highscore_update(score,level,Highest,MAX_HIGH_SCORES); + if (position==MAX_HIGH_SCORES) { + rb->splash(HZ*2, "New High Score"); + brickmania_show_highscores(position); + } + else if (position!=0) { + rb->splash(HZ*2, "Top Five"); + brickmania_show_highscores(position); } else { - sleep(3); + brickmania_sleep(3); } - switch(game_menu(0)) { - case BM_RESUME: - con_game=1; - break; - case BM_QUIT: - return 1; - default: - break; + if (brickmania_game_menu(0)!=0) { + return 0; } } } @@ -1790,10 +1870,10 @@ } } else if (pad_type==2 && con_game!=1) { int tfire; - tfire=fire_space(); + tfire=brickmania_fire_space(); fire[tfire].top=PAD_POS_Y-7; fire[tfire].left=pad_pos_x+1; - tfire=fire_space(); + tfire=brickmania_fire_space(); fire[tfire].top=PAD_POS_Y-7; fire[tfire].left=pad_pos_x+PAD_WIDTH-1; } else if (con_game==1 && start_game!=1) { @@ -1808,16 +1888,8 @@ case RC_QUIT: #endif case QUIT: - switch(game_menu(1)) { - case BM_RESUME: - for(k=0;klcd_update(); - if (score>highscore) { - sleep(2); - highscore=score; - rb->splash(HZ*2, "New High Score"); - } else { - sleep(3); + brickmania_sleep(2); + position=highscore_update(score,level,Highest,MAX_HIGH_SCORES); + if (position==MAX_HIGH_SCORES) { + rb->splash(HZ*2, "New High Score"); + brickmania_show_highscores(position); + } + else if (position!=0) { + rb->splash(HZ*2, "Top Five"); + brickmania_show_highscores(position); + } + else { + brickmania_sleep(3); } for(k=0;k *rb->current_tick) @@ -1884,6 +1956,8 @@ { (void)parameter; + highscore_load(HIGH_SCORE,Highest,MAX_HIGH_SCORES); + rb->lcd_setfont(FONT_SYSFIXED); #if LCD_DEPTH > 1 rb->lcd_set_backdrop(NULL); @@ -1892,10 +1966,9 @@ backlight_force_on(); /* backlight control in lib/helper.c */ /* now go ahead and have fun! */ - while (game_loop()!=1); - - configfile_save(HIGH_SCORE,config,1,0); + brickmania_game_loop(); + highscore_save(HIGH_SCORE,Highest,MAX_HIGH_SCORES); /* Restore user's original backlight setting */ rb->lcd_setfont(FONT_UI); /* Turn on backlight timeout (revert to settings) */ diff -u -r patch_rockbox/apps/plugins/lib/highscore.c changed_rockbox/apps/plugins/lib/highscore.c --- patch_rockbox/apps/plugins/lib/highscore.c 2009-03-22 19:37:00.000000000 +0100 +++ changed_rockbox/apps/plugins/lib/highscore.c 2009-03-22 17:52:24.000000000 +0100 @@ -115,7 +115,7 @@ scores[i].score = score; scores[i].level = level; /* Need to sort out entering a name... maybe old three letter arcade style */ - new = 1; + new = i+1; break; } } diff -u -r patch_rockbox/apps/plugins/rockblox.c changed_rockbox/apps/plugins/rockblox.c --- patch_rockbox/apps/plugins/rockblox.c 2009-03-22 19:40:08.000000000 +0100 +++ changed_rockbox/apps/plugins/rockblox.c 2009-03-23 15:57:22.000000000 +0100 @@ -739,7 +739,7 @@ } #ifdef HIGH_SCORE_Y -static void show_highscores (void) +static void rockblox_show_highscores_ingame (void) { int i; char str[25]; /* for strings */ @@ -752,6 +752,52 @@ } #endif +static void rockblox_show_highscores(int p) +{ + rb->button_clear_queue(); + int w; + int h; +#ifdef HAVE_LCD_COLOR + rb->lcd_set_background(LCD_BLACK); + rb->lcd_clear_display(); + rb->lcd_set_background(LCD_BLACK); + rb->lcd_set_foreground(LCD_WHITE); +#else + rb->lcd_clear_display(); +#endif + char str[25]; + int i; + rb->lcd_getstringsize("Highscore", &w, &h); + rb->lcd_putsxy(LCD_WIDTH/2-w/2, 5, "Highscore"); + + rb->lcd_putsxy(30,2*(h+2), "Score"); + rb->lcd_putsxy(80,2*(h+2), "Level"); + + + for (i = 1; i<=MAX_HIGH_SCORES; i++) + { + rb->snprintf (str, sizeof (str), "%d)", i); + rb->lcd_putsxy (5,3*(h+2)+ 10 * (i-1), str); + rb->snprintf (str, sizeof (str), "%d", Highest[i-1].score); + rb->lcd_putsxy (30,3*(h+2)+ 10 * (MAX_HIGH_SCORES-i), str); + rb->snprintf (str, sizeof (str), "%d", (Highest[i-1].level)); + rb->lcd_putsxy (80,3*(h+2)+ 10 * (MAX_HIGH_SCORES-i), str); + } + +#ifdef HAVE_LCD_COLOR + rb->lcd_set_foreground(LCD_RGBPACK(245,0,0)); + rb->snprintf (str, sizeof (str), "%d)", MAX_HIGH_SCORES-p+1); + rb->lcd_putsxy (5,3*(h+2)+ 10 * (MAX_HIGH_SCORES-p), str); + rb->snprintf (str, sizeof (str), "%d", Highest[p-1].score); + rb->lcd_putsxy (30,3*(h+2)+ 10 * (MAX_HIGH_SCORES-p), str); + rb->snprintf (str, sizeof (str), "%d", Highest[p-1].level); + rb->lcd_putsxy (80,3*(h+2)+ 10 * (MAX_HIGH_SCORES-p), str); + rb->lcd_set_foreground(LCD_WHITE); +#endif + rb->lcd_update(); + rb->button_get(true); +} + static void draw_background (void) { #ifdef HAVE_LCD_BITMAP @@ -767,14 +813,12 @@ #endif show_details (); #ifdef HIGH_SCORE_Y - show_highscores (); + rockblox_show_highscores_ingame (); #endif } static void init_rockblox (void) { - highscore_update(score, level, Highest, MAX_HIGH_SCORES); - level = 1; lines = 0; score = 0; @@ -1070,11 +1114,95 @@ move_block (0, 1, co); } -static int rockblox_loop (void) +static int rockblox_help(void) { + return 0; +} + +static int rockblox_game_menu(int when) +{ + rb->button_clear_queue(); + int choice = 0; + + if (when==1) { + MENUITEM_STRINGLIST (main_menu, "Rockblox Menu", NULL, + "Resume Game", + "Restart Game", + "Help", + "High Score", + "Playback Control", + "Quit"); + + while (1) { + choice = rb->do_menu(&main_menu, &choice, NULL, false); + switch (choice) { + case 0: + return 0; + case 1: + init_rockblox(); + return 0; + case 2: + rockblox_help(); + break; + case 3: + rockblox_show_highscores(MAX_HIGH_SCORES); + break; + case 4: + playback_control(NULL); + break; + case 5: + return 1; + case MENU_ATTACHED_USB: + return 1; + default: + break; + } + } + } + else { + MENUITEM_STRINGLIST (main_menu, "Rockblox Menu", NULL, + "Start New Game", + "Help", + "High Score", + "Playback Control", + "Quit"); + + while (1) { + choice = rb->do_menu(&main_menu, &choice, NULL, false); + switch (choice) { + case 0: + init_rockblox(); + return 0; + case 1: + rockblox_help(); + break; + case 2: + rockblox_show_highscores(MAX_HIGH_SCORES); + break; + case 3: + playback_control(NULL); + break; + case 4: + return 1; + case MENU_ATTACHED_USB: + return 1; + default: + break; + } + } + } +} + +static int rockblox_game_loop(void) +{ + int position; int button; int lastbutton = BUTTON_NONE; long next_down_tick = *rb->current_tick + level_speed(level); + + if (rockblox_game_menu(0)!=0) { + return 0; + } new_block (); @@ -1094,7 +1222,7 @@ rb->lcd_bitmap (rockblox_background, 0, 0, LCD_WIDTH, LCD_HEIGHT); show_details (); #ifdef HIGH_SCORE_Y - show_highscores (); + rockblox_show_highscores_ingame (); #endif draw_next_block (); refresh_board (); @@ -1107,18 +1235,9 @@ case ROCKBLOX_RC_OFF: #endif case ROCKBLOX_OFF: - switch (playback_control_or_quit (NULL)) - { - case PBC_OR_QUIT_QUIT: - return PLUGIN_OK; - - case PBC_OR_QUIT_USB_CONNECTED: - return PLUGIN_USB_CONNECTED; - - default: - case PBC_OR_QUIT_RESUME: - break; - } + if (rockblox_game_menu(1)!=0) { + return 0; + } draw_background (); refresh_board (); draw_next_block (); @@ -1238,20 +1357,24 @@ rb->lcd_set_foreground (LCD_BLACK); #endif rb->splash (HZ * 2, "Game Over"); + position=highscore_update(score,level,Highest,MAX_HIGH_SCORES); + if (position==MAX_HIGH_SCORES) { + rb->splash(HZ*2, "New High Score"); + rockblox_show_highscores(position); + } + else if (position!=0) { + rb->splash(HZ*2, "Top Five"); + rockblox_show_highscores(position); + } init_rockblox (); new_block (); } - refresh_board (); } - - return PLUGIN_OK; } enum plugin_status plugin_start (const void *parameter) { - int ret; - (void) parameter; rb->srand (*rb->current_tick); @@ -1276,7 +1399,7 @@ backlight_force_on(); /* backlight control in lib/helper.c */ init_rockblox (); - ret = rockblox_loop (); + rockblox_game_loop (); #ifdef HAVE_LCD_BITMAP rb->lcd_setfont (FONT_UI); @@ -1287,5 +1410,5 @@ highscore_save(HIGH_SCORE,Highest,MAX_HIGH_SCORES); backlight_use_settings(); /* backlight control in lib/helper.c */ - return ret; + return PLUGIN_OK; } diff -u -r patch_rockbox/apps/plugins/snake.c changed_rockbox/apps/plugins/snake.c --- patch_rockbox/apps/plugins/snake.c 2009-03-22 19:40:08.000000000 +0100 +++ changed_rockbox/apps/plugins/snake.c 2009-03-23 22:17:20.000000000 +0100 @@ -34,7 +34,7 @@ #include "plugin.h" #include "lib/playback_control.h" -#ifdef HAVE_LCD_BITMAP +#include "lib/configfile.h" PLUGIN_HEADER @@ -194,31 +194,38 @@ #define BOARD_HEIGHT (LCD_HEIGHT/4) static int board[BOARD_WIDTH][BOARD_HEIGHT],snakelength; -static unsigned int score,hiscore=0,level=1; -static int dir,dead=0; +int score,highscore=0,level=1; +static int dir; static bool apple; +bool dead=false; -void die (void) +#define config_file "snake.cfg" +static struct configdata config[] = { + {TYPE_INT, 0, 10, { .int_p = &level }, "level", NULL}, + {TYPE_INT, 0, 10000, { .int_p = &highscore }, "highscore", NULL}, +}; + +static void snake_die (void) { char pscore[17]; rb->lcd_clear_display(); rb->snprintf(pscore,sizeof(pscore),"Your score: %d",score); rb->lcd_puts(0,0,"Oops..."); rb->lcd_puts(0,1, pscore); - if (score>hiscore) { - hiscore=score; + if (score>highscore) { + highscore=score; rb->lcd_puts(0,2,"New High Score!"); } else { - rb->snprintf(pscore,sizeof(pscore),"High Score: %d",hiscore); + rb->snprintf(pscore,sizeof(pscore),"High Score: %d",highscore); rb->lcd_puts(0,2,pscore); } rb->lcd_update(); rb->sleep(3*HZ); - dead=1; + dead=true; } -void colission (short x, short y) +static void snake_colission (short x, short y) { switch (board[x][y]) { case 0: @@ -229,14 +236,14 @@ apple=false; break; default: - die(); + snake_die(); break; } if (x==BOARD_WIDTH || x<0 || y==BOARD_HEIGHT || y<0) - die(); + snake_die(); } -void move_head (short x, short y) +static void snake_move_head (short x, short y) { switch (dir) { case 0: @@ -252,14 +259,36 @@ x-=1; break; } - colission (x,y); + snake_colission (x,y); if (dead) return; board[x][y]=1; rb->lcd_fillrect(x*4,y*4,4,4); } -void frame (void) +static void snake_redraw (void) +{ + short x,y; + rb->lcd_clear_display(); + for (x=0; xlcd_fillrect((x*4)+1,y*4,2,4); + rb->lcd_fillrect(x*4,(y*4)+1,4,2); + break; + case 0: + break; + default: + rb->lcd_fillrect(x*4,y*4,4,4); + break; + } + } + } + rb->lcd_update(); +} + +static void snake_frame (void) { short x,y,head=0; for (x=0; xlcd_update(); } -void redraw (void) -{ +static void snake_game_init(void) { short x,y; - rb->lcd_clear_display(); + rb->lcd_clear_display(); + for (x=0; xlcd_fillrect((x*4)+1,y*4,2,4); - rb->lcd_fillrect(x*4,(y*4)+1,4,2); - break; - case 0: - break; - default: - rb->lcd_fillrect(x*4,y*4,4,4); - break; - } + board[x][y]=0; } } - rb->lcd_update(); + apple=false; + dead=false; + snakelength=4; + score=0; + board[11][7]=1; } -void game_pause (void) { - int selection = 0; - MENUITEM_STRINGLIST (paused_menu, "Game Paused", NULL, - "Resume", - "Playback Control", - "Quit"); +static void snake_choose_level(void) +{ + int choice=level-1; + MENUITEM_STRINGLIST (main_menu,"Snake Speed",NULL, "1","2","3","4","5","6","7","8","9"); + level = rb->do_menu(&main_menu, &choice, NULL, false)+1; +} +static int snake_game_menu(int when) +{ rb->button_clear_queue(); + int choice = 0; - while (1) { - selection = rb->do_menu(&paused_menu, &selection, NULL, false); - switch (selection) { - case GO_TO_ROOT: - case GO_TO_PREVIOUS: - case 0: - redraw(); - rb->sleep(HZ/2); - return; - - case 1: - /* if USB is attached in playback control, quit. */ - if (playback_control(NULL)) { - dead=2; - return; - } - break; - - case 2: - dead=1; - return; - - case MENU_ATTACHED_USB: - dead=2; - return; + if (when==1) { + MENUITEM_STRINGLIST(main_menu,"Snake Menu",NULL, + "Resume", + "Snake Speed", + "High Score", + "Playback Control", + "Quit"); + + while (1) { + choice = rb->do_menu(&main_menu, &choice, NULL, false); + switch (choice) { + case 0: + snake_redraw(); + return 0; + case 1: + snake_choose_level(); + break; + case 2: + rb->splashf(HZ*2, "High Score: %d", highscore); + break; + case 3: + playback_control(NULL); + break; + case 4: + return 1; + case MENU_ATTACHED_USB: + return 1; + default: + break; + } + } + } + else { + MENUITEM_STRINGLIST(main_menu,"Snake Menu",NULL, + "Start New Game", + "Snake Speed", + "High Score", + "Playback Control", + "Quit"); + + while (1) { + choice = rb->do_menu(&main_menu, &choice, NULL, false); + switch (choice) { + case 0: + snake_game_init(); + return 0; + case 1: + snake_choose_level(); + break; + case 2: + rb->splashf(HZ*2, "High Score: %d", highscore); + break; + case 3: + playback_control(NULL); + break; + case 4: + return 1; + case MENU_ATTACHED_USB: + return 1; + default: + break; + } } } } - -void game (void) { +static int snake_game_loop (void) { int button; short x,y; + if (snake_game_menu(0)!=0) { + return 1; + } while (1) { - frame(); - if (dead) - return; + snake_frame(); + if (dead==true) { + if (snake_game_menu(0)!=0) { + return 1; + } + } if (!apple) { do { x=rb->rand() % BOARD_WIDTH; @@ -399,69 +467,29 @@ case SNAKE_RC_QUIT: #endif case SNAKE_QUIT: - dead=1; - return; - case SNAKE_PLAYPAUSE: - game_pause(); - break; - default: - if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { - dead=2; - return; - } - break; - } - } -} - -void game_init(void) { - int selection=0; - short x,y; - bool menu_quit = false; - - for (x=0; xdo_menu(&menu, &selection, NULL, false)) - { - case 0: - menu_quit = true; /* start playing */ + if (snake_game_menu(1)!=0) { + return 1; + } break; - - case 1: - rb->set_int("Starting Level", "", UNIT_INT, &level, NULL, - 1, 1, 9, NULL ); - break; - default: - dead=1; /* quit program */ - menu_quit = true; + if (rb->default_event_handler (button) == SYS_USB_CONNECTED) + return PLUGIN_USB_CONNECTED; break; - } } } enum plugin_status plugin_start(const void* parameter) { - (void)(parameter); + (void)parameter; + +#ifndef HAVE_LCD_BITMAP + return PLUGIN_OK; +#endif - game_init(); + configfile_load(config_file,config,2,0); rb->lcd_clear_display(); - game(); - return (dead==1)?PLUGIN_OK:PLUGIN_USB_CONNECTED; + snake_game_loop(); + configfile_save(config_file,config,2,0); + return PLUGIN_OK; } - -#endif Binärdateien patch_rockbox/tools/bmp2rb and changed_rockbox/tools/bmp2rb sind verschieden. Binärdateien patch_rockbox/tools/codepages and changed_rockbox/tools/codepages sind verschieden. Binärdateien patch_rockbox/tools/convbdf and changed_rockbox/tools/convbdf sind verschieden. Binärdateien patch_rockbox/tools/mkboot and changed_rockbox/tools/mkboot sind verschieden. Binärdateien patch_rockbox/tools/mktccboot and changed_rockbox/tools/mktccboot sind verschieden. Binärdateien patch_rockbox/tools/rdf2binary and changed_rockbox/tools/rdf2binary sind verschieden. Binärdateien patch_rockbox/tools/scramble and changed_rockbox/tools/scramble sind verschieden. Binärdateien patch_rockbox/tools/uclpack and changed_rockbox/tools/uclpack sind verschieden.