23d9812273
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
2112 lines
76 KiB
C
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;
|
|
}
|