snake2: Some code cleanup, loads all levels at startup, fixed the bug that prevented game B from advancing to the next level

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4885 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Linus Nielsen Feltzing 2004-07-15 12:33:19 +00:00
parent 272d6f11cd
commit c145dacb90
3 changed files with 93 additions and 88 deletions

View file

@ -244,6 +244,9 @@ static struct plugin_api rockbox_api = {
#ifdef HAVE_LCD_CHARCELLS
lcd_icon,
#endif
#ifdef HAVE_LCD_BITMAP
lcd_puts_style,
#endif
};
int plugin_load(char* plugin, void* parameter)

View file

@ -60,7 +60,7 @@
#endif
/* increase this every time the api struct changes */
#define PLUGIN_API_VERSION 19
#define PLUGIN_API_VERSION 20
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
@ -280,6 +280,9 @@ struct plugin_api {
#ifdef HAVE_LCD_CHARCELLS
void (*lcd_icon)(int icon, bool enable);
#endif
#ifdef HAVE_LCD_BITMAP
void (*lcd_puts_style)(int x, int y, unsigned char *str, int style);
#endif
};
/* defined by the plugin loader (plugin.c) */

View file

@ -33,6 +33,9 @@ Head and Tail are stored
#define WIDTH 28
#define HEIGHT 16
static int max_levels = 0;
static char (*level_cache)[HEIGHT][WIDTH];
/*Board itself - 2D int array*/
static int board[WIDTH][HEIGHT];
/*
@ -41,13 +44,14 @@ static int board[WIDTH][HEIGHT];
*/
static int ardirectionbuffer[2];
static unsigned int score, hiscore = 0;
static short applex;
static short appley;
static short dir;
static short frames;
static short apple;
static short level = 4, speed = 5,dead = 0, quit = 0, sillydir = 0, num_levels=0;
static short level_from_file = 1;
static int applex;
static int appley;
static int dir;
static int frames;
static int apple;
static int level = 4, speed = 5,dead = 0, quit = 0;
static int sillydir = 0, num_levels = 0;
static int level_from_file = 1;
static struct plugin_api* rb;
static int headx, heady, tailx, taily, applecountdown = 5;
static int game_type = 0;
@ -73,37 +77,50 @@ static int game_b_level=1;
#define LEVELS_FILE "/.rockbox/snake2.levels"
static void set_level_count(void)
int load_all_levels(void)
{
int line_count=0;
int fd = 0;
char buffer[WIDTH+2]; /* WIDTH plus CR/LF and \0 */
if ((fd = rb->open(LEVELS_FILE, O_RDONLY)) < 0)
{
rb->splash(0, true, "Unable to open %s", LEVELS_FILE);
}
if(!(fd < 0))
{
while(1)
{
int len = rb->read_line(fd, buffer, sizeof(buffer));
if(len <= 0)
break;
else
line_count++;
int linecnt = 0;
int fd;
int size;
char buf[64]; /* Larger than WIDTH, to allow for whitespace after the
lines */
if(line_count==HEIGHT)
/* Init the level_cache pointer and
calculate how many levels that will fit */
level_cache = rb->plugin_get_buffer(&size);
max_levels = size / (HEIGHT*WIDTH);
num_levels = 0;
/* open file */
if ((fd = rb->open(LEVELS_FILE, O_RDONLY)) < 0)
{
return -1;
}
while(rb->read_line(fd, buf, 64))
{
if(buf[0] == '-') /* Separator? */
{
num_levels++;
if(num_levels > max_levels)
{
num_levels++;
line_count=0;
rb->splash(HZ, true, "Too many levels in file");
break;
}
continue;
}
rb->close(fd);
rb->memcpy(level_cache[num_levels][linecnt], buf, WIDTH);
linecnt++;
if(linecnt == HEIGHT)
{
linecnt = 0;
}
}
rb->close(fd);
return 0;
}
/*
@ -124,51 +141,29 @@ void clear_board( void)
int load_level( int level_number )
{
int fd = 0;
int x,y, len;
unsigned char buffer[WIDTH+2];
/* open file */
if ((fd = rb->open(LEVELS_FILE, O_RDONLY)) < 0)
{
return -1;
}
rb->lseek(fd, level_number*(WIDTH+2)*(HEIGHT+1), SEEK_SET);
int x,y;
clear_board();
for(y=0; y < HEIGHT; y++)
for(y = 0;y < HEIGHT;y++)
{
len = rb->read_line(fd, buffer, WIDTH+2);
if(len <= 0)
for(x = 0;x < WIDTH;x++)
{
rb->close(fd);
return -1;
}
else
{
/*Read a line in, now add to the array:*/
for(x=0;x < WIDTH;x++)
{
switch(buffer[x])
{
case '1':
board[x][y] = NORTH;
break;
switch(level_cache[level_number][y][x])
{
case '1':
board[x][y] = NORTH;
break;
case '2':
board[x][y] = EAST;
break;
case '2':
board[x][y] = EAST;
break;
case 'H':
board[x][y] = HEAD;
break;
}
}
case 'H':
board[x][y] = HEAD;
break;
}
}
}
rb->close(fd);
return 1;
}
@ -219,8 +214,10 @@ void set_direction(int newdir)
}
}
void init_snake( void )
void new_level(int level)
{
load_level(level);
ardirectionbuffer[0] = -1;
ardirectionbuffer[1] = -1;
dir = EAST;
@ -236,9 +233,14 @@ void init_snake( void )
board[headx-3][heady] = dir;
board[headx-4][heady] = dir;
num_apples_to_got=0;
}
void init_snake(void)
{
num_apples_to_get=1;
level_from_file = 1;
game_b_level=1;
new_level(level_from_file);
}
/*
@ -247,7 +249,7 @@ void init_snake( void )
*/
void draw_apple( void )
{
short x,y;
int x,y;
if (!apple)
{
do
@ -412,7 +414,7 @@ void draw_boundary ( void )
*/
void redraw (void)
{
short x,y;
int x,y;
rb->lcd_clear_display();
for (x = 0; x < WIDTH; x++)
@ -607,12 +609,9 @@ void collision ( int x, int y )
num_apples_to_get+=2;
game_b_level++;
}
rb->splash(0, true, "Level Completed!");
rb->sleep(HZ);
rb->splash(HZ, true, "Level Completed!");
rb->lcd_clear_display();
num_apples_to_got=0;
load_level(level_from_file);
init_snake();
new_level(level_from_file);
redraw();
}
else
@ -925,18 +924,19 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
TEST_PLUGIN_API(api);
(void)(parameter);
rb = api;
set_level_count();
/* Lets use the default font */
rb->lcd_setfont(FONT_SYSFIXED);
load_all_levels();
if (num_levels == 0) {
rb->splash(HZ*2, true, "Failed loading levels!");
return PLUGIN_OK;
}
/* Lets use the default font */
rb->lcd_setfont(FONT_SYSFIXED);
/*load the 1st level in*/
load_level( level_from_file );
while(quit==0)
{
game_init();
@ -945,13 +945,12 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
if(quit==0)
{
load_level( level_from_file );
init_snake();
/*Start Game:*/
game();
/* Game over, reload level*/
init_snake();
load_level( level_from_file );
init_snake();
/*Start Game:*/
game();
clear_board();
}
}