snake2: add standard start menu. use pluginlib highscore for highscores.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22208 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Teruaki Kawashima 2009-08-08 13:33:27 +00:00
parent de460fe783
commit 6e4c3b7ebe

View file

@ -31,13 +31,15 @@ Head and Tail are stored
#include "plugin.h"
#ifdef HAVE_LCD_BITMAP
#include "lib/highscore.h"
#include "lib/playback_control.h"
PLUGIN_HEADER
#define WIDTH 28
#define HEIGHT 16
#if (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128) && (LCD_DEPTH >= 1)
#if (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128)
#include "pluginbitmaps/snake2_header1.h"
#include "pluginbitmaps/snake2_header2.h"
#include "pluginbitmaps/snake2_left.h"
@ -135,11 +137,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_OFF
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_F3
#define SNAKE2_PLAYPAUSE BUTTON_PLAY
#define SNAKE2_PLAYPAUSE_TEXT "Play"
@ -149,11 +146,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_OFF
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_F3
#define SNAKE2_PLAYPAUSE BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -163,10 +155,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_OFF
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_SELECT_TYPE BUTTON_LEFT
#define SNAKE2_PLAYPAUSE BUTTON_MENU
#define SNAKE2_PLAYPAUSE_TEXT "Menu"
@ -177,15 +165,11 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_OFF
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_MODE
#define SNAKE2_PLAYPAUSE BUTTON_ON
#define SNAKE2_PLAYPAUSE_TEXT "Play"
#define SNAKE2_RC_QUIT BUTTON_RC_STOP
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
(CONFIG_KEYPAD == IPOD_3G_PAD) || \
(CONFIG_KEYPAD == IPOD_1G2G_PAD)
@ -194,11 +178,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_MENU
#define SNAKE2_DOWN BUTTON_PLAY
#define SNAKE2_QUIT (BUTTON_SELECT | BUTTON_MENU)
#define SNAKE2_LEVEL_UP BUTTON_SCROLL_FWD
#define SNAKE2_LEVEL_DOWN BUTTON_SCROLL_BACK
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_PLAY
#define SNAKE2_PLAYPAUSE BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -208,11 +187,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_PLAY
#define SNAKE2_PLAYPAUSE BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -222,11 +196,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_MENU
#define SNAKE2_PLAYPAUSE BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -237,11 +206,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_REC
#define SNAKE2_PLAYPAUSE BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -252,11 +216,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_VOL_UP
#define SNAKE2_PLAYPAUSE BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -266,11 +225,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT (BUTTON_HOME|BUTTON_REPEAT)
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_SELECT|BUTTON_REL
#define SNAKE2_PLAYPAUSE BUTTON_SELECT|BUTTON_REPEAT
#define SNAKE2_PLAYPAUSE_TEXT "Hold Select"
@ -280,11 +234,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_SCROLL_UP
#define SNAKE2_DOWN BUTTON_SCROLL_DOWN
#define SNAKE2_QUIT BUTTON_POWER
#define SNAKE2_LEVEL_UP BUTTON_SCROLL_UP
#define SNAKE2_LEVEL_DOWN BUTTON_SCROLL_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_PLAY
#define SNAKE2_PLAYPAUSE BUTTON_FF
#define SNAKE2_PLAYPAUSE_TEXT "FF"
@ -294,11 +243,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_BACK
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_MENU
#define SNAKE2_PLAYPAUSE BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -308,11 +252,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_MENU
#define SNAKE2_PLAYPAUSE BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -322,11 +261,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_RC_VOL_UP
#define SNAKE2_DOWN BUTTON_RC_VOL_DOWN
#define SNAKE2_QUIT BUTTON_RC_REC
#define SNAKE2_LEVEL_UP BUTTON_RC_VOL_UP
#define SNAKE2_LEVEL_DOWN BUTTON_RC_VOL_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RC_FF
#define SNAKE2_MAZE_LAST BUTTON_RC_REW
#define SNAKE2_SELECT_TYPE BUTTON_RC_MODE
#define SNAKE2_PLAYPAUSE BUTTON_RC_PLAY
#define SNAKE2_PLAYPAUSE_TEXT "Play"
@ -339,11 +273,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_BACK
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_MENU
#define SNAKE2_PLAYPAUSE BUTTON_PLAY
#define SNAKE2_PLAYPAUSE_TEXT "Play"
@ -353,11 +282,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER
#define SNAKE2_LEVEL_UP BUTTON_UP
#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
#define SNAKE2_MAZE_LAST BUTTON_LEFT
#define SNAKE2_SELECT_TYPE BUTTON_MENU
#define SNAKE2_PLAYPAUSE BUTTON_VIEW
#define SNAKE2_PLAYPAUSE_TEXT "View"
@ -370,13 +294,8 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_REC
#define SNAKE2_LEVEL_UP (BUTTON_FFWD|BUTTON_UP)
#define SNAKE2_LEVEL_DOWN (BUTTON_FFWD|BUTTON_DOWN)
#define SNAKE2_MAZE_NEXT (BUTTON_REW|BUTTON_RIGHT)
#define SNAKE2_MAZE_LAST (BUTTON_REW|BUTTON_LEFT)
#define SNAKE2_SELECT_TYPE (BUTTON_PLAY|BUTTON_LEFT)
#define SNAKE2_PLAYPAUSE (BUTTON_PLAY|BUTTON_RIGHT)
#define SNAKE2_PLAYPAUSE_TEXT "Play + Right"
#define SNAKE2_PLAYPAUSE BUTTON_PLAY
#define SNAKE2_PLAYPAUSE_TEXT "Play"
#else
#error No keymap defined!
@ -398,24 +317,6 @@ PLUGIN_HEADER
#ifndef SNAKE2_QUIT
#define SNAKE2_QUIT BUTTON_TOPLEFT
#endif
#ifndef SNAKE2_LEVEL_UP
#define SNAKE2_LEVEL_UP BUTTON_TOPRIGHT
#endif
#ifndef SNAKE2_LEVEL_DOWN
#define SNAKE2_LEVEL_DOWN BUTTON_TOPLEFT
#endif
#ifndef SNAKE2_MAZE_NEXT
#define SNAKE2_MAZE_NEXT BUTTON_TOPMIDDLE
#endif
#ifndef SNAKE2_MAZE_LAST
#define SNAKE2_MAZE_LAST BUTTON_BOTTOMMIDDLE
#endif
#ifndef SNAKE2_SELECT_TYPE
#define SNAKE2_SELECT_TYPE BUTTON_BOTTOMLEFT
#endif
#ifndef SNAKE2_PLAYPAUSE
#define SNAKE2_PLAYPAUSE BUTTON_CENTER
#endif
#ifndef SNAKE2_PLAYPAUSE_TEXT
#define SNAKE2_PLAYPAUSE_TEXT "CENTER"
#endif
@ -431,10 +332,9 @@ static int board[WIDTH][HEIGHT];
single frame
*/
static int ardirectionbuffer[2];
static unsigned int score, hiscore = 0;
static int score;
static int applex;
static int appley;
static int strwdt,strhgt; /*used for string width, height for orientation purposes*/
static int dir;
static int frames;
static int apple;
@ -447,7 +347,12 @@ static int num_apples_to_get=1;
static int num_apples_to_got=0;
static int game_b_level=0;
static int applecount=0;
static char phscore[30];
/* used for string width, height for orientation purposes */
static int strwdt, strhgt;
static char strbuf[32];
#define NUM_SCORES 5
static struct highscore highscores[NUM_SCORES];
#define NORTH 1
#define EAST 2
@ -465,8 +370,8 @@ static char phscore[30];
#define SOUTH_EAST 2048
#define SOUTH_WEST 4096
#define LEVELS_FILE PLUGIN_GAMES_DIR "/snake2.levels"
#define HISCORE_FILE PLUGIN_GAMES_DIR "/snake2.hs"
#define LEVELS_FILE PLUGIN_GAMES_DIR "/snake2.levels"
#define SCORE_FILE PLUGIN_GAMES_DIR "/snake2.score"
int load_all_levels(void)
{
@ -489,7 +394,7 @@ int load_all_levels(void)
return -1;
}
while(rb->read_line(fd, buf, 64))
while(rb->read_line(fd, buf, 64) > 0)
{
if(rb->strlen(buf) == 0) /* Separator? */
{
@ -514,36 +419,9 @@ int load_all_levels(void)
return 0;
}
/*Hi-Score reading and writing to file "/.rockbox/rocks/games/snake2.levels" function */
void iohiscore(void)
{
int fd;
unsigned int compare;
/* clear the buffer we're about to load the highscore data into */
rb->memset(phscore, 0, sizeof(phscore));
fd = rb->open(HISCORE_FILE,O_RDWR | O_CREAT);
/* highscore used to %d, is now %d\n
Deal with no file or bad file */
rb->read(fd,phscore, sizeof(phscore));
compare = rb->atoi(phscore);
if(hiscore > compare){
rb->lseek(fd,0,SEEK_SET);
rb->fdprintf(fd, "%d\n", hiscore);
}
else
hiscore = compare;
rb->close(fd);
}
/*
** Completely clear the board of walls and/or snake */
** Completely clear the board of walls and/or snake
*/
void clear_board( void)
{
@ -853,6 +731,13 @@ void redraw (void)
{
int x,y;
#ifdef HAVE_LCD_COLOR
rb->lcd_set_foreground(LCD_BLACK);
rb->lcd_set_background(LCD_WHITE);
#endif
rb->lcd_clear_display();
for (x = 0; x < WIDTH; x++)
{
for (y = 0; y < HEIGHT; y++)
@ -977,7 +862,6 @@ void die (void)
{
int button;
bool done=false;
char pscore[20];
rb->splash(HZ*2, "Oops!");
@ -988,26 +872,26 @@ void die (void)
rb->lcd_getstringsize("You died!",&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt,"You died!");
rb->snprintf(pscore,sizeof(pscore),"Your score: %d",score);
rb->lcd_getstringsize(pscore,&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 2 + 2,pscore);
rb->snprintf(strbuf, sizeof(strbuf), "Your score: %d", score);
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2, strhgt * 2 + 2, strbuf);
if (score>hiscore)
if (highscore_update(score, level_from_file, game_type==0?"Type A":"Type B",
highscores, NUM_SCORES) == 0)
{
hiscore=score;
rb->lcd_getstringsize("New high score!",&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 4 + 2,"New high score!");
}
else
{
rb->snprintf(phscore,sizeof(phscore),"High score: %d",hiscore);
rb->lcd_getstringsize(phscore,&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 5,phscore);
rb->snprintf(strbuf, sizeof(strbuf), "High score: %d", highscores[0].score);
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2, strhgt * 5, strbuf);
}
rb->snprintf(phscore,sizeof(phscore),"Press %s...",SNAKE2_PLAYPAUSE_TEXT);
rb->lcd_getstringsize(phscore,&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 7,phscore);
rb->snprintf(strbuf, sizeof(strbuf), "Press %s...", SNAKE2_PLAYPAUSE_TEXT);
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2, strhgt * 7, strbuf);
rb->lcd_update();
@ -1060,9 +944,7 @@ void collision ( int x, int y )
game_b_level++;
}
rb->splash(HZ, "Level Completed!");
rb->lcd_clear_display();
new_level(level_from_file);
rb->lcd_clear_display();
redraw();
rb->lcd_update();
}
@ -1237,19 +1119,18 @@ void game_pause (void)
switch (button)
{
case SNAKE2_PLAYPAUSE:
rb->lcd_clear_display();
redraw();
rb->lcd_update();
rb->sleep(HZ/2);
return;
#ifdef SNAKE2_RC_QUIT
case SNAKE2_RC_QUIT:
case SNAKE2_RC_QUIT:
#endif
case SNAKE2_QUIT:
dead = 1;
quit = 1;
return;
case SNAKE2_QUIT:
dead = 1;
quit = 1;
return;
default:
if (rb->default_event_handler(button)==SYS_USB_CONNECTED) {
@ -1266,7 +1147,6 @@ void game (void)
{
int button;
rb->lcd_clear_display();
redraw();
rb->lcd_update();
/*main loop:*/
@ -1274,8 +1154,8 @@ void game (void)
{
if(frames==5)
{
frame();
if(frames>0) frames=0;
frame();
if(frames > 0) frames = 0;
}
frames++;
@ -1305,66 +1185,59 @@ void game (void)
#ifdef HAS_BUTTON_HOLD
if (rb->button_hold())
button = SNAKE2_PLAYPAUSE;
button = SNAKE2_PLAYPAUSE;
#endif
switch (button)
{
case SNAKE2_UP:
case SNAKE2_UP | BUTTON_REPEAT:
if (dir != SOUTH) set_direction(NORTH);
break;
case SNAKE2_UP:
case SNAKE2_UP | BUTTON_REPEAT:
if (dir != SOUTH) set_direction(NORTH);
break;
case SNAKE2_RIGHT:
case SNAKE2_RIGHT | BUTTON_REPEAT:
if (dir != WEST) set_direction(EAST);
break;
case SNAKE2_RIGHT:
case SNAKE2_RIGHT | BUTTON_REPEAT:
if (dir != WEST) set_direction(EAST);
break;
case SNAKE2_DOWN:
case SNAKE2_DOWN | BUTTON_REPEAT:
if (dir != NORTH) set_direction(SOUTH);
break;
case SNAKE2_DOWN:
case SNAKE2_DOWN | BUTTON_REPEAT:
if (dir != NORTH) set_direction(SOUTH);
break;
case SNAKE2_LEFT:
case SNAKE2_LEFT | BUTTON_REPEAT:
if (dir != EAST) set_direction(WEST);
break;
case SNAKE2_LEFT:
case SNAKE2_LEFT | BUTTON_REPEAT:
if (dir != EAST) set_direction(WEST);
break;
#ifdef SNAKE2_RC_QUIT
case SNAKE2_RC_QUIT:
case SNAKE2_RC_QUIT:
#endif
case SNAKE2_QUIT:
dead=1;
return;
case SNAKE2_QUIT:
dead=1;
return;
case SNAKE2_PLAYPAUSE:
game_pause();
break;
case SNAKE2_PLAYPAUSE:
game_pause();
break;
default:
if (rb->default_event_handler(button)==SYS_USB_CONNECTED) {
quit = 2;
return;
}
break;
default:
if (rb->default_event_handler(button)==SYS_USB_CONNECTED) {
quit = 2;
return;
}
break;
}
}
}
void game_init(void)
void select_maze(void)
{
int button;
char plevel[30];
dead=0;
apple=0;
score=0;
applecount=0;
clear_board();
load_level( level_from_file );
rb->lcd_clear_display();
redraw();
rb->lcd_update();
@ -1377,81 +1250,40 @@ void game_init(void)
rb->lcd_bitmap(snake2_right,LCD_WIDTH-BMPWIDTH_snake2_right,BMPHEIGHT_snake2_header,BMPWIDTH_snake2_right, BMPHEIGHT_snake2_right);
rb->lcd_bitmap(snake2_bottom,0,BMPHEIGHT_snake2_header+BMPHEIGHT_snake2_left,BMPWIDTH_snake2_bottom, BMPHEIGHT_snake2_bottom);
rb->snprintf(plevel,sizeof(plevel),"%d",level);
rb->lcd_getstringsize(plevel,&strwdt,&strhgt);
rb->lcd_putsxy(TOP_X3-strwdt/2,TOP_Y2, plevel);
rb->snprintf(strbuf, sizeof(strbuf), "%d", level);
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy(TOP_X3 - strwdt/2, TOP_Y2, strbuf);
rb->snprintf(plevel,sizeof(plevel),"%d",level_from_file);
rb->lcd_getstringsize(plevel,&strwdt,&strhgt);
rb->lcd_putsxy(TOP_X2-strwdt/2,TOP_Y1, plevel);
rb->snprintf(strbuf, sizeof(strbuf), "%d", level_from_file);
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy(TOP_X2 - strwdt/2, TOP_Y1, strbuf);
if(game_type==0){
rb->lcd_getstringsize("A",&strwdt,&strhgt);
rb->lcd_putsxy(TOP_X1,TOP_Y1,"A");
}
else{
rb->lcd_getstringsize("B",&strwdt,&strhgt);
rb->lcd_putsxy(TOP_X1,TOP_Y1,"B");
}
rb->strcpy(strbuf, game_type==0? "A": "B");
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy(TOP_X1, TOP_Y1, strbuf);
rb->snprintf(phscore,sizeof(phscore),"%d",hiscore);
rb->lcd_getstringsize(phscore,&strwdt,&strhgt);
rb->lcd_putsxy(TOP_X4-strwdt/2,TOP_Y2, phscore);
rb->snprintf(strbuf, sizeof(strbuf), "%d", highscores[0].score);
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy(TOP_X4 - strwdt/2, TOP_Y2, strbuf);
#else
rb->snprintf(plevel,sizeof(plevel),"Speed: %02d",level);
rb->lcd_getstringsize("Speed: 00",&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt+4, plevel);
rb->snprintf(plevel,sizeof(plevel),"Maze: %d",level_from_file);
rb->lcd_getstringsize(plevel,&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt*2+4, plevel);
if(game_type==0){
rb->lcd_getstringsize("Game Type: A ",&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt*3+4,"Game Type: A");
}
else{
rb->lcd_getstringsize("Game Type: B ",&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt*3+4,"Game Type: B");
}
rb->snprintf(phscore,sizeof(phscore),"Hi Score: %d",hiscore);
rb->lcd_getstringsize(phscore,&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt*4+4, phscore);
rb->snprintf(strbuf, sizeof(strbuf), "Maze: %d", level_from_file);
rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy((WIDTH*MULTIPLIER - strwdt)/2,
(HEIGHT*MULTIPLIER - strhgt)/2, strbuf);
#endif
rb->lcd_update();
button=rb->button_get(true);
button = rb->button_get(true);
switch (button)
{
case SNAKE2_LEVEL_UP:
case SNAKE2_LEVEL_UP|BUTTON_REPEAT:
if (level<10)
level+=1;
break;
case SNAKE2_LEVEL_DOWN:
case SNAKE2_LEVEL_DOWN|BUTTON_REPEAT:
if (level>1)
level-=1;
break;
case SNAKE2_QUIT:
quit=1;
return;
break;
case SNAKE2_PLAYPAUSE:
speed = level*20;
return;
break;
case SNAKE2_SELECT_TYPE:
if(game_type==0)game_type=1; else game_type=0;
break;
case SNAKE2_MAZE_NEXT:
rb->lcd_set_drawmode(DRMODE_BG|DRMODE_INVERSEVID);
rb->lcd_fillrect(CENTER_X, CENTER_Y, CENTER_X+WIDTH*MULTIPLIER,
CENTER_Y+HEIGHT*MULTIPLIER);
rb->lcd_set_drawmode(DRMODE_SOLID);
case SNAKE2_UP:
case SNAKE2_RIGHT:
if(level_from_file < num_levels)
level_from_file++;
else
@ -1459,12 +1291,8 @@ void game_init(void)
load_level( level_from_file );
redraw();
break;
#ifdef SNAKE2_MAZE_LAST
case SNAKE2_MAZE_LAST:
rb->lcd_set_drawmode(DRMODE_BG|DRMODE_INVERSEVID);
rb->lcd_fillrect(CENTER_X, CENTER_Y, CENTER_X+WIDTH*MULTIPLIER,
CENTER_Y+HEIGHT*MULTIPLIER);
rb->lcd_set_drawmode(DRMODE_SOLID);
case SNAKE2_DOWN:
case SNAKE2_LEFT:
if(level_from_file > 0)
level_from_file--;
else
@ -1472,7 +1300,6 @@ void game_init(void)
load_level( level_from_file );
redraw();
break;
#endif
default:
if (rb->default_event_handler(button)==SYS_USB_CONNECTED) {
quit = 2;
@ -1484,6 +1311,63 @@ void game_init(void)
}
void game_init(void)
{
int selection = 0;
static const struct opt_items type_options[] = {
{ "Type A", -1 },
{ "Type B", -1 },
};
MENUITEM_STRINGLIST(menu, "Snake2 Menu", NULL,
"Start New Game",
"Game Type", "Select Maze", "Speed",
"High Scores",
"Playback Control", "Quit");
rb->button_clear_queue();
dead = 0;
apple = 0;
score = 0;
applecount = 0;
while (1) {
switch (rb->do_menu(&menu, &selection, NULL, false)) {
case 0:
speed = level*20;
return;
case 1:
rb->set_option("Game Type", &game_type, INT,
type_options, 2, NULL);
break;
case 2:
select_maze();
if(quit) return;
break;
case 3:
rb->set_int("Speed", "", UNIT_INT, &level,
NULL, 1, 1, 10, NULL);
break;
case 4:
highscore_show(NUM_SCORES, highscores, NUM_SCORES, true);
break;
case 5:
playback_control(NULL);
break;
case 6:
quit = 1;
return;
case MENU_ATTACHED_USB:
quit = 2;
return;
default:
break;
}
}
}
enum plugin_status plugin_start(const void* parameter)
{
(void)(parameter);
@ -1493,10 +1377,6 @@ enum plugin_status plugin_start(const void* parameter)
#if LCD_DEPTH > 1
rb->lcd_set_backdrop(NULL);
#endif
#ifdef HAVE_LCD_COLOR
rb->lcd_set_foreground(LCD_BLACK);
rb->lcd_set_background(LCD_WHITE);
#endif
load_all_levels();
@ -1505,24 +1385,25 @@ enum plugin_status plugin_start(const void* parameter)
return PLUGIN_OK;
}
iohiscore();
highscore_load(SCORE_FILE, highscores, NUM_SCORES);
while(quit==0)
{
game_init();
rb->lcd_clear_display();
frames=1;
game_init();
if(quit)
break;
if(quit==0)
{
init_snake();
rb->lcd_clear_display();
frames=1;
/*Start Game:*/
game();
}
init_snake();
/*Start Game:*/
game();
}
iohiscore();
highscore_save(SCORE_FILE, highscores, NUM_SCORES);
return (quit==1) ? PLUGIN_OK : PLUGIN_USB_CONNECTED;
}