rockbox/apps/plugins/brickmania.c
Andrew Mahone 23d9812273 loader-initialized global plugin API:
struct plugin_api *rb is declared in PLUGIN_HEADER, and pointed to by
__header.api

the loader uses this pointer to initialize rb before calling entry_point

entry_point is no longer passed a pointer to the plugin API

all plugins, and pluginlib functions, are modified to refer to the
global rb

pluginlib functions which only served to copy the API pointer are
removed

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19776 a1c6a512-1295-4272-9138-f99709370657
2009-01-16 10:34:40 +00:00

2112 lines
76 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2005, 2006 Ben Basha (Paprica)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "plugin.h"
#include "lib/configfile.h" /* Part of libplugin */
#include "lib/helper.h"
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
#define RC_QUIT BUTTON_RC_STOP
#elif CONFIG_KEYPAD == ONDIO_PAD
#define QUIT BUTTON_OFF
#define LEFT BUTTON_LEFT
#define RIGHT BUTTON_RIGHT
#define SELECT BUTTON_MENU
#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
#define SELECT BUTTON_PLAY
#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
#define SELECT BUTTON_SELECT
#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
#define SELECT BUTTON_SELECT
#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
#define SELECT BUTTON_PLAY
#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 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
#define QUIT BUTTON_POWER
#define LEFT BUTTON_LEFT
#define RIGHT BUTTON_RIGHT
#define ALTLEFT BUTTON_VOL_DOWN
#define ALTRIGHT BUTTON_VOL_UP
#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
#define SELECT BUTTON_PLAY
#define UP BUTTON_SCROLL_UP
#define DOWN BUTTON_SCROLL_DOWN
#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
#define QUIT BUTTON_BACK
#define LEFT BUTTON_LEFT
#define RIGHT BUTTON_RIGHT
#define SELECT BUTTON_SELECT
#define UP BUTTON_UP
#define DOWN BUTTON_DOWN
#elif (CONFIG_KEYPAD == MROBE100_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 == 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
#define SELECT BUTTON_SELECT
#define UP BUTTON_UP
#define DOWN BUTTON_DOWN
#else
#error No keymap defined!
#endif
#ifdef HAVE_TOUCHSCREEN
#ifndef LEFT
#define LEFT BUTTON_MIDLEFT
#endif
#ifndef RIGHT
#define RIGHT BUTTON_MIDRIGHT
#endif
#ifndef SELECT
#define SELECT BUTTON_CENTER
#endif
#ifndef UP
#define UP BUTTON_TOPMIDDLE
#endif
#ifndef DOWN
#define DOWN BUTTON_BOTTOMMIDDLE
#endif
#endif
#ifndef SCROLL_FWD /* targets without scroll wheel*/
#define SCROLL_FWD(x) (0)
#define SCROLL_BACK(x) (0)
#endif
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,
};
#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
#define PAD_HEIGHT (BMPHEIGHT_brickmania_pads/3)
#define BRICK_HEIGHT (BMPHEIGHT_brickmania_bricks/7)
#define BRICK_WIDTH BMPWIDTH_brickmania_bricks
#define LEFTMARGIN ((LCD_WIDTH-10*BRICK_WIDTH)/2)
#define POWERUP_HEIGHT (BMPHEIGHT_brickmania_powerups/7)
#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
#if (LCD_WIDTH == 320) && (LCD_HEIGHT == 240)
/* The time (in ms) for one iteration through the game loop - decrease this
to speed up the game - note that current_tick is (currently) only accurate
to 10ms.
*/
#define CYCLETIME 30
#define TOPMARGIN 30
#define BMPYOFS_start 110
#define HIGHSCORE_XPOS 57
#define HIGHSCORE_YPOS 88
#define STRINGPOS_FINISH 140
#define STRINGPOS_CONGRATS 157
#define STRINGPOS_NAVI 150
#define STRINGPOS_FLIP 150
#elif (LCD_WIDTH >= 220) && (LCD_HEIGHT >= 176)
/* The time (in ms) for one iteration through the game loop - decrease this
to speed up the game - note that current_tick is (currently) only accurate
to 10ms.
*/
#define CYCLETIME 30
/* Offsets for LCDS > 220x176 */
#define GAMESCREEN_HEIGHT 176
#define TOPMARGIN 30
#define XOFS ((LCD_WIDTH-220)/BRICK_WIDTH/2)*BRICK_WIDTH
#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
#define STRINGPOS_NAVI 150
#define STRINGPOS_FLIP 150
#elif (LCD_WIDTH == 160) && (LCD_HEIGHT == 128)
/* The time (in ms) for one iteration through the game loop - decrease this
to speed up the game - note that current_tick is (currently) only accurate
to 10ms.
*/
#define CYCLETIME 50
#define TOPMARGIN 21
#if LCD_DEPTH > 2
#define BMPYOFS_start 58
#else
#define BMPYOFS_start 66
#endif
#define HIGHSCORE_XPOS 10
#define HIGHSCORE_YPOS 38
#define STRINGPOS_FINISH 110
#define STRINGPOS_CONGRATS 100
#define STRINGPOS_NAVI 100
#define STRINGPOS_FLIP 100
#elif (LCD_WIDTH == 132) && (LCD_HEIGHT == 80)
/* The time (in ms) for one iteration through the game loop - decrease this
to speed up the game - note that current_tick is (currently) only accurate
to 10ms.
*/
#define CYCLETIME 50
#define TOPMARGIN 10
#define BMPYOFS_start 30
#define HIGHSCORE_XPOS 68
#define HIGHSCORE_YPOS 8
#define STRINGPOS_FINISH 55
#define STRINGPOS_CONGRATS 45
#define STRINGPOS_NAVI 60
#define STRINGPOS_FLIP 60
#elif (LCD_WIDTH == 128) && (LCD_HEIGHT == 128)
/* The time (in ms) for one iteration through the game loop - decrease this
to speed up the game - note that current_tick is (currently) only accurate
to 10ms.
*/
#define CYCLETIME 50
#define GAMESCREEN_HEIGHT 100
#define TOPMARGIN 15
#define BMPYOFS_start 70
#define HIGHSCORE_XPOS 8
#define HIGHSCORE_YPOS 36
#define STRINGPOS_FINISH 55
#define STRINGPOS_CONGRATS 45
#define STRINGPOS_NAVI 60
#define STRINGPOS_FLIP 60
/* iPod Mini */
#elif (LCD_WIDTH == 138) && (LCD_HEIGHT == 110)
/* The time (in ms) for one iteration through the game loop - decrease this
to speed up the game - note that current_tick is (currently) only accurate
to 10ms.
*/
#define CYCLETIME 50
#define TOPMARGIN 10
#define BMPYOFS_start 51
#define HIGHSCORE_XPOS 73
#define HIGHSCORE_YPOS 25
#define STRINGPOS_FINISH 54
#define STRINGPOS_CONGRATS 44
#define STRINGPOS_NAVI 44
#define STRINGPOS_FLIP 44
/* iAudio M3 */
#elif (LCD_WIDTH == 128) && (LCD_HEIGHT == 96)
/* The time (in ms) for one iteration through the game loop - decrease this
to speed up the game - note that current_tick is (currently) only accurate
to 10ms.
*/
#define CYCLETIME 50
#define TOPMARGIN 10
#define BMPYOFS_start 42
#define HIGHSCORE_XPOS 65
#define HIGHSCORE_YPOS 25
#define STRINGPOS_FINISH 54
#define STRINGPOS_CONGRATS 44
#define STRINGPOS_NAVI 44
#define STRINGPOS_FLIP 44
/* Archos / Sansa Clip / Sansa m200 */
#elif ((LCD_WIDTH == 112) | (LCD_WIDTH == 128)) && (LCD_HEIGHT == 64)
/* The time (in ms) for one iteration through the game loop - decrease this
to speed up the game - note that current_tick is (currently) only accurate
to 10ms.
*/
#define CYCLETIME 75
#define TOPMARGIN 10
#define BMPYOFS_start 22
#define HIGHSCORE_XPOS 0
#define HIGHSCORE_YPOS 0
#define STRINGPOS_FINISH 54
#define STRINGPOS_CONGRATS 44
#define STRINGPOS_NAVI 44
#define STRINGPOS_FLIP 44
/* nano and sansa */
#elif (LCD_WIDTH == 176) && (LCD_HEIGHT >= 132) && (LCD_DEPTH==16)
/* The time (in ms) for one iteration through the game loop - decrease this
to speed up the game - note that current_tick is (currently) only accurate
to 10ms.
*/
#define CYCLETIME 30
#define GAMESCREEN_HEIGHT 132
#define TOPMARGIN 21
#define BMPYOFS_start 58
#define HIGHSCORE_XPOS 7
#define HIGHSCORE_YPOS 36
#define STRINGPOS_FINISH 110
#define STRINGPOS_CONGRATS 110
#define STRINGPOS_NAVI 100
#define STRINGPOS_FLIP 100
#else
#error Unsupported LCD Size
#endif
#ifndef GAMESCREEN_HEIGHT
#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
#else
#define PAD_POS_Y GAMESCREEN_HEIGHT -PAD_HEIGHT - 1
#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] = {
{ /* 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,0x23,0x23,0x3,0x0,0x0,0x2,0x22,0x22,0x2},
{0x3,0x3,0x3,0x3,0x0,0x0,0x2,0x2,0x2,0x2},
{0x0,0x0,0x0,0x0,0x37,0x37,0x0,0x0,0x0,0x0},
{0x0,0x0,0x0,0x0,0x37,0x37,0x0,0x0,0x0,0x0},
{0x5,0x5,0x5,0x5,0x0,0x0,0x6,0x6,0x6,0x6},
{0x5,0x25,0x25,0x5,0x0,0x0,0x6,0x26,0x26,0x6},
{0x5,0x5,0x5,0x5,0x0,0x0,0x6,0x6,0x6,0x6}
},
{ /* level4 */
{0x0,0x0,0x0,0x27,0x27,0x27,0x27,0x0,0x0,0x0},
{0x0,0x0,0x0,0x27,0x7,0x7,0x27,0x0,0x0,0x0},
{0x22,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x22},
{0x22,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x22},
{0x26,0x6,0x0,0x2,0x2,0x2,0x2,0x0,0x6,0x26},
{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,0x33,0x3,0x0,0x4,0x4,0x0,0x5,0x5,0x0},
{0x3,0x33,0x0,0x4,0x4,0x0,0x5,0x5,0x0,0x36},
{0x3,0x0,0x4,0x4,0x0,0x5,0x5,0x0,0x6,0x36},
{0x0,0x24,0x24,0x0,0x25,0x25,0x0,0x26,0x26,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,0x32,0x32,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,0x25,0x25,0x5,0x0,0x0,0x0},
{0x0,0x5,0x5,0x25,0x5,0x5,0x25,0x5,0x5,0x0},
{0x5,0x5,0x25,0x5,0x5,0x5,0x5,0x25,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,0x23,0x3,0x3,0x23,0x2,0x0,0x4},
{0x4,0x0,0x2,0x22,0x2,0x2,0x22,0x2,0x0,0x4},
{0x4,0x0,0x6,0x21,0x5,0x5,0x21,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,0x21,0x1,0x1,0x1,0x1,0x1,0x1,0x21},
{0x1,0x0,0x0,0x3,0x0,0x0,0x3,0x1,0x31,0x1},
{0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x31,0x0,0x1},
{0x21,0x0,0x21,0x3,0x0,0x3,0x0,0x3,0x0,0x2},
{0x1,0x0,0x1,0x21,0x0,0x12,0x0,0x0,0x0,0x0},
{0x31,0x0,0x1,0x0,0x0,0x1,0x0,0x0,0x3,0x0},
{0x1,0x0,0x1,0x0,0x1,0x1,0x31,0x1,0x1,0x2},
{0x22,0x0,0x2,0x1,0x1,0x1,0x1,0x1,0x1,0x21}
},
{ /* 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 */
{0x31,0x3,0x1,0x1,0x0,0x0,0x1,0x1,0x3,0x31},
{0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x0},
{0x33,0x1,0x1,0x36,0x1,0x1,0x36,0x1,0x1,0x33},
{0x0,0x0,0x1,0x1,0x1,0x1,0x1,0x1,0x0,0x0},
{0x0,0x0,0x1,0x1,0x0,0x0,0x1,0x1,0x0,0x0},
{0x21,0x3,0x1,0x21,0x2,0x2,0x21,0x1,0x3,0x21},
{0x0,0x0,0x0,0x1,0x21,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},
{0x24,0x1,0x3,0x1,0x0,0x0,0x21,0x3,0x1,0x24},
{0x1,0x23,0x5,0x3,0x1,0x21,0x3,0x5,0x3,0x21},
{0x3,0x5,0x6,0x5,0x3,0x3,0x5,0x6,0x5,0x3},
{0x5,0x6,0x7,0x6,0x5,0x5,0x6,0x7,0x6,0x5},
{0x6,0x7,0x2,0x27,0x6,0x6,0x27,0x2,0x7,0x6},
{0x7,0x2,0x0,0x2,0x27,0x27,0x2,0x0,0x2,0x7},
{0x32,0x0,0x0,0x0,0x2,0x2,0x0,0x0,0x0,0x32}
},
{ /* 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,0x25,0x0,0x0,0x0,0x0,0x25,0x5,0x0},
{0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5},
{0x25,0x0,0x0,0x5,0x6,0x6,0x5,0x0,0x0,0x25},
{0x5,0x0,0x3,0x0,0x6,0x6,0x0,0x3,0x0,0x5},
{0x5,0x0,0x31,0x0,0x6,0x6,0x0,0x31,0x0,0x5},
{0x5,0x0,0x0,0x5,0x6,0x6,0x5,0x0,0x0,0x5},
{0x5,0x5,0x5,0x35,0x0,0x0,0x35,0x5,0x5,0x5},
{0x0,0x25,0x5,0x0,0x4,0x4,0x0,0x5,0x25,0x0}
},
{ /* level 28 (DigDug) by ts-x */
{0x35,0x5,0x5,0x25,0x0,0x25,0x25,0x5,0x5,0x35},
{0x6,0x0,0x0,0x6,0x0,0x6,0x6,0x0,0x0,0x6},
{0x7,0x0,0x37,0x37,0x0,0x37,0x37,0x7,0x0,0x7},
{0x7,0x0,0x7,0x0,0x0,0x0,0x7,0x7,0x7,0x7},
{0x4,0x4,0x4,0x24,0x0,0x24,0x4,0x0,0x0,0x4},
{0x4,0x4,0x0,0x0,0x0,0x4,0x4,0x0,0x4,0x4},
{0x24,0x24,0x4,0x4,0x4,0x4,0x0,0x0,0x24,0x4},
{0x1,0x1,0x1,0x1,0x1,0x1,0x21,0x21,0x1,0x1}
},
{ /* TheEnd */
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
{0x22,0x22,0x26,0x0,0x0,0x26,0x24,0x24,0x0,0x0},
{0x22,0x0,0x26,0x26,0x0,0x26,0x24,0x0,0x24,0x0},
{0x22,0x22,0x26,0x26,0x0,0x26,0x24,0x0,0x24,0x0},
{0x22,0x22,0x26,0x0,0x26,0x26,0x24,0x0,0x24,0x0},
{0x22,0x0,0x26,0x0,0x26,0x26,0x24,0x0,0x24,0x0},
{0x22,0x22,0x26,0x0,0x0,0x26,0x24,0x24,0x0,0x0},
{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
}
};
#define MAX_BALLS 10
int pad_pos_x;
int x[MAX_BALLS],y[MAX_BALLS];
int life;
int start_game,con_game;
int pad_type;
int score=0,vscore=0;
bool flip_sides=false;
int cur_level=0;
int brick_on_board=0;
int used_balls=1;
typedef struct cube {
int powertop;
int power;
char poweruse;
char used;
int color;
int hits;
int hiteffect;
} cube;
cube brick[80];
typedef struct balls {
int pos_x;
int pos_y;
int y;
int tempy;
int x;
int tempx;
bool glue;
} balls;
balls ball[MAX_BALLS];
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;
pad_pos_x=LCD_WIDTH/2-PAD_WIDTH/2;
for(i=0;i<MAX_BALLS;i++) {
ball[i].x=0;
ball[i].y=0;
ball[i].tempy=0;
ball[i].tempx=0;
ball[i].pos_y=PAD_POS_Y-BALL;
ball[i].pos_x=pad_pos_x+(PAD_WIDTH/2)-2;
ball[i].glue=false;
}
used_balls=1;
start_game =1;
con_game =0;
pad_type=0;
flip_sides=false;
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()%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=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_on_board++;
}
}
}
}
int sw,i,w;
/* sleep timer counting the score */
void sleep (int secs)
{
bool done=false;
char s[20];
int count=0;
while (!done) {
if (vscore<score) {
vscore++;
rb->snprintf(s, sizeof(s), "%d", vscore);
rb->lcd_getstringsize(s, &sw, &w);
#if (LCD_WIDTH == 112) && (LCD_HEIGHT == 64)
rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 0, s);
#else
rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 2, s);
#endif
rb->lcd_update_rect(0,0,LCD_WIDTH,w+2);
} else {
if (count==0)
count=*rb->current_tick+HZ*secs;
if (*rb->current_tick>=count)
done=true;
}
rb->yield();
}
}
#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;i<MENU_LENGTH;i++) {
#ifdef HAVE_LCD_COLOR
if (cur==0)
rb->lcd_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);
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);
}
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);
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();
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;
}
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 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;
default:
if(rb->default_event_handler(button) == SYS_USB_CONNECTED)
return 3;
break;
}
rb->yield();
}
}
int help(int when)
{
int w,h;
int button;
int xoffset=0;
int yoffset=0;
/* set the maximum x and y in the helpscreen
dont forget to update, if you change text */
int maxY=180;
int maxX=215;
while(true) {
#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
rb->lcd_getstringsize("BrickMania", &w, &h);
rb->lcd_putsxy(LCD_WIDTH/2-w/2+xoffset, 1+yoffset, "BrickMania");
#ifdef HAVE_LCD_COLOR
rb->lcd_set_foreground(LCD_RGBPACK(245,0,0));
rb->lcd_putsxy(1+xoffset, 1*(h+2)+yoffset,"Aim");
rb->lcd_set_foreground(LCD_WHITE);
#else
rb->lcd_putsxy(1+xoffset, 1*(h+2)+yoffset,"Aim");
#endif
rb->lcd_putsxy(1+xoffset, 2*(h+2)+yoffset,
"destroy all the bricks by bouncing");
rb->lcd_putsxy(1+xoffset, 3*(h+2)+yoffset,
"the ball of them using the paddle.");
#ifdef HAVE_LCD_COLOR
rb->lcd_set_foreground(LCD_RGBPACK(245,0,0));
rb->lcd_putsxy(1+xoffset, 5*(h+2)+yoffset,"Controls");
rb->lcd_set_foreground(LCD_WHITE);
#else
rb->lcd_putsxy(1+xoffset, 5*(h+2)+yoffset,"Controls");
#endif
rb->lcd_putsxy(1+xoffset, 6*(h+2)+yoffset,"< & > Move the paddle");
#if CONFIG_KEYPAD == ONDIO_PAD
rb->lcd_putsxy(1+xoffset, 7*(h+2)+yoffset,
"MENU Releases the ball/Fire!");
#elif (CONFIG_KEYPAD == RECORDER_PAD) || (CONFIG_KEYPAD == IAUDIO_M3_PAD)
rb->lcd_putsxy(1+xoffset, 7*(h+2)+yoffset,
"PLAY Releases the ball/Fire!");
#elif CONFIG_KEYPAD == IRIVER_H300_PAD
rb->lcd_putsxy(1+xoffset, 7*(h+2)+yoffset,
"NAVI Releases the ball/Fire!");
#else
rb->lcd_putsxy(1+xoffset, 7*(h+2)+yoffset,
"SELECT Releases the ball/Fire!");
#endif
#if CONFIG_KEYPAD == IAUDIO_M3_PAD
rb->lcd_putsxy(1+xoffset, 8*(h+2)+yoffset, "REC Opens menu/Quit");
#else
rb->lcd_putsxy(1+xoffset, 8*(h+2)+yoffset, "STOP Opens menu/Quit");
#endif
#ifdef HAVE_LCD_COLOR
rb->lcd_set_foreground(LCD_RGBPACK(245,0,0));
rb->lcd_putsxy(1+xoffset, 10*(h+2)+yoffset, "Specials");
rb->lcd_set_foreground(LCD_WHITE);
#else
rb->lcd_putsxy(1+xoffset, 10*(h+2)+yoffset, "Specials");
#endif
rb->lcd_putsxy(1+xoffset, 11*(h+2)+yoffset,
"N Normal:returns paddle to normal");
rb->lcd_putsxy(1+xoffset, 12*(h+2)+yoffset, "D DIE!:loses a life");
rb->lcd_putsxy(1+xoffset, 13*(h+2)+yoffset,
"L Life:gains a life/power up");
rb->lcd_putsxy(1+xoffset, 14*(h+2)+yoffset,
"F Fire:allows you to shoot bricks");
rb->lcd_putsxy(1+xoffset, 15*(h+2)+yoffset,
"G Glue:ball sticks to paddle");
rb->lcd_putsxy(1+xoffset, 16*(h+2)+yoffset,
"B Ball:generates another ball");
rb->lcd_putsxy(1+xoffset, 17*(h+2)+yoffset,
"FL Flip:flips left / right movement");
rb->lcd_update();
button=rb->button_get(true);
switch (button) {
#ifdef RC_QUIT
case RC_QUIT:
#endif
#ifdef HAVE_TOUCHSCREEN
case BUTTON_TOUCHSCREEN:
#endif
case QUIT:
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 0;
break;
case LEFT:
case LEFT | BUTTON_REPEAT:
#ifdef ALTLEFT
case ALTLEFT:
case ALTLEFT | BUTTON_REPEAT:
#endif
if( xoffset<0)
xoffset+=2;
break;
case RIGHT:
case RIGHT | BUTTON_REPEAT:
#ifdef ALTRIGHT
case ALTRIGHT:
case ALTRIGHT | BUTTON_REPEAT:
#endif
if(xoffset+maxX > LCD_WIDTH)
xoffset-=2;
break;
case UP:
case UP | BUTTON_REPEAT:
if(yoffset <0)
yoffset+=2;
break;
case DOWN:
case DOWN | BUTTON_REPEAT:
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)
{
/* pon: positive(1) or negative(0) */
if (mode==0) {
if (pon == 0)
return -ballxc;
else
return ballxc;
} else {
if (ball[ballnum].x > 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 0;
}
int game_loop(void)
{
int j,i,k,bricky,brickx;
char s[30];
int sec_count=0,num_count=10;
int end;
rb->srand( *rb->current_tick );
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) {
/* Convert CYCLETIME (in ms) to HZ */
end = *rb->current_tick + (CYCLETIME * HZ) / 1000;
if (life >= 0) {
#ifdef HAVE_LCD_COLOR
rb->lcd_set_background(LCD_BLACK);
rb->lcd_set_drawmode(DRMODE_SOLID);
rb->lcd_clear_display();
rb->lcd_set_background(LCD_BLACK);
#if LCD_HEIGHT > GAMESCREEN_HEIGHT
rb->lcd_set_foreground(rb->global_settings->bg_color);
rb->lcd_fillrect(0, GAMESCREEN_HEIGHT, LCD_WIDTH,
LCD_HEIGHT - GAMESCREEN_HEIGHT);
#endif
rb->lcd_set_foreground(LCD_WHITE);
#else
rb->lcd_clear_display();
#endif
if (flip_sides) {
if (*rb->current_tick>=sec_count) {
sec_count=*rb->current_tick+HZ;
if (num_count!=0)
num_count--;
else
flip_sides=false;
}
rb->snprintf(s, sizeof(s), "%d", num_count);
rb->lcd_getstringsize(s, &sw, NULL);
rb->lcd_putsxy(LCD_WIDTH/2-2, STRINGPOS_FLIP, s);
}
/* write life num */
#if (LCD_WIDTH == 112) && (LCD_HEIGHT == 64)
rb->snprintf(s, sizeof(s), "L:%d", life);
rb->lcd_putsxy(0, 0, s);
#else
rb->snprintf(s, sizeof(s), "Life: %d", life);
rb->lcd_putsxy(2, 2, s);
#endif
#if (LCD_WIDTH == 112) && (LCD_HEIGHT == 64)
rb->snprintf(s, sizeof(s), "L%d", cur_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->lcd_getstringsize(s, &sw, NULL);
rb->lcd_putsxy(LCD_WIDTH-sw-2, 2, s);
#endif
if (vscore<score) vscore++;
rb->snprintf(s, sizeof(s), "%d", vscore);
rb->lcd_getstringsize(s, &sw, NULL);
#if (LCD_WIDTH == 112) && (LCD_HEIGHT == 64)
rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 0, s);
#else
rb->lcd_putsxy(LCD_WIDTH/2-sw/2, 2, s);
#endif
/* continue game */
if (con_game== 1 && start_game!=1) {
#if CONFIG_KEYPAD == ONDIO_PAD
rb->snprintf(s, sizeof(s), "MENU To Continue");
#elif CONFIG_KEYPAD == IRIVER_H300_PAD
rb->snprintf(s, sizeof(s), "Press NAVI To Continue");
#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
rb->snprintf(s, sizeof(s), "PLAY To Continue");
#else
rb->snprintf(s, sizeof(s), "Press SELECT To Continue");
#endif
rb->lcd_getstringsize(s, &sw, NULL);
rb->lcd_putsxy(LCD_WIDTH/2-sw/2, STRINGPOS_NAVI, s);
sec_count=*rb->current_tick+HZ;
}
/* draw the ball */
for(i=0;i<used_balls;i++)
rb->lcd_bitmap(brickmania_ball,ball[i].pos_x, ball[i].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<7) {
if (brick[i*10+j].poweruse==2) {
if (con_game!=1)
brick[i*10+j].powertop+=2;
rb->lcd_bitmap_part(brickmania_powerups,0,
POWERUP_HEIGHT*brick[i*10+j
].power,
POWERUP_WIDTH,
LEFTMARGIN+j*BRICK_WIDTH+
(BRICK_WIDTH/2-
POWERUP_WIDTH/2),
brick[i*10+j].powertop,
POWERUP_WIDTH,
POWERUP_HEIGHT);
}
}
if ((pad_pos_x<LEFTMARGIN+j*BRICK_WIDTH+5 &&
pad_pos_x+PAD_WIDTH>LEFTMARGIN+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);
sleep(2);
}
break;
case 2:
score+=34;
pad_type=1;
break;
case 3:
score+=47;
pad_type=2;
for(k=0;k<used_balls;k++)
ball[k].glue=false;
break;
case 4:
score+=23;
pad_type=0;
for(k=0;k<used_balls;k++)
ball[k].glue=false;
flip_sides=false;
break;
case 5:
score+=23;
sec_count=*rb->current_tick+HZ;
num_count=10;
flip_sides=!flip_sides;
break;
case 6:
score+=23;
used_balls++;
ball[used_balls-1].x= rb->rand()%1 == 0 ?
-1 : 1;
ball[used_balls-1].y= -4;
break;
}
brick[i*10+j].poweruse=1;
}
if (brick[i*10+j].powertop>PAD_POS_Y)
brick[i*10+j].poweruse=1;
brickx=LEFTMARGIN+j*BRICK_WIDTH;
bricky=TOPMARGIN+i*BRICK_HEIGHT;
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;
if (brick[i*10+j].hits > 0) {
brick[i*10+j].hits--;
brick[i*10+j].hiteffect++;
score+=3;
}
else {
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,
LEFTMARGIN+j*BRICK_WIDTH,
TOPMARGIN+i*BRICK_HEIGHT,
BRICK_WIDTH, BRICK_HEIGHT);
#ifdef HAVE_LCD_COLOR /* No transparent effect for greyscale lcds for now */
if (brick[i*10+j].hiteffect>0)
rb->lcd_bitmap_transparent_part(brickmania_break,
0,
BRICK_HEIGHT*brick[i*10+j].hiteffect,
BRICK_WIDTH,
LEFTMARGIN+j*BRICK_WIDTH,
TOPMARGIN+i*BRICK_HEIGHT,
BRICK_WIDTH,
BRICK_HEIGHT);
#endif
}
for(k=0;k<used_balls;k++) {
if (ball[k].pos_y <160) {
if (brick[i*10+j].used==1) {
if ((ball[k].pos_x+ball[k].x+HALFBALL >=
brickx &&
ball[k].pos_x+ball[k].x+HALFBALL <=
brickx+BRICK_WIDTH) &&
((bricky-4<ball[k].pos_y+BALL &&
bricky>ball[k].pos_y+BALL) ||
(bricky+4>ball[k].pos_y+BALL+BALL &&
bricky<ball[k].pos_y+BALL+BALL)) &&
(ball[k].y >0)) {
ball[k].tempy=bricky-ball[k].pos_y-BALL;
}
else if ((ball[k].pos_x+ball[k].x+HALFBALL >=
brickx &&
ball[k].pos_x+ball[k].x+HALFBALL <=
brickx+BRICK_WIDTH) &&
((bricky+BRICK_HEIGHT+4>ball[k].pos_y &&
bricky+BRICK_HEIGHT<ball[k].pos_y) ||
(bricky+BRICK_HEIGHT-4<ball[k].pos_y-BALL &&
bricky+BRICK_HEIGHT>ball[k].pos_y-BALL)) &&
(ball[k].y <0)) {
ball[k].tempy=
-(ball[k].pos_y-(bricky+BRICK_HEIGHT));
}
if ((ball[k].pos_y+HALFBALL >=
bricky &&
ball[k].pos_y+HALFBALL <=
bricky+BRICK_HEIGHT) &&
((brickx-4<ball[k].pos_x+BALL &&
brickx>ball[k].pos_x+BALL) ||
(brickx+4>ball[k].pos_x+BALL+BALL &&
brickx<ball[k].pos_x+BALL+BALL)) &&
(ball[k].x >0)) {
ball[k].tempx=brickx-ball[k].pos_x-BALL;
}
else if ((ball[k].pos_y+ball[k].y+HALFBALL >=
bricky &&
ball[k].pos_y+ball[k].y+HALFBALL <=
bricky+BRICK_HEIGHT) &&
((brickx+BRICK_WIDTH+4>ball[k].pos_x &&
brickx+BRICK_WIDTH<ball[k].pos_x) ||
(brickx+BRICK_WIDTH-4<ball[k].pos_x-
BALL &&
brickx+BRICK_WIDTH>ball[k].pos_x-
BALL)) && (ball[k].x <0)) {
ball[k].tempx=
-(ball[k].pos_x-(brickx+BRICK_WIDTH));
}
if ((ball[k].pos_x+HALFBALL >= brickx &&
ball[k].pos_x+HALFBALL <=
brickx+BRICK_WIDTH) &&
((bricky+BRICK_HEIGHT==ball[k].pos_y) ||
(bricky+BRICK_HEIGHT-6<=ball[k].pos_y &&
bricky+BRICK_HEIGHT>ball[k].pos_y)) &&
(ball[k].y <0)) { /* bottom line */
if (brick[i*10+j].hits > 0) {
brick[i*10+j].hits--;
brick[i*10+j].hiteffect++;
score+=2;
}
else {
brick[i*10+j].used=0;
if (brick[i*10+j].power!=10)
brick[i*10+j].poweruse=2;
}
ball[k].y = ball[k].y*-1;
}
else if ((ball[k].pos_x+HALFBALL >= brickx &&
ball[k].pos_x+HALFBALL <=
brickx+BRICK_WIDTH) &&
((bricky==ball[k].pos_y+BALL) ||
(bricky+6>=ball[k].pos_y+BALL &&
bricky<ball[k].pos_y+BALL)) &&
(ball[k].y >0)) { /* top line */
if (brick[i*10+j].hits > 0) {
brick[i*10+j].hits--;
brick[i*10+j].hiteffect++;
score+=2;
}
else {
brick[i*10+j].used=0;
if (brick[i*10+j].power!=10)
brick[i*10+j].poweruse=2;
}
ball[k].y = ball[k].y*-1;
}
if ((ball[k].pos_y+HALFBALL >= bricky &&
ball[k].pos_y+HALFBALL <=
bricky+BRICK_HEIGHT) &&
((brickx==ball[k].pos_x+BALL) ||
(brickx+6>=ball[k].pos_x+BALL &&
brickx<ball[k].pos_x+BALL)) &&
(ball[k].x > 0)) { /* left line */
if (brick[i*10+j].hits > 0) {
brick[i*10+j].hits--;
brick[i*10+j].hiteffect++;
score+=2;
}
else {
brick[i*10+j].used=0;
if (brick[i*10+j].power!=10)
brick[i*10+j].poweruse=2;
}
ball[k].x = ball[k].x*-1;
}
else if ((ball[k].pos_y+HALFBALL >= bricky &&
ball[k].pos_y+HALFBALL <=
bricky+BRICK_HEIGHT) &&
((brickx+BRICK_WIDTH==
ball[k].pos_x) ||
(brickx+BRICK_WIDTH-6<=
ball[k].pos_x &&
brickx+BRICK_WIDTH>
ball[k].pos_x)) &&
(ball[k].x < 0)) { /* Right line */
if (brick[i*10+j].hits > 0) {
brick[i*10+j].hits--;
brick[i*10+j].hiteffect++;
score+=2;
}
else {
brick[i*10+j].used=0;
if (brick[i*10+j].power!=10)
brick[i*10+j].poweruse=2;
}
ball[k].x = ball[k].x*-1;
}
if (brick[i*10+j].used==0) {
brick_on_board--;
score+=8;
}
}
}
} /* for k */
} /* for j */
} /* for i */
/* 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);
for(k=0;k<used_balls;k++) {
if ((ball[k].pos_x >= pad_pos_x &&
ball[k].pos_x <= pad_pos_x+PAD_WIDTH) &&
(PAD_POS_Y-4<ball[k].pos_y+BALL &&
PAD_POS_Y>ball[k].pos_y+BALL) && (ball[k].y >0))
ball[k].tempy=PAD_POS_Y-ball[k].pos_y-BALL;
else if ((4>ball[k].pos_y && 0<ball[k].pos_y) &&
(ball[k].y <0))
ball[k].tempy=-ball[k].pos_y;
if ((LCD_WIDTH-4<ball[k].pos_x+BALL &&
LCD_WIDTH>ball[k].pos_x+BALL) && (ball[k].x >0))
ball[k].tempx=LCD_WIDTH-ball[k].pos_x-BALL;
else if ((4>ball[k].pos_x && 0<ball[k].pos_x) &&
(ball[k].x <0))
ball[k].tempx=-ball[k].pos_x;
/* top line */
if (ball[k].pos_y<= 0)
ball[k].y = ball[k].y*-1;
/* bottom line */
else if (ball[k].pos_y+BALL >= GAMESCREEN_HEIGHT) {
if (used_balls>1) {
used_balls--;
ball[k].pos_x = ball[used_balls].pos_x;
ball[k].pos_y = ball[used_balls].pos_y;
ball[k].y = ball[used_balls].y;
ball[k].tempy = ball[used_balls].tempy;
ball[k].x = ball[used_balls].x;
ball[k].tempx = ball[used_balls].tempx;
ball[k].glue = ball[used_balls].glue;
ball[used_balls].x=0;
ball[used_balls].y=0;
ball[used_balls].tempy=0;
ball[used_balls].tempx=0;
ball[used_balls].pos_y=PAD_POS_Y-BALL;
ball[used_balls].pos_x=pad_pos_x+(PAD_WIDTH/2)-2;
k--;
continue;
} else {
life--;
if (life>=0) {
int_game(0);
sleep(2);
}
}
}
/* left line ,right line */
if ((ball[k].pos_x <= 0) ||
(ball[k].pos_x+BALL >= LCD_WIDTH)) {
ball[k].x = ball[k].x*-1;
ball[k].pos_x = ball[k].pos_x <= 0 ? 0 : LCD_WIDTH-BALL;
}
if ((ball[k].pos_y+BALL >= PAD_POS_Y &&
(ball[k].pos_x >= pad_pos_x &&
ball[k].pos_x <= pad_pos_x+PAD_WIDTH)) &&
start_game != 1 && !ball[k].glue) {
if ((ball[k].pos_x+HALFBALL >= pad_pos_x &&
ball[k].pos_x+HALFBALL <=
pad_pos_x+(PAD_WIDTH/2/4)) ||
(ball[k].pos_x +HALFBALL>=
pad_pos_x+(PAD_WIDTH-(PAD_WIDTH/2/4)) &&
ball[k].pos_x+HALFBALL <= pad_pos_x+PAD_WIDTH)) {
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<=
pad_pos_x+(PAD_WIDTH/2)?
0:1,k);
}
else if ((ball[k].pos_x+HALFBALL >=
pad_pos_x+(PAD_WIDTH/2/4) &&
ball[k].pos_x+HALFBALL <=
pad_pos_x+2*(PAD_WIDTH/2/4)) ||
(ball[k].pos_x+HALFBALL >=
pad_pos_x+(PAD_WIDTH-2*(PAD_WIDTH/2/4)) &&
ball[k].pos_x+HALFBALL <=
pad_pos_x+(PAD_WIDTH-(PAD_WIDTH/2/4)) )) {
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<=
pad_pos_x+(PAD_WIDTH/2)?
0:1,k);
}
else if ((ball[k].pos_x+HALFBALL >=
pad_pos_x+2*(PAD_WIDTH/2/4) &&
ball[k].pos_x+HALFBALL <=
pad_pos_x+3*(PAD_WIDTH/2/4)) ||
(ball[k].pos_x+2 >=
pad_pos_x+(PAD_WIDTH-3*(PAD_WIDTH/2/4)) &&
ball[k].pos_x+2 <=
pad_pos_x+ ((PAD_WIDTH/2)-2*(PAD_WIDTH/2/4)) )) {
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<=
pad_pos_x+(PAD_WIDTH/2)?
0:1,k);
}
else if ((ball[k].pos_x+HALFBALL >=
pad_pos_x+3*(PAD_WIDTH/2/4) &&
ball[k].pos_x+HALFBALL <=
pad_pos_x+4*(PAD_WIDTH/2/4)-2) ||
(ball[k].pos_x+2 >= pad_pos_x+(PAD_WIDTH/2+2) &&
ball[k].pos_x+2 <=
pad_pos_x+(PAD_WIDTH-3*(PAD_WIDTH/2/4)) )) {
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);
}
else {
ball[k].y = -4;
}
}
if (!ball[k].glue) {
ball[k].pos_x+=ball[k].tempx!=0?ball[k].tempx:ball[k].x;
ball[k].pos_y+=ball[k].tempy!=0?ball[k].tempy:ball[k].y;
ball[k].tempy=0;
ball[k].tempx=0;
}
if (ball[k].pos_y+5 >= PAD_POS_Y &&
(pad_type==1 && !ball[k].glue) &&
(ball[k].pos_x >= pad_pos_x &&
ball[k].pos_x <= pad_pos_x+PAD_WIDTH)) {
ball[k].y=0;
ball[k].pos_y=PAD_POS_Y-BALL;
ball[k].glue=true;
}
} /* for k */
rb->lcd_update();
if (brick_on_board < 0) {
if (cur_level+1<levels_num) {
cur_level++;
score+=100;
int_game(1);
sleep(2);
}
else {
rb->lcd_getstringsize("Congratulations!", &sw, NULL);
rb->lcd_putsxy(LCD_WIDTH/2-sw/2, STRINGPOS_CONGRATS,
"Congratulations!");
#if (LCD_WIDTH == 112) && (LCD_HEIGHT == 64)
rb->lcd_getstringsize("No more levels", &sw, NULL);
rb->lcd_putsxy(LCD_WIDTH/2-sw/2, STRINGPOS_FINISH,
"No more levels");
#else
rb->lcd_getstringsize("You have finished the game!",
&sw, NULL);
rb->lcd_putsxy(LCD_WIDTH/2-sw/2, STRINGPOS_FINISH,
"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");
}
else {
sleep(3);
}
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 button_right,button_left;
button=rb->button_get(false);
#if defined(HAS_BUTTON_HOLD) && !defined(HAVE_REMOTE_LCD_AS_MAIN)
/* FIXME: Should probably check remote hold here */
if (rb->button_hold())
button = QUIT;
#endif
#ifdef HAVE_TOUCHSCREEN
if(button & BUTTON_TOUCHSCREEN)
{
short touch_x, touch_y;
touch_x = rb->button_get_data() >> 16;
touch_y = rb->button_get_data() & 0xffff;
if(touch_y >= PAD_POS_Y && touch_y <= PAD_POS_Y+PAD_HEIGHT)
{
pad_pos_x += (flip_sides ? -1 : 1) * ( (touch_x-pad_pos_x-PAD_WIDTH/2) / 4 );
if(pad_pos_x < 0)
pad_pos_x = 0;
else if(pad_pos_x+PAD_WIDTH > LCD_WIDTH)
pad_pos_x = LCD_WIDTH-PAD_WIDTH;
for(k=0;k<used_balls;k++)
if ((start_game==1 || ball[k].glue))
ball[k].pos_x = pad_pos_x+PAD_WIDTH/2;
}
if(button & BUTTON_REL)
button = SELECT;
}
else
{
#endif
move_button=rb->button_status();
#ifdef ALTRIGHT
button_right=((move_button & RIGHT) || (move_button & ALTRIGHT));
button_left=((move_button & LEFT) || (move_button & ALTLEFT));
#else
button_right=((move_button & RIGHT) || (SCROLL_FWD(button)));
button_left=((move_button & LEFT) || (SCROLL_BACK(button)));
#endif
if ((con_game== 1 && start_game!=1) && (button_right || button_left))
continue;
if ((button_right && flip_sides==false) ||
(button_left && flip_sides==true)) {
if (pad_pos_x+8+PAD_WIDTH > LCD_WIDTH) {
for(k=0;k<used_balls;k++)
if (start_game==1 || ball[k].glue)
ball[k].pos_x+=LCD_WIDTH-pad_pos_x-PAD_WIDTH;
pad_pos_x+=LCD_WIDTH-pad_pos_x-PAD_WIDTH;
}
else {
for(k=0;k<used_balls;k++)
if ((start_game==1 || ball[k].glue))
ball[k].pos_x+=8;
pad_pos_x+=8;
}
}
else if ((button_left && flip_sides==false) ||
(button_right && flip_sides==true)) {
if (pad_pos_x-8 < 0) {
for(k=0;k<used_balls;k++)
if (start_game==1 || ball[k].glue)
ball[k].pos_x-=pad_pos_x;
pad_pos_x-=pad_pos_x;
}
else {
for(k=0;k<used_balls;k++)
if (start_game==1 || ball[k].glue)
ball[k].pos_x-=8;
pad_pos_x-=8;
}
}
#ifdef HAVE_TOUCHSCREEN
}
#endif
switch(button) {
case UP:
case SELECT:
if (start_game==1 && con_game!=1 && pad_type!=1) {
for(k=0;k<used_balls;k++) {
ball[k].y=-4;
ball[k].x=pad_pos_x+(PAD_WIDTH/2)-2>=
LCD_WIDTH/2?2:-2;
}
start_game =0;
}
else if (pad_type==1) {
for(k=0;k<used_balls;k++) {
if (ball[k].glue)
ball[k].glue=false;
else if (start_game==1) {
ball[k].x = x[k];
ball[k].y = y[k];
}
}
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) {
for(k=0;k<used_balls;k++) {
ball[k].x=x[k];
ball[k].y=y[k];
}
con_game=0;
}
break;
#ifdef RC_QUIT
case RC_QUIT:
#endif
case QUIT:
switch(game_menu(1)) {
case 0:
life=2;
cur_level=0;
int_game(1);
break;
case 1:
for(k=0;k<used_balls;k++)
if (ball[k].x!=0 && ball[k].y !=0)
con_game=1;
break;
case 2:
if (help(1)==1)
return 1;
break;
case 3:
return 1;
break;
}
for(k=0;k<used_balls;k++) {
if (ball[k].x!=0)
x[k]=ball[k].x;
ball[k].x=0;
if (ball[k].y!=0)
y[k]=ball[k].y;
ball[k].y=0;
}
break;
default:
if(rb->default_event_handler(button) == SYS_USB_CONNECTED)
return 1;
break;
}
}
else {
#ifdef HAVE_LCD_COLOR
rb->lcd_bitmap_transparent(brickmania_gameover,
(LCD_WIDTH - GAMEOVER_WIDTH)/2,
(GAMESCREEN_HEIGHT - GAMEOVER_HEIGHT)/2,
GAMEOVER_WIDTH,GAMEOVER_HEIGHT);
#else /* greyscale and mono */
rb->lcd_bitmap(brickmania_gameover,(LCD_WIDTH - GAMEOVER_WIDTH)/2,
(GAMESCREEN_HEIGHT - GAMEOVER_HEIGHT)/2,
GAMEOVER_WIDTH,GAMEOVER_HEIGHT);
#endif
rb->lcd_update();
if (score>highscore) {
sleep(2);
highscore=score;
rb->splash(HZ*2, "New High Score");
} else {
sleep(3);
}
for(k=0;k<used_balls;k++) {
ball[k].x=0;
ball[k].y=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;
}
}
if (end > *rb->current_tick)
rb->sleep(end-*rb->current_tick);
else
rb->yield();
}
}
/* this is the plugin entry point */
enum plugin_status plugin_start(const void* parameter)
{
(void)parameter;
rb->lcd_setfont(FONT_SYSFIXED);
#if LCD_DEPTH > 1
rb->lcd_set_backdrop(NULL);
#endif
/* Turn off backlight timeout */
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);
/* Restore user's original backlight setting */
rb->lcd_setfont(FONT_UI);
/* Turn on backlight timeout (revert to settings) */
backlight_use_settings(); /* backlight control in lib/helper.c */
return PLUGIN_OK;
}