diff --git a/apps/plugin.c b/apps/plugin.c index 8b47af7e02..d9433d7bff 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -119,6 +119,8 @@ static const struct plugin_api rockbox_api = { lcd_get_background, lcd_bitmap_part, lcd_bitmap, + lcd_bitmap_transparent_part, + lcd_bitmap_transparent, #endif lcd_putsxy, lcd_puts_style, diff --git a/apps/plugin.h b/apps/plugin.h index 10ae180df7..61a3219893 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -161,6 +161,10 @@ struct plugin_api { int stride, int x, int y, int width, int height); void (*lcd_bitmap)(const fb_data *src, int x, int y, int width, int height); + void (*lcd_bitmap_transparent_part)(const fb_data *src, int src_x, int src_y, + int stride, int x, int y, int width, int height); + void (*lcd_bitmap_transparent)(const fb_data *src, int x, int y, + int width, int height); #endif void (*lcd_putsxy)(int x, int y, const unsigned char *string); void (*lcd_puts_style)(int x, int y, const unsigned char *str, int style); diff --git a/apps/plugins/bitmaps/native/SOURCES b/apps/plugins/bitmaps/native/SOURCES index 5b96f30323..15b1c46237 100644 --- a/apps/plugins/bitmaps/native/SOURCES +++ b/apps/plugins/bitmaps/native/SOURCES @@ -37,6 +37,7 @@ brickmania_sel_resume.220x176x16.bmp brickmania_sel_quit.220x176x16.bmp brickmania_sel_start.220x176x16.bmp brickmania_start.220x176x16.bmp +brickmania_break.220x176x16.bmp #endif #endif /* HAVE_LCD_BITMAP */ diff --git a/apps/plugins/bitmaps/native/brickmania_break.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_break.220x176x16.bmp new file mode 100644 index 0000000000..531bc585b2 Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_break.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmp index 1cf951b16f..e89f293bf0 100644 Binary files a/apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmp and b/apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmp differ diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c index 34f4b078f6..2b75ce8f95 100644 --- a/apps/plugins/brickmania.c +++ b/apps/plugins/brickmania.c @@ -72,6 +72,7 @@ extern const fb_data brickmania_sel_quit[]; extern const fb_data brickmania_sel_resume[]; extern const fb_data brickmania_sel_start[]; extern const fb_data brickmania_start[]; +extern const fb_data brickmania_break[]; /* normal, glue, fire */ extern const fb_data brickmania_pads[]; @@ -93,8 +94,9 @@ extern const fb_data brickmania_bricks[]; #define PAD_HEIGHT 5 #define PAD_POS_Y LCD_HEIGHT - 7 #define BRICK_HEIGHT 8 -#define BRICK_WIDTH 20 +#define BRICK_WIDTH 21 #define BALL 5 +#define LEFTMARGIN 5 #define BMPHEIGHT_help 19 #define BMPWIDTH_help 37 @@ -458,6 +460,7 @@ typedef struct cube { char used; int color; int hits; + int hiteffect; } cube; cube brick[80]; @@ -505,6 +508,7 @@ void int_game(int new_game) 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].hiteffect=0; brick[i*10+j].powertop=30+i*10+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? @@ -813,12 +817,12 @@ int game_loop(void){ brick[i*10+j].powertop+=2; rb->lcd_bitmap_part(brickmania_powerups,0, BMPHEIGHT_powerup*brick[i*10+j].power, - BMPWIDTH_powerup,10+j*BRICK_WIDTH+5, + BMPWIDTH_powerup,LEFTMARGIN+j*BRICK_WIDTH+5, brick[i*10+j].powertop, 10, 6); } } - if ((pad_pos_x<10+j*BRICK_WIDTH+5 && pad_pos_x+PAD_WIDTH>10+j*BRICK_WIDTH+5) && brick[i*10+j].powertop+6>=PAD_POS_Y && brick[i*10+j].poweruse==2) { + if ((pad_pos_xLEFTMARGIN+j*BRICK_WIDTH+5) && brick[i*10+j].powertop+6>=PAD_POS_Y && brick[i*10+j].poweruse==2) { switch(brick[i*10+j].power) { case 0: life++; @@ -859,7 +863,7 @@ int game_loop(void){ if (brick[i*10+j].powertop>PAD_POS_Y) brick[i*10+j].poweruse=1; - brickx=10+j*BRICK_WIDTH; + brickx=LEFTMARGIN+j*BRICK_WIDTH; bricky=30+i*8; if (pad_type==2) { for (k=0;k<=30;k++) { @@ -869,6 +873,7 @@ int game_loop(void){ fire[k].top=-16; if (brick[i*10+j].hits > 0){ brick[i*10+j].hits--; + brick[i*10+j].hiteffect++; score+=3; } else { @@ -881,8 +886,10 @@ int game_loop(void){ } } - if (brick[i*10+j].used==1) - rb->lcd_bitmap_part(brickmania_bricks,0,BRICK_HEIGHT*brick[i*10+j].color,BRICK_WIDTH,10+j*BRICK_WIDTH, 30+i*8, BRICK_WIDTH, BRICK_HEIGHT); + if (brick[i*10+j].used==1){ + rb->lcd_bitmap_part(brickmania_bricks,0,BRICK_HEIGHT*brick[i*10+j].color,BRICK_WIDTH,LEFTMARGIN+j*BRICK_WIDTH, 30+i*8, BRICK_WIDTH, BRICK_HEIGHT); + rb->lcd_bitmap_transparent_part(brickmania_break,0,BRICK_HEIGHT*brick[i*10+j].hiteffect,BRICK_WIDTH,LEFTMARGIN+j*BRICK_WIDTH, 30+i*8, BRICK_WIDTH, BRICK_HEIGHT); + } if (ball_pos_y <100) { if (brick[i*10+j].used==1) { if ((ball_pos_x+ballx+3 >= brickx && ball_pos_x+ballx+3 <= brickx+BRICK_WIDTH) && ((bricky-4ball_pos_y+BALL) || (bricky+4>ball_pos_y+BALL+BALL && bricky0)){ @@ -900,6 +907,7 @@ int game_loop(void){ if ((ball_pos_x+3 >= brickx && ball_pos_x+3 <= brickx+BRICK_WIDTH) && ((bricky+BRICK_HEIGHT==ball_pos_y) || (bricky+BRICK_HEIGHT-6<=ball_pos_y && bricky+BRICK_HEIGHT>ball_pos_y)) && (bally <0)) { /* bottom line */ if (brick[i*10+j].hits > 0){ brick[i*10+j].hits--; + brick[i*10+j].hiteffect++; score+=2; } else { @@ -912,6 +920,7 @@ int game_loop(void){ } else if ((ball_pos_x+3 >= brickx && ball_pos_x+3 <= brickx+BRICK_WIDTH) && ((bricky==ball_pos_y+BALL) || (bricky+6>=ball_pos_y+BALL && bricky0)) { /* top line */ if (brick[i*10+j].hits > 0){ brick[i*10+j].hits--; + brick[i*10+j].hiteffect++; score+=2; } else { @@ -926,6 +935,7 @@ int game_loop(void){ if ((ball_pos_y+3 >= bricky && ball_pos_y+3 <= bricky+BRICK_HEIGHT) && ((brickx==ball_pos_x+BALL) || (brickx+6>=ball_pos_x+BALL && brickx 0)) { /* left line */ if (brick[i*10+j].hits > 0){ brick[i*10+j].hits--; + brick[i*10+j].hiteffect++; score+=2; } else { @@ -938,6 +948,7 @@ int game_loop(void){ } else if ((ball_pos_y+3 >= bricky && ball_pos_y+3 <= bricky+BRICK_HEIGHT) && ((brickx+BRICK_WIDTH==ball_pos_x) || (brickx+BRICK_WIDTH-6<=ball_pos_x && brickx+BRICK_WIDTH>ball_pos_x)) && (ballx < 0)) { /* Right line */ if (brick[i*10+j].hits > 0){ brick[i*10+j].hits--; + brick[i*10+j].hiteffect++; score+=2; } else {