diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index 98ffcc2be8..0b9f68bc0b 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES @@ -27,6 +27,10 @@ plasma.c #endif bejeweled.c bounce.c +/* H300 and iPod Color/Video only */ +#if (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176) && (LCD_DEPTH == 16) +brickmania.c +#endif calculator.c chip8.c demystify.c diff --git a/apps/plugins/bitmaps/native/SOURCES b/apps/plugins/bitmaps/native/SOURCES index 140df739a9..ecd8334f3e 100644 --- a/apps/plugins/bitmaps/native/SOURCES +++ b/apps/plugins/bitmaps/native/SOURCES @@ -15,4 +15,24 @@ sudoku_normal.220x176x16.bmp sudoku_inverse.220x176x16.bmp #endif +/* Brickmania */ + +#if (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176) && (LCD_DEPTH == 16) +brickmania_ball.220x176x16.bmp +brickmania_bricks.220x176x16.bmp +brickmania_gameover.220x176x16.bmp +brickmania_help.220x176x16.bmp +brickmania_menu_bg.220x176x16.bmp +brickmania_no_resume.220x176x16.bmp +brickmania_pads.220x176x16.bmp +brickmania_powerups.220x176x16.bmp +brickmania_quit.220x176x16.bmp +brickmania_resume.220x176x16.bmp +brickmania_sel_help.220x176x16.bmp +brickmania_sel_resume.220x176x16.bmp +brickmania_sel_quit.220x176x16.bmp +brickmania_sel_start.220x176x16.bmp +brickmania_start.220x176x16.bmp +#endif + #endif /* HAVE_LCD_BITMAP */ diff --git a/apps/plugins/bitmaps/native/brickmania_ball.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_ball.220x176x16.bmp new file mode 100644 index 0000000000..97da97f4a7 Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_ball.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmp new file mode 100644 index 0000000000..1cf951b16f Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_bricks.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_gameover.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_gameover.220x176x16.bmp new file mode 100644 index 0000000000..d004433b5f Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_gameover.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_help.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_help.220x176x16.bmp new file mode 100644 index 0000000000..4798886090 Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_help.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_menu_bg.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_menu_bg.220x176x16.bmp new file mode 100644 index 0000000000..f5765b84ca Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_menu_bg.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_no_resume.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_no_resume.220x176x16.bmp new file mode 100644 index 0000000000..81b3cf83b8 Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_no_resume.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_pads.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_pads.220x176x16.bmp new file mode 100644 index 0000000000..5bd1e5dc57 Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_pads.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_powerups.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_powerups.220x176x16.bmp new file mode 100644 index 0000000000..aadd37095c Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_powerups.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_quit.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_quit.220x176x16.bmp new file mode 100644 index 0000000000..262650544f Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_quit.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_resume.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_resume.220x176x16.bmp new file mode 100644 index 0000000000..fd8753f57d Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_resume.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_sel_help.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_sel_help.220x176x16.bmp new file mode 100644 index 0000000000..c738b1f68c Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_sel_help.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_sel_quit.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_sel_quit.220x176x16.bmp new file mode 100644 index 0000000000..58ee4a3f77 Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_sel_quit.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_sel_resume.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_sel_resume.220x176x16.bmp new file mode 100644 index 0000000000..9b2c144714 Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_sel_resume.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_sel_start.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_sel_start.220x176x16.bmp new file mode 100644 index 0000000000..d9265863b0 Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_sel_start.220x176x16.bmp differ diff --git a/apps/plugins/bitmaps/native/brickmania_start.220x176x16.bmp b/apps/plugins/bitmaps/native/brickmania_start.220x176x16.bmp new file mode 100644 index 0000000000..8d5bfb2ec9 Binary files /dev/null and b/apps/plugins/bitmaps/native/brickmania_start.220x176x16.bmp differ diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c new file mode 100644 index 0000000000..eec290f507 --- /dev/null +++ b/apps/plugins/brickmania.c @@ -0,0 +1,1113 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2005 Ben Basha (Paprica) + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "plugin.h" +#include "configfile.h" /* Part of libplugin */ + +PLUGIN_HEADER + +#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 + +#elif (CONFIG_KEYPAD == IPOD_4G_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 + +#else +#error Unsupported keypad +#endif + +static struct plugin_api* rb; + +/* External bitmaps */ +extern const fb_data brickmania_ball[]; +extern const fb_data brickmania_gameover[]; +extern const fb_data brickmania_help[]; +extern const fb_data brickmania_menu_bg[]; +extern const fb_data brickmania_no_resume[]; +extern const fb_data brickmania_quit[]; +extern const fb_data brickmania_resume[]; +extern const fb_data brickmania_sel_help[]; +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[]; + +/* normal, glue, fire */ +extern const fb_data brickmania_pads[]; + +/* +life, -life, glue, fire, normal */ +extern const fb_data brickmania_powerups[]; + +/* purple, red, blue, pink, green, yellow orange */ +extern const fb_data brickmania_bricks[]; + +/* TO DO: This needs adjusting correctly for larger than 220x176 LCDS */ +#if (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176) +#define PAD_WIDTH 40 +#define PAD_HEIGHT 5 +#define PAD_POS_Y LCD_HEIGHT - 7 +#define BRICK_HEIGHT 8 +#define BRICK_WIDTH 20 +#define BALL 5 + +#define BMPHEIGHT_help 19 +#define BMPWIDTH_help 37 + +#define BMPHEIGHT_sel_help 19 +#define BMPWIDTH_sel_help 37 + +#define BMPHEIGHT_resume 17 +#define BMPWIDTH_resume 96 + +#define BMPHEIGHT_no_resume 17 +#define BMPWIDTH_no_resume 96 + +#define BMPHEIGHT_quit 19 +#define BMPWIDTH_quit 33 + +#define BMPHEIGHT_sel_quit 19 +#define BMPWIDTH_sel_quit 33 + +#define BMPHEIGHT_sel_resume 17 +#define BMPWIDTH_sel_resume 96 + +#define BMPHEIGHT_sel_start 20 +#define BMPWIDTH_sel_start 112 + +#define BMPHEIGHT_start 20 +#define BMPWIDTH_start 112 + +#define BMPHEIGHT_powerup 6 +#define BMPWIDTH_powerup 10 + +#else +#error Unsupported LCD Size +#endif + +int levels_num = 29; + +static unsigned char levels[29][8][10] = { + { /* level1 */ + {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1}, + {0x2,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2}, + {0x0,0x2,0x1,0x0,0x0,0x0,0x0,0x1,0x2,0x0}, + {0x0,0x0,0x2,0x1,0x0,0x0,0x1,0x2,0x0,0x0}, + {0x0,0x0,0x0,0x2,0x1,0x1,0x2,0x0,0x0,0x0}, + {0x7,0x0,0x0,0x7,0x2,0x2,0x7,0x0,0x0,0x7}, + {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, + {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0} + }, + { /* level2 */ + {0x0,0x0,0x7,0x7,0x1,0x1,0x7,0x7,0x0,0x0}, + {0x0,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x1,0x0}, + {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1}, + {0x1,0x1,0x1,0x1,0x0,0x0,0x1,0x1,0x1,0x1}, + {0x1,0x1,0x2,0x1,0x0,0x0,0x1,0x2,0x1,0x1}, + {0x1,0x2,0x0,0x2,0x2,0x2,0x2,0x0,0x2,0x1}, + {0x0,0x1,0x2,0x0,0x0,0x0,0x0,0x2,0x1,0x0}, + {0x0,0x0,0x1,0x2,0x2,0x2,0x2,0x1,0x0,0x0} + }, + { /* level3 */ + {0x3,0x3,0x3,0x3,0x0,0x0,0x2,0x2,0x2,0x2}, + {0x3,0x3,0x3,0x3,0x0,0x0,0x2,0x2,0x2,0x2}, + {0x3,0x3,0x3,0x3,0x0,0x0,0x2,0x2,0x2,0x2}, + {0x0,0x0,0x0,0x0,0x7,0x7,0x0,0x0,0x0,0x0}, + {0x0,0x0,0x0,0x0,0x7,0x7,0x0,0x0,0x0,0x0}, + {0x5,0x5,0x5,0x5,0x0,0x0,0x6,0x6,0x6,0x6}, + {0x5,0x5,0x5,0x5,0x0,0x0,0x6,0x6,0x6,0x6}, + {0x5,0x5,0x5,0x5,0x0,0x0,0x6,0x6,0x6,0x6} + }, + { /* level4 */ + {0x0,0x0,0x0,0x7,0x7,0x7,0x7,0x0,0x0,0x0}, + {0x0,0x0,0x0,0x7,0x7,0x7,0x7,0x0,0x0,0x0}, + {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2}, + {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2}, + {0x6,0x6,0x0,0x2,0x2,0x2,0x2,0x0,0x6,0x6}, + {0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x0}, + {0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x0}, + {0x1,0x1,0x1,0x1,0x0,0x0,0x1,0x1,0x1,0x1} + }, + { /* level5 */ + {0x1,0x0,0x2,0x2,0x0,0x3,0x3,0x0,0x4,0x4}, + {0x0,0x2,0x2,0x0,0x3,0x3,0x0,0x4,0x4,0x0}, + {0x2,0x2,0x0,0x3,0x3,0x0,0x4,0x4,0x0,0x5}, + {0x2,0x0,0x3,0x3,0x0,0x4,0x4,0x0,0x5,0x5}, + {0x0,0x3,0x3,0x0,0x4,0x4,0x0,0x5,0x5,0x0}, + {0x3,0x3,0x0,0x4,0x4,0x0,0x5,0x5,0x0,0x6}, + {0x3,0x0,0x4,0x4,0x0,0x5,0x5,0x0,0x6,0x6}, + {0x0,0x4,0x4,0x0,0x5,0x5,0x0,0x6,0x6,0x0} + }, + { /* level6 */ + {0x0,0x1,0x3,0x7,0x7,0x7,0x7,0x3,0x1,0x0}, + {0x3,0x1,0x3,0x7,0x0,0x0,0x7,0x3,0x1,0x3}, + {0x3,0x1,0x3,0x7,0x7,0x7,0x7,0x3,0x1,0x3}, + {0x0,0x0,0x0,0x2,0x2,0x2,0x2,0x0,0x0,0x0}, + {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5}, + {0x5,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x5}, + {0x0,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x0}, + {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0} + }, + { /* level7 */ + {0x0,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x0}, + {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, + {0x6,0x0,0x0,0x2,0x2,0x2,0x2,0x0,0x0,0x6}, + {0x6,0x0,0x0,0x2,0x2,0x2,0x2,0x0,0x0,0x6}, + {0x6,0x6,0x6,0x0,0x0,0x0,0x0,0x6,0x6,0x6}, + {0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x0,0x0,0x0}, + {0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x0}, + {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0} + }, + { /* level8 */ + {0x0,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x0}, + {0x0,0x0,0x0,0x4,0x0,0x0,0x4,0x0,0x0,0x0}, + {0x6,0x6,0x0,0x2,0x2,0x2,0x2,0x0,0x6,0x6}, + {0x0,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x0,0x0}, + {0x0,0x6,0x6,0x0,0x0,0x0,0x0,0x6,0x6,0x0}, + {0x0,0x0,0x0,0x5,0x5,0x5,0x5,0x0,0x0,0x0}, + {0x0,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x0}, + {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5} + }, + { /* level9 */ + {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2}, + {0x2,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x2}, + {0x2,0x0,0x3,0x0,0x1,0x1,0x0,0x3,0x0,0x2}, + {0x2,0x0,0x0,0x1,0x0,0x0,0x1,0x0,0x0,0x2}, + {0x2,0x0,0x1,0x0,0x3,0x3,0x0,0x1,0x0,0x2}, + {0x2,0x0,0x0,0x1,0x0,0x0,0x1,0x0,0x0,0x2}, + {0x2,0x2,0x0,0x0,0x1,0x1,0x0,0x0,0x2,0x2}, + {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2} + }, + { /* level10 */ + {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, + {0x0,0x5,0x0,0x5,0x0,0x5,0x0,0x5,0x0,0x5}, + {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, + {0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0}, + {0x0,0x0,0x0,0x4,0x1,0x1,0x4,0x0,0x0,0x0}, + {0x0,0x0,0x3,0x4,0x1,0x1,0x4,0x3,0x0,0x0}, + {0x0,0x2,0x3,0x4,0x1,0x1,0x4,0x3,0x2,0x0}, + {0x1,0x2,0x3,0x4,0x1,0x1,0x4,0x3,0x2,0x1} + }, + { /* level11 */ + {0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3}, + {0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x2}, + {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2}, + {0x2,0x0,0x0,0x0,0x7,0x7,0x0,0x0,0x0,0x2}, + {0x2,0x0,0x0,0x7,0x7,0x7,0x7,0x0,0x0,0x2}, + {0x0,0x0,0x0,0x1,0x0,0x0,0x1,0x0,0x0,0x0}, + {0x0,0x2,0x0,0x1,0x0,0x0,0x1,0x0,0x2,0x0}, + {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5} + }, + { /* level 12 */ + {0x2,0x1,0x3,0x1,0x0,0x0,0x1,0x3,0x1,0x2}, + {0x1,0x1,0x1,0x1,0x0,0x0,0x1,0x1,0x1,0x1}, + {0x1,0x1,0x1,0x0,0x1,0x1,0x0,0x1,0x1,0x1}, + {0x0,0x1,0x0,0x1,0x6,0x6,0x1,0x0,0x1,0x0}, + {0x0,0x0,0x1,0x1,0x6,0x6,0x1,0x1,0x0,0x0}, + {0x1,0x1,0x1,0x7,0x0,0x0,0x7,0x1,0x1,0x1}, + {0x1,0x1,0x7,0x1,0x0,0x0,0x1,0x7,0x1,0x1}, + {0x2,0x2,0x0,0x2,0x2,0x2,0x2,0x0,0x2,0x2} + }, + {/* levell13 */ + {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2}, + {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2}, + {0x2,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x0,0x2}, + {0x2,0x0,0x2,0x3,0x3,0x3,0x3,0x3,0x0,0x2}, + {0x2,0x0,0x2,0x4,0x4,0x4,0x4,0x4,0x0,0x2}, + {0x2,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2}, + {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, + {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2} + }, + {/* level14 */ + {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1}, + {0x4,0x4,0x4,0x4,0x2,0x2,0x4,0x4,0x4,0x4}, + {0x4,0x0,0x0,0x0,0x2,0x2,0x0,0x0,0x0,0x4}, + {0x4,0x0,0x0,0x2,0x3,0x3,0x2,0x0,0x0,0x4}, + {0x4,0x0,0x2,0x3,0x3,0x3,0x3,0x2,0x0,0x4}, + {0x4,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x0,0x4}, + {0x4,0x0,0x6,0x1,0x5,0x5,0x1,0x6,0x0,0x4}, + {0x4,0x6,0x1,0x1,0x5,0x5,0x1,0x1,0x6,0x4} + }, + {/* level 15 */ + {0x4,0x4,0x4,0x4,0x4,0x3,0x3,0x3,0x3,0x3}, + {0x2,0x2,0x1,0x1,0x1,0x1,0x1,0x5,0x0,0x0}, + {0x2,0x2,0x1,0x1,0x1,0x0,0x1,0x6,0x0,0x0}, + {0x2,0x1,0x1,0x2,0x1,0x1,0x1,0x5,0x0,0x0}, + {0x2,0x1,0x2,0x2,0x2,0x1,0x1,0x6,0x0,0x0}, + {0x2,0x1,0x2,0x2,0x2,0x1,0x3,0x5,0x3,0x0}, + {0x2,0x1,0x1,0x2,0x1,0x1,0x1,0x6,0x0,0x0}, + {0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2} + }, + {/* level 16 (Rockbox) by ts-x */ + {0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x5,0x0,0x5}, + {0x2,0x0,0x3,0x0,0x3,0x4,0x0,0x5,0x5,0x0}, + {0x2,0x0,0x3,0x3,0x3,0x4,0x4,0x5,0x0,0x5}, + {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, + {0x6,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, + {0x7,0x7,0x7,0x1,0x1,0x1,0x2,0x0,0x2,0x0}, + {0x7,0x0,0x7,0x1,0x0,0x1,0x0,0x2,0x0,0x0}, + {0x7,0x7,0x7,0x1,0x1,0x1,0x2,0x0,0x2,0x0} + }, + {/* level 17 (Alien) by ts-x */ + {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1}, + {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2}, + {0x1,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x1}, + {0x2,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x2}, + {0x1,0x0,0x1,0x2,0x2,0x2,0x2,0x1,0x0,0x1}, + {0x2,0x0,0x0,0x1,0x2,0x2,0x1,0x0,0x0,0x2}, + {0x2,0x1,0x0,0x0,0x1,0x1,0x0,0x0,0x1,0x2}, + {0x2,0x2,0x1,0x0,0x1,0x1,0x0,0x1,0x2,0x2} + }, + {/* level 18 (Tetris) by ts-x */ + {0x0,0x2,0x0,0x0,0x3,0x4,0x0,0x2,0x2,0x0}, + {0x0,0x2,0x7,0x0,0x3,0x4,0x0,0x2,0x2,0x0}, + {0x2,0x2,0x7,0x0,0x3,0x4,0x0,0x6,0x2,0x2}, + {0x2,0x2,0x7,0x7,0x3,0x4,0x0,0x6,0x2,0x2}, + {0x2,0x1,0x7,0x7,0x3,0x4,0x4,0x6,0x5,0x5}, + {0x2,0x1,0x0,0x7,0x3,0x4,0x4,0x6,0x5,0x5}, + {0x1,0x1,0x1,0x7,0x3,0x0,0x6,0x6,0x5,0x5}, + {0x1,0x1,0x1,0x0,0x3,0x0,0x6,0x6,0x5,0x5} + }, + { /* level 19 (Stalactites) by ts-x */ + {0x5,0x2,0x6,0x3,0x4,0x7,0x5,0x3,0x1,0x2}, + {0x5,0x2,0x6,0x3,0x4,0x7,0x5,0x3,0x1,0x2}, + {0x5,0x0,0x6,0x3,0x4,0x7,0x5,0x0,0x1,0x2}, + {0x5,0x2,0x6,0x3,0x4,0x0,0x5,0x3,0x1,0x2}, + {0x5,0x0,0x6,0x0,0x4,0x7,0x5,0x0,0x1,0x0}, + {0x5,0x0,0x0,0x3,0x4,0x0,0x0,0x0,0x1,0x2}, + {0x0,0x0,0x6,0x0,0x0,0x0,0x5,0x0,0x0,0x0}, + {0x5,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0} + }, + { /* level 20 (Maze) by ts-x */ + {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1}, + {0x1,0x0,0x0,0x3,0x0,0x0,0x3,0x1,0x1,0x1}, + {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x1}, + {0x1,0x0,0x1,0x3,0x0,0x3,0x0,0x3,0x0,0x2}, + {0x1,0x0,0x1,0x1,0x0,0x1,0x0,0x0,0x0,0x0}, + {0x1,0x0,0x1,0x0,0x0,0x1,0x0,0x0,0x3,0x0}, + {0x1,0x0,0x1,0x0,0x1,0x1,0x1,0x1,0x1,0x2}, + {0x2,0x0,0x2,0x1,0x1,0x1,0x1,0x1,0x1,0x1} + }, + { /* level 21 (Dentist) by ts-x */ + {0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x0}, + {0x2,0x2,0x0,0x6,0x0,0x6,0x0,0x6,0x2,0x2}, + {0x2,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x2}, + {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x6,0x0,0x2}, + {0x2,0x0,0x6,0x0,0x6,0x0,0x0,0x0,0x0,0x2}, + {0x2,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x2}, + {0x2,0x2,0x6,0x0,0x6,0x0,0x6,0x0,0x2,0x2}, + {0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x0} + }, + { /* level 22 (Spider) by ts-x */ + {0x1,0x3,0x1,0x1,0x0,0x0,0x1,0x1,0x3,0x1}, + {0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x0}, + {0x3,0x1,0x1,0x6,0x1,0x1,0x6,0x1,0x1,0x3}, + {0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x0}, + {0x0,0x0,0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0}, + {0x1,0x3,0x1,0x1,0x2,0x2,0x1,0x1,0x3,0x1}, + {0x0,0x0,0x0,0x1,0x1,0x1,0x1,0x0,0x0,0x0}, + {0x3,0x1,0x3,0x1,0x0,0x0,0x1,0x3,0x1,0x3} + }, + { /* level 23 (Pool) by ts-x */ + {0x0,0x7,0x7,0x7,0x0,0x7,0x7,0x7,0x7,0x0}, + {0x0,0x0,0x5,0x0,0x2,0x0,0x0,0x0,0x2,0x0}, + {0x7,0x3,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x7}, + {0x7,0x0,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0x7}, + {0x7,0x0,0x4,0x0,0x0,0x3,0x0,0x0,0x0,0x7}, + {0x7,0x0,0x0,0x6,0x0,0x0,0x0,0x0,0x4,0x7}, + {0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, + {0x0,0x7,0x7,0x7,0x7,0x0,0x7,0x7,0x7,0x0} + }, + { /* level 24 (Vorbis Fish) by ts-x */ + {0x0,0x0,0x4,0x4,0x5,0x5,0x5,0x0,0x0,0x5}, + {0x0,0x4,0x6,0x4,0x4,0x5,0x5,0x5,0x0,0x5}, + {0x5,0x6,0x0,0x6,0x4,0x4,0x4,0x5,0x5,0x5}, + {0x5,0x6,0x0,0x6,0x4,0x4,0x4,0x4,0x5,0x5}, + {0x0,0x5,0x6,0x4,0x4,0x5,0x5,0x4,0x5,0x0}, + {0x5,0x5,0x4,0x4,0x5,0x5,0x5,0x4,0x5,0x5}, + {0x5,0x4,0x4,0x4,0x5,0x5,0x4,0x4,0x5,0x5}, + {0x0,0x0,0x4,0x4,0x4,0x4,0x4,0x5,0x0,0x5} + }, + {/* level 25 (Rainbow) by ts-x */ + {0x0,0x4,0x1,0x0,0x0,0x0,0x0,0x1,0x4,0x0}, + {0x4,0x1,0x3,0x1,0x0,0x0,0x1,0x3,0x1,0x4}, + {0x1,0x3,0x5,0x3,0x1,0x1,0x3,0x5,0x3,0x1}, + {0x3,0x5,0x6,0x5,0x3,0x3,0x5,0x6,0x5,0x3}, + {0x5,0x6,0x7,0x6,0x5,0x5,0x6,0x7,0x6,0x5}, + {0x6,0x7,0x2,0x7,0x6,0x6,0x7,0x2,0x7,0x6}, + {0x7,0x2,0x0,0x2,0x7,0x7,0x2,0x0,0x2,0x7}, + {0x2,0x0,0x0,0x0,0x2,0x2,0x0,0x0,0x0,0x2} + }, + { /* level 26 (Bowtie) by ts-x */ + {0x5,0x1,0x5,0x1,0x0,0x0,0x1,0x5,0x1,0x5}, + {0x1,0x0,0x0,0x1,0x5,0x5,0x1,0x0,0x0,0x1}, + {0x5,0x0,0x6,0x0,0x1,0x1,0x0,0x6,0x0,0x5}, + {0x1,0x0,0x6,0x6,0x0,0x0,0x6,0x6,0x0,0x1}, + {0x1,0x0,0x6,0x6,0x0,0x0,0x6,0x6,0x0,0x1}, + {0x5,0x0,0x6,0x0,0x1,0x1,0x0,0x6,0x0,0x5}, + {0x1,0x0,0x0,0x1,0x5,0x5,0x1,0x0,0x0,0x1}, + {0x5,0x1,0x5,0x1,0x0,0x0,0x1,0x5,0x1,0x5} + }, + { /* level 27 (Frog) by ts-x */ + {0x0,0x5,0x5,0x0,0x0,0x0,0x0,0x5,0x5,0x0}, + {0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5}, + {0x5,0x0,0x0,0x5,0x6,0x6,0x5,0x0,0x0,0x5}, + {0x5,0x0,0x3,0x0,0x6,0x6,0x0,0x3,0x0,0x5}, + {0x5,0x0,0x1,0x0,0x6,0x6,0x0,0x1,0x0,0x5}, + {0x5,0x0,0x0,0x5,0x6,0x6,0x5,0x0,0x0,0x5}, + {0x5,0x5,0x5,0x5,0x0,0x0,0x5,0x5,0x5,0x5}, + {0x0,0x5,0x5,0x0,0x4,0x4,0x0,0x5,0x5,0x0} + }, + { /* level 28 (DigDug) by ts-x */ + {0x5,0x5,0x5,0x5,0x0,0x5,0x5,0x5,0x5,0x5}, + {0x6,0x0,0x0,0x6,0x0,0x6,0x6,0x0,0x0,0x6}, + {0x7,0x0,0x7,0x7,0x0,0x7,0x7,0x7,0x0,0x7}, + {0x7,0x0,0x7,0x0,0x0,0x0,0x7,0x7,0x7,0x7}, + {0x4,0x4,0x4,0x4,0x0,0x4,0x4,0x0,0x0,0x4}, + {0x4,0x4,0x0,0x0,0x0,0x4,0x4,0x0,0x4,0x4}, + {0x4,0x4,0x4,0x4,0x4,0x4,0x0,0x0,0x4,0x4}, + {0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1} + }, + { /* TheEnd */ + {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, + {0x2,0x2,0x6,0x0,0x0,0x6,0x4,0x4,0x0,0x0}, + {0x2,0x0,0x6,0x6,0x0,0x6,0x4,0x0,0x4,0x0}, + {0x2,0x2,0x6,0x6,0x0,0x6,0x4,0x0,0x4,0x0}, + {0x2,0x2,0x6,0x0,0x6,0x6,0x4,0x0,0x4,0x0}, + {0x2,0x0,0x6,0x0,0x6,0x6,0x4,0x0,0x4,0x0}, + {0x2,0x2,0x6,0x0,0x0,0x6,0x4,0x4,0x0,0x0}, + {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0} + } +}; + +int pad_pos_x,x,y; +int ball_pos_x; +int ball_pos_y; +int bally,balltempy; +int ballx,balltempx; +int life; +int start_game,con_game; +int pad_type; +int on_the_pad=0; /* for glue pad */ +int score=0,vscore=0; + +int cur_level=0; +int brick_on_board=0; + +typedef struct cube { + int powertop; + int power; + char poweruse; + char used; + int color; +} cube; +cube brick[80]; + + + +typedef struct sfire { + int top; + int left; +} sfire; +sfire fire[30]; + + +int highscore; +#define MAX_POINTS 200000 /* i dont think it needs to be more */ +static struct configdata config[] = +{ + {TYPE_INT, 0, MAX_POINTS, &highscore, "highscore", NULL, NULL} +}; + + +void int_game(int new_game) +{ + int i,j; + ballx=0; + bally=0; + pad_pos_x=LCD_WIDTH/2-PAD_WIDTH/2; + ball_pos_y=PAD_POS_Y-BALL; + ball_pos_x=pad_pos_x+(PAD_WIDTH/2)-2; + start_game =1; + con_game =0; + pad_type=0; + on_the_pad=0; + balltempy=0; + balltempx=0; + if (new_game==1) + brick_on_board=0; + + 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); + if (i*10+j<=30) fire[i*10+j].top=-8; + if (new_game==1) { + + brick[i*10+j].power=rb->rand()%17; + + 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]-1; + if (levels[cur_level][i][j]!=0) brick_on_board++; + } + } + } + + +} + + +#define HIGH_SCORE "highscore.cfg" + +#define MENU_LENGTH 4 +int sw,i,w; + +int game_menu(int when) +{ + int button,cur=0; + char str[10]; + + rb->lcd_clear_display(); + rb->lcd_bitmap(brickmania_menu_bg,0,0,220,176); + while (true) { + for(i=0;ilcd_bitmap(brickmania_sel_start,55,78, + BMPWIDTH_sel_start,BMPHEIGHT_sel_start); + else + rb->lcd_bitmap(brickmania_start,55,78, + BMPWIDTH_start,BMPHEIGHT_start); + + if (when==1) { + if (cur==1) + rb->lcd_bitmap(brickmania_sel_resume,62,100, + BMPWIDTH_sel_resume,BMPHEIGHT_sel_resume); + else + rb->lcd_bitmap(brickmania_resume,62,100, + BMPWIDTH_resume,BMPHEIGHT_resume); + + } else { + rb->lcd_bitmap(brickmania_no_resume,62,100, + BMPWIDTH_no_resume,BMPHEIGHT_no_resume); + } + + + if (cur==2) + rb->lcd_bitmap(brickmania_sel_help,92,118, + BMPWIDTH_sel_help,BMPHEIGHT_sel_help); + else + rb->lcd_bitmap(brickmania_help,92,118, + BMPWIDTH_help,BMPHEIGHT_help); + + + if (cur==3) + rb->lcd_bitmap(brickmania_sel_quit,93,138, + BMPWIDTH_sel_quit,BMPHEIGHT_sel_quit); + else + rb->lcd_bitmap(brickmania_quit,93,138, + BMPWIDTH_quit,BMPHEIGHT_quit); + } + + /* high score */ + rb->lcd_setfont(FONT_SYSFIXED); + rb->lcd_set_background(LCD_RGBPACK(0,0,140)); + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_putsxy(7, 56, "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(7+sw/2-w/2, 65, str); + rb->lcd_setfont(FONT_UI); + + rb->lcd_update(); + + button = rb->button_get(true); + switch(button){ + case UP: + if (cur==0) + cur = MENU_LENGTH-1; + else + cur--; + if (when==0 && cur==1) { + cur = 0; + }; + break; + + case DOWN: + if (cur==MENU_LENGTH-1) + cur = 0; + else + cur++; + if (when==0 && cur==1) { + cur=2; + }; + break; + + 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; + case QUIT: + return 3; + break; + } + } +} + +int help(int when) +{ + int w,h; + int button; + + while(true){ + rb->lcd_setfont(FONT_SYSFIXED); + rb->lcd_set_background(LCD_BLACK); + rb->lcd_clear_display(); + rb->lcd_set_background(LCD_BLACK); + rb->lcd_set_foreground(LCD_WHITE); + + rb->lcd_getstringsize("BrickMania", &w, &h); + rb->lcd_putsxy(LCD_WIDTH/2-w/2, 1, "BrickMania"); + + rb->lcd_set_foreground(LCD_RGBPACK(245,0,0)); + rb->lcd_putsxy(1, 1*(h+2),"Aim"); + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_putsxy(1, 2*(h+2),"destroy all the bricks by bouncing"); + rb->lcd_putsxy(1, 3*(h+2),"the ball of them using the paddle."); + + rb->lcd_set_foreground(LCD_RGBPACK(245,0,0)); + rb->lcd_putsxy(1, 5*(h+2),"Controls"); + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_putsxy(1, 6*(h+2),"< & > Move the paddle"); + rb->lcd_putsxy(1, 7*(h+2),"NAVI Releases the ball/Fire!"); + rb->lcd_putsxy(1, 8*(h+2),"STOP Opens menu/Quit"); + + rb->lcd_set_foreground(LCD_RGBPACK(245,0,0)); + rb->lcd_putsxy(1, 10*(h+2),"Specials"); + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_putsxy(1, 11*(h+2),"N Normal:returns paddle to normal"); + rb->lcd_putsxy(1, 12*(h+2),"D DIE!:loses a life"); + rb->lcd_putsxy(1, 13*(h+2),"L Life:gains a life/power up"); + rb->lcd_putsxy(1, 14*(h+2),"F Fire:allows you to shoot bricks"); + rb->lcd_putsxy(1, 15*(h+2),"G Glue:ball sticks to paddle"); + rb->lcd_update(); + + button=rb->button_get(true); + switch (button) { + case QUIT: + rb->lcd_setfont(FONT_UI); + switch (game_menu(when)) { + case 0: + cur_level=0; + life=2; + int_game(1); + break; + case 1: + con_game=1; + break; + case 2: + if (help(when)==1) return 1; + break; + case 3: + return 1; + break; + } + return NULL; + break; + } + } + return NULL; +} + +int pad_check(int ballxc,int mode,int pon) +{ + /* pon: positive(1) or negative(0) */ + + if (mode==0) { + if (pon == 0) + return -ballxc; + else + return ballxc; + } else { + if (ballx > 0) + return ballxc; + else + return ballxc*-1; + } +} + +int fire_space(void) +{ + int t; + for(t=0;t<=30;t++) + if (fire[t].top+7 < 0) + return t; + + return NULL; +} + +int dxball_game(void){ + int j,i,k,bricky,brickx; + char s[20]; + + rb->srand( *rb->current_tick ); + + configfile_init(rb); + 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; + break; + case 2: + if (help(0) == 1) return 1; + break; + case 3: + return 1; + break; + } + + while(true) { + if (life >= 0) { + rb->lcd_set_background(LCD_BLACK); + rb->lcd_set_drawmode(DRMODE_SOLID); + rb->lcd_clear_display(); + rb->lcd_set_background(LCD_BLACK); + + /* write life num */ + rb->lcd_set_foreground(LCD_WHITE); + rb->snprintf(s, sizeof(s), "Life: %d", life); + rb->lcd_putsxy(2, 2, s); + + rb->snprintf(s, sizeof(s), "Level %d", cur_level+1); + rb->lcd_getstringsize(s, &sw, NULL); + rb->lcd_putsxy(LCD_WIDTH-sw-2, 2, s); + + + if (vscoresnprintf(s, sizeof(s), "%d", vscore); + rb->lcd_getstringsize(s, &sw, NULL); + rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 2, s); + + /* continue game */ + if (con_game== 1 && start_game!=1) { + rb->lcd_getstringsize("Press NAVI To Continue", &sw, NULL); + rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 150, "Press NAVI to continue"); + } + + /* draw the ball */ + rb->lcd_bitmap(brickmania_ball,ball_pos_x, ball_pos_y, BALL, BALL); + + if (brick_on_board==0) brick_on_board--; + + /* if the pad is fire */ + for(i=0;i<=30;i++) { + if (fire[i].top+7>0) { + if (con_game!=1) + fire[i].top-=4; + rb->lcd_vline(fire[i].left, fire[i].top, fire[i].top+7); + } + } + + /* the bricks */ + for (i=0;i<=7;i++) { + for (j=0;j<=9;j++) { + if (brick[i*10+j].power<5) { + if (brick[i*10+j].poweruse==2) { + if (con_game!=1) + 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, + 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) { + switch(brick[i*10+j].power) { + case 0: + life++; + score+=50; + break; + case 1: + life--; + if (life>=0) { + int_game(0); + rb->sleep(HZ*2); + } + break; + case 2: + score+=34; + pad_type=1; + break; + case 3: + score+=47; + pad_type=2; + on_the_pad=0; + break; + case 4: + score+=23; + pad_type=0; + on_the_pad=0; + break; + } + brick[i*10+j].poweruse=1; + } + + if (brick[i*10+j].powertop>PAD_POS_Y) + brick[i*10+j].poweruse=1; + + brickx=10+j*BRICK_WIDTH; + bricky=30+i*8; + if (pad_type==2) { + for (k=0;k<=30;k++) { + if (fire[k].top+7>0) { + if (brick[i*10+j].used==1 && (fire[k].left+1 >= brickx && fire[k].left+1 <= brickx+BRICK_WIDTH) && (bricky+BRICK_HEIGHT>fire[k].top)){ + score+=13; + fire[k].top=-16; + brick[i*10+j].used=0; + if (brick[i*10+j].power!=10) brick[i*10+j].poweruse=2; + brick_on_board--; + } + } + } + } + + 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 (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)){ + balltempy=bricky-ball_pos_y-BALL; + } else if ((ball_pos_x+ballx+3 >= brickx && ball_pos_x+ballx+3 <= brickx+BRICK_WIDTH) && ((bricky+BRICK_HEIGHT+4>ball_pos_y && bricky+BRICK_HEIGHTball_pos_y-BALL)) && (bally <0)){ + balltempy=-(ball_pos_y-(bricky+BRICK_HEIGHT)); + } + + if ((ball_pos_y+3 >= bricky && ball_pos_y+3 <= bricky+BRICK_HEIGHT) && ((brickx-4ball_pos_x+BALL) || (brickx+4>ball_pos_x+BALL+BALL && brickx0)) { + balltempx=brickx-ball_pos_x-BALL; + } else if ((ball_pos_y+bally+3 >= bricky && ball_pos_y+bally+3 <= bricky+BRICK_HEIGHT) && ((brickx+BRICK_WIDTH+4>ball_pos_x && brickx+BRICK_WIDTHball_pos_x-BALL)) && (ballx <0)) { + balltempx=-(ball_pos_x-(brickx+BRICK_WIDTH)); + } + + 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 */ + brick[i*10+j].used=0; + bally = bally*-1; + if (brick[i*10+j].power!=10) { + brick[i*10+j].poweruse=2; + } + } 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 */ + brick[i*10+j].used=0; + bally = bally*-1; + if (brick[i*10+j].power!=10) + brick[i*10+j].poweruse=2; + } + + 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 */ + brick[i*10+j].used=0; + ballx = ballx*-1; + if (brick[i*10+j].power!=10) + brick[i*10+j].poweruse=2; + } 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 */ + brick[i*10+j].used=0; + ballx = ballx*-1; + if (brick[i*10+j].power!=10) + brick[i*10+j].poweruse=2; + } + + if (brick[i*10+j].used==0){ + brick_on_board--; + score+=8; + } + } + } + } + } + + /* draw the pad */ + rb->lcd_bitmap_part(brickmania_pads,0,pad_type*PAD_HEIGHT,PAD_WIDTH,pad_pos_x, PAD_POS_Y, PAD_WIDTH, PAD_HEIGHT); + + if ((ball_pos_x >= pad_pos_x && ball_pos_x <= pad_pos_x+PAD_WIDTH) && (PAD_POS_Y-4ball_pos_y+BALL) && (bally >0)) + balltempy=PAD_POS_Y-ball_pos_y-BALL; + else if ((4>ball_pos_y && 0ball_pos_x+BALL) && (ballx >0)) + balltempx=LCD_WIDTH-ball_pos_x-BALL; + else if ((4>ball_pos_x && 0= LCD_HEIGHT) { + life--; + if (life>=0){ + int_game(0); + rb->sleep(HZ*2); + } + } + + /* left line ,right line */ + if ((ball_pos_x <= 0) || (ball_pos_x+BALL >= LCD_WIDTH)) + ballx = ballx*-1; + + if ((ball_pos_y+5 >= PAD_POS_Y && (ball_pos_x >= pad_pos_x && ball_pos_x <= pad_pos_x+PAD_WIDTH)) && + start_game != 1 && on_the_pad==0) { + if ((ball_pos_x+3 >= pad_pos_x && ball_pos_x+3 <= pad_pos_x+5) || (ball_pos_x +2>= pad_pos_x+35 && ball_pos_x+2 <= pad_pos_x+40)) { + bally = 2*-1; + if (ball_pos_x != 0 && ball_pos_x+BALL!=LCD_WIDTH) + ballx = pad_check(6,0,ball_pos_x+2<=pad_pos_x+(PAD_WIDTH/2)?0:1); + } else if ((ball_pos_x+3 >= pad_pos_x+5 && ball_pos_x+3 <= pad_pos_x+10) || (ball_pos_x+2 >= pad_pos_x+30 && ball_pos_x+2 <= pad_pos_x+35)) { + bally = 3*-1; + + if (ball_pos_x != 0 && ball_pos_x+BALL!=LCD_WIDTH) + ballx = pad_check(4,0,ball_pos_x+2<=pad_pos_x+(PAD_WIDTH/2)?0:1); + } else if ((ball_pos_x+3 >= pad_pos_x+10 && ball_pos_x+3 <= pad_pos_x+15) || (ball_pos_x+2 >= pad_pos_x+25 && ball_pos_x+2 <= pad_pos_x+30)) { + bally = 4*-1; + + if (ball_pos_x != 0 && ball_pos_x+BALL!=LCD_WIDTH) + ballx = pad_check(3,0,ball_pos_x+2<=pad_pos_x+(PAD_WIDTH/2)?0:1); + } else if ((ball_pos_x+3 >= pad_pos_x+13 && ball_pos_x+3 <= pad_pos_x+18) || (ball_pos_x+2 >= pad_pos_x+22 && ball_pos_x+2 <= pad_pos_x+25)) { + bally = 4*-1; + if (ball_pos_x != 0 && ball_pos_x+BALL!=LCD_WIDTH) + ballx = pad_check(2,1,NULL); + } else { + bally = 4*-1; + } + } + + if (on_the_pad!=1) { + ball_pos_x+=balltempx!=0?balltempx:ballx; + ball_pos_y+=balltempy!=0?balltempy:bally; + + balltempy=0; + balltempx=0; + } + + if (ball_pos_y+5 >= PAD_POS_Y && (pad_type==1 && on_the_pad==0) && + (ball_pos_x >= pad_pos_x && ball_pos_x <= pad_pos_x+PAD_WIDTH)){ + bally=0; + on_the_pad=1; + } + + rb->lcd_update(); + + if (brick_on_board < 0) { + if (cur_level+1sleep(HZ * 2); + cur_level++; + score+=100; + int_game(1); + } else { + rb->lcd_getstringsize("Congratulations!", &sw, NULL); + rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 140, "Congratulations!"); + rb->lcd_getstringsize("You have finished the game!", &sw, NULL); + rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 157, "You have finished the game!"); + vscore=score; + rb->lcd_update(); + if (score>highscore) { + rb->sleep(HZ*2); + highscore=score; + rb->splash(HZ*2,true,"New High Score"); + } else { + rb->sleep(HZ * 4); + } + + switch(game_menu(0)){ + case 0: + life=2; + cur_level=0; + int_game(1); + break; + case 1: + con_game=1; + break; + case 2: + if (help(0)==1) return 1; + break; + case 3: + return 1; + break; + }; + } + } + + int move_button,button; + int time = 3; /* number of ticks this function will loop reading keys */ + int start = *rb->current_tick; + int end = start + time; + button=rb->button_get_w_tmo(end - *rb->current_tick); + move_button=rb->button_status(); + + if (move_button & RIGHT) { + if (pad_pos_x+8+PAD_WIDTH > LCD_WIDTH) { + if (start_game==1 || on_the_pad==1) ball_pos_x+=LCD_WIDTH-pad_pos_x-PAD_WIDTH; + pad_pos_x+=LCD_WIDTH-pad_pos_x-PAD_WIDTH; + } else { + if ((start_game==1 || on_the_pad==1)) + ball_pos_x+=8; + pad_pos_x+=8; + } + } else if (move_button & LEFT) { + if (pad_pos_x-8 < 0) { + if (start_game==1 || on_the_pad==1) ball_pos_x-=pad_pos_x; + pad_pos_x-=pad_pos_x; + } else { + if (start_game==1 || on_the_pad==1) ball_pos_x-=8; + pad_pos_x-=8; + } + } + + + switch(button){ + case SELECT: + if (start_game==1 && con_game!=1 && pad_type!=1) { + bally=-4; + ballx=pad_pos_x+(PAD_WIDTH/2)-2>=LCD_WIDTH/2?2:-2; + start_game =0; + } else if (pad_type==1 && on_the_pad==1) { + on_the_pad=0; + if (start_game!=1 && con_game==1) { + start_game =0; + con_game=0; + } + } else if (pad_type==2 && con_game!=1) { + int tfire; + tfire=fire_space(); + fire[tfire].top=PAD_POS_Y-7; + fire[tfire].left=pad_pos_x+1; + tfire=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) { + ballx=x; + bally=y; + con_game=0; + } + break; + case QUIT: + switch(game_menu(1)){ + case 0: + life=2; + cur_level=0; + int_game(1); + break; + case 1: + if (ballx!=0 && bally !=0) + con_game=1; + break; + case 2: + if (help(1)==1) return 1; + break; + case 3: + return 1; + break; + }; + if (ballx!=0) x=ballx; + ballx=0; + if (bally!=0) y=bally; + bally=0; + break; + } + } else { + rb->lcd_bitmap(brickmania_gameover,LCD_WIDTH/2-55,LCD_HEIGHT-87,110,52); + rb->lcd_update(); + if (score>highscore) { + rb->sleep(HZ*2); + highscore=score; + rb->splash(HZ*2,true,"New High Score"); + } else { + rb->sleep(HZ * 3); + } + + ballx=0; + bally=0; + + switch(game_menu(0)){ + case 0: + cur_level=0; + life=2; + int_game(1); + break; + case 1: + con_game=1; + break; + case 2: + if (help(0)==1) return 1; + break; + case 3: + return 1; + break; + } + } + } +} + +/* this is the plugin entry point */ +enum plugin_status plugin_start(struct plugin_api* api, void* parameter) +{ + (void)parameter; + rb = api; +#if !defined(SIMULATOR) && defined(HAVE_ADJUSTABLE_CPU_FREQ) + rb->cpu_boost(true); +#endif + + bally=0; + ballx=0; + + rb->backlight_set_timeout(1); + + /* now go ahead and have fun! */ + while (dxball_game()!=1); + + configfile_save(HIGH_SCORE,config,1,0); + + rb->backlight_set_timeout(15); + +#if !defined(SIMULATOR) && defined(HAVE_ADJUSTABLE_CPU_FREQ) + rb->cpu_boost(false); +#endif + + return PLUGIN_OK; +}