1
0
Fork 0
forked from len0rd/rockbox

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" #include "plugin.h"
#ifdef HAVE_LCD_BITMAP #ifdef HAVE_LCD_BITMAP
#include "lib/highscore.h"
#include "lib/playback_control.h"
PLUGIN_HEADER PLUGIN_HEADER
#define WIDTH 28 #define WIDTH 28
#define HEIGHT 16 #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_header1.h"
#include "pluginbitmaps/snake2_header2.h" #include "pluginbitmaps/snake2_header2.h"
#include "pluginbitmaps/snake2_left.h" #include "pluginbitmaps/snake2_left.h"
@ -135,11 +137,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_OFF #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 BUTTON_PLAY
#define SNAKE2_PLAYPAUSE_TEXT "Play" #define SNAKE2_PLAYPAUSE_TEXT "Play"
@ -149,11 +146,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_OFF #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 BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select" #define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -163,10 +155,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_OFF #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 BUTTON_MENU
#define SNAKE2_PLAYPAUSE_TEXT "Menu" #define SNAKE2_PLAYPAUSE_TEXT "Menu"
@ -177,15 +165,11 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_OFF #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 BUTTON_ON
#define SNAKE2_PLAYPAUSE_TEXT "Play" #define SNAKE2_PLAYPAUSE_TEXT "Play"
#define SNAKE2_RC_QUIT BUTTON_RC_STOP #define SNAKE2_RC_QUIT BUTTON_RC_STOP
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
(CONFIG_KEYPAD == IPOD_3G_PAD) || \ (CONFIG_KEYPAD == IPOD_3G_PAD) || \
(CONFIG_KEYPAD == IPOD_1G2G_PAD) (CONFIG_KEYPAD == IPOD_1G2G_PAD)
@ -194,11 +178,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_MENU #define SNAKE2_UP BUTTON_MENU
#define SNAKE2_DOWN BUTTON_PLAY #define SNAKE2_DOWN BUTTON_PLAY
#define SNAKE2_QUIT (BUTTON_SELECT | BUTTON_MENU) #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 BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select" #define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -208,11 +187,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER #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 BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select" #define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -222,11 +196,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER #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 BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select" #define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -237,11 +206,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER #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 BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select" #define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -252,11 +216,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER #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 BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select" #define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -266,11 +225,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT (BUTTON_HOME|BUTTON_REPEAT) #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 BUTTON_SELECT|BUTTON_REPEAT
#define SNAKE2_PLAYPAUSE_TEXT "Hold Select" #define SNAKE2_PLAYPAUSE_TEXT "Hold Select"
@ -280,11 +234,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_SCROLL_UP #define SNAKE2_UP BUTTON_SCROLL_UP
#define SNAKE2_DOWN BUTTON_SCROLL_DOWN #define SNAKE2_DOWN BUTTON_SCROLL_DOWN
#define SNAKE2_QUIT BUTTON_POWER #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 BUTTON_FF
#define SNAKE2_PLAYPAUSE_TEXT "FF" #define SNAKE2_PLAYPAUSE_TEXT "FF"
@ -294,11 +243,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_BACK #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 BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select" #define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -308,11 +252,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER #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 BUTTON_SELECT
#define SNAKE2_PLAYPAUSE_TEXT "Select" #define SNAKE2_PLAYPAUSE_TEXT "Select"
@ -322,11 +261,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_RC_VOL_UP #define SNAKE2_UP BUTTON_RC_VOL_UP
#define SNAKE2_DOWN BUTTON_RC_VOL_DOWN #define SNAKE2_DOWN BUTTON_RC_VOL_DOWN
#define SNAKE2_QUIT BUTTON_RC_REC #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 BUTTON_RC_PLAY
#define SNAKE2_PLAYPAUSE_TEXT "Play" #define SNAKE2_PLAYPAUSE_TEXT "Play"
@ -339,11 +273,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_BACK #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 BUTTON_PLAY
#define SNAKE2_PLAYPAUSE_TEXT "Play" #define SNAKE2_PLAYPAUSE_TEXT "Play"
@ -353,11 +282,6 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_POWER #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 BUTTON_VIEW
#define SNAKE2_PLAYPAUSE_TEXT "View" #define SNAKE2_PLAYPAUSE_TEXT "View"
@ -370,13 +294,8 @@ PLUGIN_HEADER
#define SNAKE2_UP BUTTON_UP #define SNAKE2_UP BUTTON_UP
#define SNAKE2_DOWN BUTTON_DOWN #define SNAKE2_DOWN BUTTON_DOWN
#define SNAKE2_QUIT BUTTON_REC #define SNAKE2_QUIT BUTTON_REC
#define SNAKE2_LEVEL_UP (BUTTON_FFWD|BUTTON_UP) #define SNAKE2_PLAYPAUSE BUTTON_PLAY
#define SNAKE2_LEVEL_DOWN (BUTTON_FFWD|BUTTON_DOWN) #define SNAKE2_PLAYPAUSE_TEXT "Play"
#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"
#else #else
#error No keymap defined! #error No keymap defined!
@ -398,24 +317,6 @@ PLUGIN_HEADER
#ifndef SNAKE2_QUIT #ifndef SNAKE2_QUIT
#define SNAKE2_QUIT BUTTON_TOPLEFT #define SNAKE2_QUIT BUTTON_TOPLEFT
#endif #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 #ifndef SNAKE2_PLAYPAUSE_TEXT
#define SNAKE2_PLAYPAUSE_TEXT "CENTER" #define SNAKE2_PLAYPAUSE_TEXT "CENTER"
#endif #endif
@ -431,10 +332,9 @@ static int board[WIDTH][HEIGHT];
single frame single frame
*/ */
static int ardirectionbuffer[2]; static int ardirectionbuffer[2];
static unsigned int score, hiscore = 0; static int score;
static int applex; static int applex;
static int appley; static int appley;
static int strwdt,strhgt; /*used for string width, height for orientation purposes*/
static int dir; static int dir;
static int frames; static int frames;
static int apple; static int apple;
@ -447,7 +347,12 @@ static int num_apples_to_get=1;
static int num_apples_to_got=0; static int num_apples_to_got=0;
static int game_b_level=0; static int game_b_level=0;
static int applecount=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 NORTH 1
#define EAST 2 #define EAST 2
@ -465,8 +370,8 @@ static char phscore[30];
#define SOUTH_EAST 2048 #define SOUTH_EAST 2048
#define SOUTH_WEST 4096 #define SOUTH_WEST 4096
#define LEVELS_FILE PLUGIN_GAMES_DIR "/snake2.levels" #define LEVELS_FILE PLUGIN_GAMES_DIR "/snake2.levels"
#define HISCORE_FILE PLUGIN_GAMES_DIR "/snake2.hs" #define SCORE_FILE PLUGIN_GAMES_DIR "/snake2.score"
int load_all_levels(void) int load_all_levels(void)
{ {
@ -489,7 +394,7 @@ int load_all_levels(void)
return -1; return -1;
} }
while(rb->read_line(fd, buf, 64)) while(rb->read_line(fd, buf, 64) > 0)
{ {
if(rb->strlen(buf) == 0) /* Separator? */ if(rb->strlen(buf) == 0) /* Separator? */
{ {
@ -514,36 +419,9 @@ int load_all_levels(void)
return 0; 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) void clear_board( void)
{ {
@ -853,6 +731,13 @@ void redraw (void)
{ {
int x,y; 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 (x = 0; x < WIDTH; x++)
{ {
for (y = 0; y < HEIGHT; y++) for (y = 0; y < HEIGHT; y++)
@ -977,7 +862,6 @@ void die (void)
{ {
int button; int button;
bool done=false; bool done=false;
char pscore[20];
rb->splash(HZ*2, "Oops!"); rb->splash(HZ*2, "Oops!");
@ -988,26 +872,26 @@ void die (void)
rb->lcd_getstringsize("You died!",&strwdt,&strhgt); rb->lcd_getstringsize("You died!",&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt,"You died!"); rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt,"You died!");
rb->snprintf(pscore,sizeof(pscore),"Your score: %d",score); rb->snprintf(strbuf, sizeof(strbuf), "Your score: %d", score);
rb->lcd_getstringsize(pscore,&strwdt,&strhgt); rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 2 + 2,pscore); 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_getstringsize("New high score!",&strwdt,&strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 4 + 2,"New high score!"); rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 4 + 2,"New high score!");
} }
else else
{ {
rb->snprintf(phscore,sizeof(phscore),"High score: %d",hiscore); rb->snprintf(strbuf, sizeof(strbuf), "High score: %d", highscores[0].score);
rb->lcd_getstringsize(phscore,&strwdt,&strhgt); rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 5,phscore); rb->lcd_putsxy((LCD_WIDTH - strwdt)/2, strhgt * 5, strbuf);
} }
rb->snprintf(phscore,sizeof(phscore),"Press %s...",SNAKE2_PLAYPAUSE_TEXT); rb->snprintf(strbuf, sizeof(strbuf), "Press %s...", SNAKE2_PLAYPAUSE_TEXT);
rb->lcd_getstringsize(phscore,&strwdt,&strhgt); rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 7,phscore); rb->lcd_putsxy((LCD_WIDTH - strwdt)/2, strhgt * 7, strbuf);
rb->lcd_update(); rb->lcd_update();
@ -1060,9 +944,7 @@ void collision ( int x, int y )
game_b_level++; game_b_level++;
} }
rb->splash(HZ, "Level Completed!"); rb->splash(HZ, "Level Completed!");
rb->lcd_clear_display();
new_level(level_from_file); new_level(level_from_file);
rb->lcd_clear_display();
redraw(); redraw();
rb->lcd_update(); rb->lcd_update();
} }
@ -1237,19 +1119,18 @@ void game_pause (void)
switch (button) switch (button)
{ {
case SNAKE2_PLAYPAUSE: case SNAKE2_PLAYPAUSE:
rb->lcd_clear_display();
redraw(); redraw();
rb->lcd_update(); rb->lcd_update();
rb->sleep(HZ/2); rb->sleep(HZ/2);
return; return;
#ifdef SNAKE2_RC_QUIT #ifdef SNAKE2_RC_QUIT
case SNAKE2_RC_QUIT: case SNAKE2_RC_QUIT:
#endif #endif
case SNAKE2_QUIT: case SNAKE2_QUIT:
dead = 1; dead = 1;
quit = 1; quit = 1;
return; return;
default: default:
if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { if (rb->default_event_handler(button)==SYS_USB_CONNECTED) {
@ -1266,7 +1147,6 @@ void game (void)
{ {
int button; int button;
rb->lcd_clear_display();
redraw(); redraw();
rb->lcd_update(); rb->lcd_update();
/*main loop:*/ /*main loop:*/
@ -1274,8 +1154,8 @@ void game (void)
{ {
if(frames==5) if(frames==5)
{ {
frame(); frame();
if(frames>0) frames=0; if(frames > 0) frames = 0;
} }
frames++; frames++;
@ -1305,66 +1185,59 @@ void game (void)
#ifdef HAS_BUTTON_HOLD #ifdef HAS_BUTTON_HOLD
if (rb->button_hold()) if (rb->button_hold())
button = SNAKE2_PLAYPAUSE; button = SNAKE2_PLAYPAUSE;
#endif #endif
switch (button) switch (button)
{ {
case SNAKE2_UP: case SNAKE2_UP:
case SNAKE2_UP | BUTTON_REPEAT: case SNAKE2_UP | BUTTON_REPEAT:
if (dir != SOUTH) set_direction(NORTH); if (dir != SOUTH) set_direction(NORTH);
break; break;
case SNAKE2_RIGHT: case SNAKE2_RIGHT:
case SNAKE2_RIGHT | BUTTON_REPEAT: case SNAKE2_RIGHT | BUTTON_REPEAT:
if (dir != WEST) set_direction(EAST); if (dir != WEST) set_direction(EAST);
break; break;
case SNAKE2_DOWN: case SNAKE2_DOWN:
case SNAKE2_DOWN | BUTTON_REPEAT: case SNAKE2_DOWN | BUTTON_REPEAT:
if (dir != NORTH) set_direction(SOUTH); if (dir != NORTH) set_direction(SOUTH);
break; break;
case SNAKE2_LEFT: case SNAKE2_LEFT:
case SNAKE2_LEFT | BUTTON_REPEAT: case SNAKE2_LEFT | BUTTON_REPEAT:
if (dir != EAST) set_direction(WEST); if (dir != EAST) set_direction(WEST);
break; break;
#ifdef SNAKE2_RC_QUIT #ifdef SNAKE2_RC_QUIT
case SNAKE2_RC_QUIT: case SNAKE2_RC_QUIT:
#endif #endif
case SNAKE2_QUIT: case SNAKE2_QUIT:
dead=1; dead=1;
return; return;
case SNAKE2_PLAYPAUSE: case SNAKE2_PLAYPAUSE:
game_pause(); game_pause();
break; break;
default: default:
if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { if (rb->default_event_handler(button)==SYS_USB_CONNECTED) {
quit = 2; quit = 2;
return; return;
} }
break; break;
} }
} }
} }
void game_init(void) void select_maze(void)
{ {
int button; int button;
char plevel[30];
dead=0;
apple=0;
score=0;
applecount=0;
clear_board(); clear_board();
load_level( level_from_file ); load_level( level_from_file );
rb->lcd_clear_display();
redraw(); redraw();
rb->lcd_update(); 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_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->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->snprintf(strbuf, sizeof(strbuf), "%d", level);
rb->lcd_getstringsize(plevel,&strwdt,&strhgt); rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy(TOP_X3-strwdt/2,TOP_Y2, plevel); rb->lcd_putsxy(TOP_X3 - strwdt/2, TOP_Y2, strbuf);
rb->snprintf(plevel,sizeof(plevel),"%d",level_from_file); rb->snprintf(strbuf, sizeof(strbuf), "%d", level_from_file);
rb->lcd_getstringsize(plevel,&strwdt,&strhgt); rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy(TOP_X2-strwdt/2,TOP_Y1, plevel); rb->lcd_putsxy(TOP_X2 - strwdt/2, TOP_Y1, strbuf);
if(game_type==0){ rb->strcpy(strbuf, game_type==0? "A": "B");
rb->lcd_getstringsize("A",&strwdt,&strhgt); rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy(TOP_X1,TOP_Y1,"A"); rb->lcd_putsxy(TOP_X1, TOP_Y1, strbuf);
}
else{
rb->lcd_getstringsize("B",&strwdt,&strhgt);
rb->lcd_putsxy(TOP_X1,TOP_Y1,"B");
}
rb->snprintf(phscore,sizeof(phscore),"%d",hiscore); rb->snprintf(strbuf, sizeof(strbuf), "%d", highscores[0].score);
rb->lcd_getstringsize(phscore,&strwdt,&strhgt); rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy(TOP_X4-strwdt/2,TOP_Y2, phscore); rb->lcd_putsxy(TOP_X4 - strwdt/2, TOP_Y2, strbuf);
#else #else
rb->snprintf(plevel,sizeof(plevel),"Speed: %02d",level); rb->snprintf(strbuf, sizeof(strbuf), "Maze: %d", level_from_file);
rb->lcd_getstringsize("Speed: 00",&strwdt,&strhgt); rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt+4, plevel); rb->lcd_putsxy((WIDTH*MULTIPLIER - strwdt)/2,
(HEIGHT*MULTIPLIER - strhgt)/2, strbuf);
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);
#endif #endif
rb->lcd_update(); rb->lcd_update();
button=rb->button_get(true); button = rb->button_get(true);
switch (button) 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: case SNAKE2_QUIT:
quit=1;
return;
break;
case SNAKE2_PLAYPAUSE: case SNAKE2_PLAYPAUSE:
speed = level*20;
return; return;
break; break;
case SNAKE2_SELECT_TYPE: case SNAKE2_UP:
if(game_type==0)game_type=1; else game_type=0; case SNAKE2_RIGHT:
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);
if(level_from_file < num_levels) if(level_from_file < num_levels)
level_from_file++; level_from_file++;
else else
@ -1459,12 +1291,8 @@ void game_init(void)
load_level( level_from_file ); load_level( level_from_file );
redraw(); redraw();
break; break;
#ifdef SNAKE2_MAZE_LAST case SNAKE2_DOWN:
case SNAKE2_MAZE_LAST: case SNAKE2_LEFT:
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);
if(level_from_file > 0) if(level_from_file > 0)
level_from_file--; level_from_file--;
else else
@ -1472,7 +1300,6 @@ void game_init(void)
load_level( level_from_file ); load_level( level_from_file );
redraw(); redraw();
break; break;
#endif
default: default:
if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { if (rb->default_event_handler(button)==SYS_USB_CONNECTED) {
quit = 2; 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) enum plugin_status plugin_start(const void* parameter)
{ {
(void)(parameter); (void)(parameter);
@ -1493,10 +1377,6 @@ enum plugin_status plugin_start(const void* parameter)
#if LCD_DEPTH > 1 #if LCD_DEPTH > 1
rb->lcd_set_backdrop(NULL); rb->lcd_set_backdrop(NULL);
#endif #endif
#ifdef HAVE_LCD_COLOR
rb->lcd_set_foreground(LCD_BLACK);
rb->lcd_set_background(LCD_WHITE);
#endif
load_all_levels(); load_all_levels();
@ -1505,24 +1385,25 @@ enum plugin_status plugin_start(const void* parameter)
return PLUGIN_OK; return PLUGIN_OK;
} }
iohiscore(); highscore_load(SCORE_FILE, highscores, NUM_SCORES);
while(quit==0) while(quit==0)
{ {
game_init(); game_init();
rb->lcd_clear_display(); if(quit)
frames=1; break;
if(quit==0) rb->lcd_clear_display();
{ frames=1;
init_snake();
/*Start Game:*/ init_snake();
game();
} /*Start Game:*/
game();
} }
iohiscore(); highscore_save(SCORE_FILE, highscores, NUM_SCORES);
return (quit==1) ? PLUGIN_OK : PLUGIN_USB_CONNECTED; return (quit==1) ? PLUGIN_OK : PLUGIN_USB_CONNECTED;
} }