summaryrefslogtreecommitdiff
path: root/apps/plugins/snake2.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/snake2.c')
-rw-r--r--apps/plugins/snake2.c459
1 files changed, 170 insertions, 289 deletions
diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c
index 5ca5e95912..bd54735e02 100644
--- a/apps/plugins/snake2.c
+++ b/apps/plugins/snake2.c
@@ -31,13 +31,15 @@ Head and Tail are stored
31 31
32#include "plugin.h" 32#include "plugin.h"
33#ifdef HAVE_LCD_BITMAP 33#ifdef HAVE_LCD_BITMAP
34#include "lib/highscore.h"
35#include "lib/playback_control.h"
34 36
35PLUGIN_HEADER 37PLUGIN_HEADER
36 38
37#define WIDTH 28 39#define WIDTH 28
38#define HEIGHT 16 40#define HEIGHT 16
39 41
40#if (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128) && (LCD_DEPTH >= 1) 42#if (LCD_WIDTH >= 160) && (LCD_HEIGHT >= 128)
41#include "pluginbitmaps/snake2_header1.h" 43#include "pluginbitmaps/snake2_header1.h"
42#include "pluginbitmaps/snake2_header2.h" 44#include "pluginbitmaps/snake2_header2.h"
43#include "pluginbitmaps/snake2_left.h" 45#include "pluginbitmaps/snake2_left.h"
@@ -135,11 +137,6 @@ PLUGIN_HEADER
135#define SNAKE2_UP BUTTON_UP 137#define SNAKE2_UP BUTTON_UP
136#define SNAKE2_DOWN BUTTON_DOWN 138#define SNAKE2_DOWN BUTTON_DOWN
137#define SNAKE2_QUIT BUTTON_OFF 139#define SNAKE2_QUIT BUTTON_OFF
138#define SNAKE2_LEVEL_UP BUTTON_UP
139#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
140#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
141#define SNAKE2_MAZE_LAST BUTTON_LEFT
142#define SNAKE2_SELECT_TYPE BUTTON_F3
143#define SNAKE2_PLAYPAUSE BUTTON_PLAY 140#define SNAKE2_PLAYPAUSE BUTTON_PLAY
144#define SNAKE2_PLAYPAUSE_TEXT "Play" 141#define SNAKE2_PLAYPAUSE_TEXT "Play"
145 142
@@ -149,11 +146,6 @@ PLUGIN_HEADER
149#define SNAKE2_UP BUTTON_UP 146#define SNAKE2_UP BUTTON_UP
150#define SNAKE2_DOWN BUTTON_DOWN 147#define SNAKE2_DOWN BUTTON_DOWN
151#define SNAKE2_QUIT BUTTON_OFF 148#define SNAKE2_QUIT BUTTON_OFF
152#define SNAKE2_LEVEL_UP BUTTON_UP
153#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
154#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
155#define SNAKE2_MAZE_LAST BUTTON_LEFT
156#define SNAKE2_SELECT_TYPE BUTTON_F3
157#define SNAKE2_PLAYPAUSE BUTTON_SELECT 149#define SNAKE2_PLAYPAUSE BUTTON_SELECT
158#define SNAKE2_PLAYPAUSE_TEXT "Select" 150#define SNAKE2_PLAYPAUSE_TEXT "Select"
159 151
@@ -163,10 +155,6 @@ PLUGIN_HEADER
163#define SNAKE2_UP BUTTON_UP 155#define SNAKE2_UP BUTTON_UP
164#define SNAKE2_DOWN BUTTON_DOWN 156#define SNAKE2_DOWN BUTTON_DOWN
165#define SNAKE2_QUIT BUTTON_OFF 157#define SNAKE2_QUIT BUTTON_OFF
166#define SNAKE2_LEVEL_UP BUTTON_UP
167#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
168#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
169#define SNAKE2_SELECT_TYPE BUTTON_LEFT
170#define SNAKE2_PLAYPAUSE BUTTON_MENU 158#define SNAKE2_PLAYPAUSE BUTTON_MENU
171#define SNAKE2_PLAYPAUSE_TEXT "Menu" 159#define SNAKE2_PLAYPAUSE_TEXT "Menu"
172 160
@@ -177,15 +165,11 @@ PLUGIN_HEADER
177#define SNAKE2_UP BUTTON_UP 165#define SNAKE2_UP BUTTON_UP
178#define SNAKE2_DOWN BUTTON_DOWN 166#define SNAKE2_DOWN BUTTON_DOWN
179#define SNAKE2_QUIT BUTTON_OFF 167#define SNAKE2_QUIT BUTTON_OFF
180#define SNAKE2_LEVEL_UP BUTTON_UP
181#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
182#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
183#define SNAKE2_MAZE_LAST BUTTON_LEFT
184#define SNAKE2_SELECT_TYPE BUTTON_MODE
185#define SNAKE2_PLAYPAUSE BUTTON_ON 168#define SNAKE2_PLAYPAUSE BUTTON_ON
186#define SNAKE2_PLAYPAUSE_TEXT "Play" 169#define SNAKE2_PLAYPAUSE_TEXT "Play"
187 170
188#define SNAKE2_RC_QUIT BUTTON_RC_STOP 171#define SNAKE2_RC_QUIT BUTTON_RC_STOP
172
189#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ 173#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
190 (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 174 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
191 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 175 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
@@ -194,11 +178,6 @@ PLUGIN_HEADER
194#define SNAKE2_UP BUTTON_MENU 178#define SNAKE2_UP BUTTON_MENU
195#define SNAKE2_DOWN BUTTON_PLAY 179#define SNAKE2_DOWN BUTTON_PLAY
196#define SNAKE2_QUIT (BUTTON_SELECT | BUTTON_MENU) 180#define SNAKE2_QUIT (BUTTON_SELECT | BUTTON_MENU)
197#define SNAKE2_LEVEL_UP BUTTON_SCROLL_FWD
198#define SNAKE2_LEVEL_DOWN BUTTON_SCROLL_BACK
199#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
200#define SNAKE2_MAZE_LAST BUTTON_LEFT
201#define SNAKE2_SELECT_TYPE BUTTON_PLAY
202#define SNAKE2_PLAYPAUSE BUTTON_SELECT 181#define SNAKE2_PLAYPAUSE BUTTON_SELECT
203#define SNAKE2_PLAYPAUSE_TEXT "Select" 182#define SNAKE2_PLAYPAUSE_TEXT "Select"
204 183
@@ -208,11 +187,6 @@ PLUGIN_HEADER
208#define SNAKE2_UP BUTTON_UP 187#define SNAKE2_UP BUTTON_UP
209#define SNAKE2_DOWN BUTTON_DOWN 188#define SNAKE2_DOWN BUTTON_DOWN
210#define SNAKE2_QUIT BUTTON_POWER 189#define SNAKE2_QUIT BUTTON_POWER
211#define SNAKE2_LEVEL_UP BUTTON_UP
212#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
213#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
214#define SNAKE2_MAZE_LAST BUTTON_LEFT
215#define SNAKE2_SELECT_TYPE BUTTON_PLAY
216#define SNAKE2_PLAYPAUSE BUTTON_SELECT 190#define SNAKE2_PLAYPAUSE BUTTON_SELECT
217#define SNAKE2_PLAYPAUSE_TEXT "Select" 191#define SNAKE2_PLAYPAUSE_TEXT "Select"
218 192
@@ -222,11 +196,6 @@ PLUGIN_HEADER
222#define SNAKE2_UP BUTTON_UP 196#define SNAKE2_UP BUTTON_UP
223#define SNAKE2_DOWN BUTTON_DOWN 197#define SNAKE2_DOWN BUTTON_DOWN
224#define SNAKE2_QUIT BUTTON_POWER 198#define SNAKE2_QUIT BUTTON_POWER
225#define SNAKE2_LEVEL_UP BUTTON_UP
226#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
227#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
228#define SNAKE2_MAZE_LAST BUTTON_LEFT
229#define SNAKE2_SELECT_TYPE BUTTON_MENU
230#define SNAKE2_PLAYPAUSE BUTTON_SELECT 199#define SNAKE2_PLAYPAUSE BUTTON_SELECT
231#define SNAKE2_PLAYPAUSE_TEXT "Select" 200#define SNAKE2_PLAYPAUSE_TEXT "Select"
232 201
@@ -237,11 +206,6 @@ PLUGIN_HEADER
237#define SNAKE2_UP BUTTON_UP 206#define SNAKE2_UP BUTTON_UP
238#define SNAKE2_DOWN BUTTON_DOWN 207#define SNAKE2_DOWN BUTTON_DOWN
239#define SNAKE2_QUIT BUTTON_POWER 208#define SNAKE2_QUIT BUTTON_POWER
240#define SNAKE2_LEVEL_UP BUTTON_UP
241#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
242#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
243#define SNAKE2_MAZE_LAST BUTTON_LEFT
244#define SNAKE2_SELECT_TYPE BUTTON_REC
245#define SNAKE2_PLAYPAUSE BUTTON_SELECT 209#define SNAKE2_PLAYPAUSE BUTTON_SELECT
246#define SNAKE2_PLAYPAUSE_TEXT "Select" 210#define SNAKE2_PLAYPAUSE_TEXT "Select"
247 211
@@ -252,11 +216,6 @@ PLUGIN_HEADER
252#define SNAKE2_UP BUTTON_UP 216#define SNAKE2_UP BUTTON_UP
253#define SNAKE2_DOWN BUTTON_DOWN 217#define SNAKE2_DOWN BUTTON_DOWN
254#define SNAKE2_QUIT BUTTON_POWER 218#define SNAKE2_QUIT BUTTON_POWER
255#define SNAKE2_LEVEL_UP BUTTON_UP
256#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
257#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
258#define SNAKE2_MAZE_LAST BUTTON_LEFT
259#define SNAKE2_SELECT_TYPE BUTTON_VOL_UP
260#define SNAKE2_PLAYPAUSE BUTTON_SELECT 219#define SNAKE2_PLAYPAUSE BUTTON_SELECT
261#define SNAKE2_PLAYPAUSE_TEXT "Select" 220#define SNAKE2_PLAYPAUSE_TEXT "Select"
262 221
@@ -266,11 +225,6 @@ PLUGIN_HEADER
266#define SNAKE2_UP BUTTON_UP 225#define SNAKE2_UP BUTTON_UP
267#define SNAKE2_DOWN BUTTON_DOWN 226#define SNAKE2_DOWN BUTTON_DOWN
268#define SNAKE2_QUIT (BUTTON_HOME|BUTTON_REPEAT) 227#define SNAKE2_QUIT (BUTTON_HOME|BUTTON_REPEAT)
269#define SNAKE2_LEVEL_UP BUTTON_UP
270#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
271#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
272#define SNAKE2_MAZE_LAST BUTTON_LEFT
273#define SNAKE2_SELECT_TYPE BUTTON_SELECT|BUTTON_REL
274#define SNAKE2_PLAYPAUSE BUTTON_SELECT|BUTTON_REPEAT 228#define SNAKE2_PLAYPAUSE BUTTON_SELECT|BUTTON_REPEAT
275#define SNAKE2_PLAYPAUSE_TEXT "Hold Select" 229#define SNAKE2_PLAYPAUSE_TEXT "Hold Select"
276 230
@@ -280,11 +234,6 @@ PLUGIN_HEADER
280#define SNAKE2_UP BUTTON_SCROLL_UP 234#define SNAKE2_UP BUTTON_SCROLL_UP
281#define SNAKE2_DOWN BUTTON_SCROLL_DOWN 235#define SNAKE2_DOWN BUTTON_SCROLL_DOWN
282#define SNAKE2_QUIT BUTTON_POWER 236#define SNAKE2_QUIT BUTTON_POWER
283#define SNAKE2_LEVEL_UP BUTTON_SCROLL_UP
284#define SNAKE2_LEVEL_DOWN BUTTON_SCROLL_DOWN
285#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
286#define SNAKE2_MAZE_LAST BUTTON_LEFT
287#define SNAKE2_SELECT_TYPE BUTTON_PLAY
288#define SNAKE2_PLAYPAUSE BUTTON_FF 237#define SNAKE2_PLAYPAUSE BUTTON_FF
289#define SNAKE2_PLAYPAUSE_TEXT "FF" 238#define SNAKE2_PLAYPAUSE_TEXT "FF"
290 239
@@ -294,11 +243,6 @@ PLUGIN_HEADER
294#define SNAKE2_UP BUTTON_UP 243#define SNAKE2_UP BUTTON_UP
295#define SNAKE2_DOWN BUTTON_DOWN 244#define SNAKE2_DOWN BUTTON_DOWN
296#define SNAKE2_QUIT BUTTON_BACK 245#define SNAKE2_QUIT BUTTON_BACK
297#define SNAKE2_LEVEL_UP BUTTON_UP
298#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
299#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
300#define SNAKE2_MAZE_LAST BUTTON_LEFT
301#define SNAKE2_SELECT_TYPE BUTTON_MENU
302#define SNAKE2_PLAYPAUSE BUTTON_SELECT 246#define SNAKE2_PLAYPAUSE BUTTON_SELECT
303#define SNAKE2_PLAYPAUSE_TEXT "Select" 247#define SNAKE2_PLAYPAUSE_TEXT "Select"
304 248
@@ -308,11 +252,6 @@ PLUGIN_HEADER
308#define SNAKE2_UP BUTTON_UP 252#define SNAKE2_UP BUTTON_UP
309#define SNAKE2_DOWN BUTTON_DOWN 253#define SNAKE2_DOWN BUTTON_DOWN
310#define SNAKE2_QUIT BUTTON_POWER 254#define SNAKE2_QUIT BUTTON_POWER
311#define SNAKE2_LEVEL_UP BUTTON_UP
312#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
313#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
314#define SNAKE2_MAZE_LAST BUTTON_LEFT
315#define SNAKE2_SELECT_TYPE BUTTON_MENU
316#define SNAKE2_PLAYPAUSE BUTTON_SELECT 255#define SNAKE2_PLAYPAUSE BUTTON_SELECT
317#define SNAKE2_PLAYPAUSE_TEXT "Select" 256#define SNAKE2_PLAYPAUSE_TEXT "Select"
318 257
@@ -322,11 +261,6 @@ PLUGIN_HEADER
322#define SNAKE2_UP BUTTON_RC_VOL_UP 261#define SNAKE2_UP BUTTON_RC_VOL_UP
323#define SNAKE2_DOWN BUTTON_RC_VOL_DOWN 262#define SNAKE2_DOWN BUTTON_RC_VOL_DOWN
324#define SNAKE2_QUIT BUTTON_RC_REC 263#define SNAKE2_QUIT BUTTON_RC_REC
325#define SNAKE2_LEVEL_UP BUTTON_RC_VOL_UP
326#define SNAKE2_LEVEL_DOWN BUTTON_RC_VOL_DOWN
327#define SNAKE2_MAZE_NEXT BUTTON_RC_FF
328#define SNAKE2_MAZE_LAST BUTTON_RC_REW
329#define SNAKE2_SELECT_TYPE BUTTON_RC_MODE
330#define SNAKE2_PLAYPAUSE BUTTON_RC_PLAY 264#define SNAKE2_PLAYPAUSE BUTTON_RC_PLAY
331#define SNAKE2_PLAYPAUSE_TEXT "Play" 265#define SNAKE2_PLAYPAUSE_TEXT "Play"
332 266
@@ -339,11 +273,6 @@ PLUGIN_HEADER
339#define SNAKE2_UP BUTTON_UP 273#define SNAKE2_UP BUTTON_UP
340#define SNAKE2_DOWN BUTTON_DOWN 274#define SNAKE2_DOWN BUTTON_DOWN
341#define SNAKE2_QUIT BUTTON_BACK 275#define SNAKE2_QUIT BUTTON_BACK
342#define SNAKE2_LEVEL_UP BUTTON_UP
343#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
344#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
345#define SNAKE2_MAZE_LAST BUTTON_LEFT
346#define SNAKE2_SELECT_TYPE BUTTON_MENU
347#define SNAKE2_PLAYPAUSE BUTTON_PLAY 276#define SNAKE2_PLAYPAUSE BUTTON_PLAY
348#define SNAKE2_PLAYPAUSE_TEXT "Play" 277#define SNAKE2_PLAYPAUSE_TEXT "Play"
349 278
@@ -353,11 +282,6 @@ PLUGIN_HEADER
353#define SNAKE2_UP BUTTON_UP 282#define SNAKE2_UP BUTTON_UP
354#define SNAKE2_DOWN BUTTON_DOWN 283#define SNAKE2_DOWN BUTTON_DOWN
355#define SNAKE2_QUIT BUTTON_POWER 284#define SNAKE2_QUIT BUTTON_POWER
356#define SNAKE2_LEVEL_UP BUTTON_UP
357#define SNAKE2_LEVEL_DOWN BUTTON_DOWN
358#define SNAKE2_MAZE_NEXT BUTTON_RIGHT
359#define SNAKE2_MAZE_LAST BUTTON_LEFT
360#define SNAKE2_SELECT_TYPE BUTTON_MENU
361#define SNAKE2_PLAYPAUSE BUTTON_VIEW 285#define SNAKE2_PLAYPAUSE BUTTON_VIEW
362#define SNAKE2_PLAYPAUSE_TEXT "View" 286#define SNAKE2_PLAYPAUSE_TEXT "View"
363 287
@@ -370,13 +294,8 @@ PLUGIN_HEADER
370#define SNAKE2_UP BUTTON_UP 294#define SNAKE2_UP BUTTON_UP
371#define SNAKE2_DOWN BUTTON_DOWN 295#define SNAKE2_DOWN BUTTON_DOWN
372#define SNAKE2_QUIT BUTTON_REC 296#define SNAKE2_QUIT BUTTON_REC
373#define SNAKE2_LEVEL_UP (BUTTON_FFWD|BUTTON_UP) 297#define SNAKE2_PLAYPAUSE BUTTON_PLAY
374#define SNAKE2_LEVEL_DOWN (BUTTON_FFWD|BUTTON_DOWN) 298#define SNAKE2_PLAYPAUSE_TEXT "Play"
375#define SNAKE2_MAZE_NEXT (BUTTON_REW|BUTTON_RIGHT)
376#define SNAKE2_MAZE_LAST (BUTTON_REW|BUTTON_LEFT)
377#define SNAKE2_SELECT_TYPE (BUTTON_PLAY|BUTTON_LEFT)
378#define SNAKE2_PLAYPAUSE (BUTTON_PLAY|BUTTON_RIGHT)
379#define SNAKE2_PLAYPAUSE_TEXT "Play + Right"
380 299
381#else 300#else
382#error No keymap defined! 301#error No keymap defined!
@@ -398,24 +317,6 @@ PLUGIN_HEADER
398#ifndef SNAKE2_QUIT 317#ifndef SNAKE2_QUIT
399#define SNAKE2_QUIT BUTTON_TOPLEFT 318#define SNAKE2_QUIT BUTTON_TOPLEFT
400#endif 319#endif
401#ifndef SNAKE2_LEVEL_UP
402#define SNAKE2_LEVEL_UP BUTTON_TOPRIGHT
403#endif
404#ifndef SNAKE2_LEVEL_DOWN
405#define SNAKE2_LEVEL_DOWN BUTTON_TOPLEFT
406#endif
407#ifndef SNAKE2_MAZE_NEXT
408#define SNAKE2_MAZE_NEXT BUTTON_TOPMIDDLE
409#endif
410#ifndef SNAKE2_MAZE_LAST
411#define SNAKE2_MAZE_LAST BUTTON_BOTTOMMIDDLE
412#endif
413#ifndef SNAKE2_SELECT_TYPE
414#define SNAKE2_SELECT_TYPE BUTTON_BOTTOMLEFT
415#endif
416#ifndef SNAKE2_PLAYPAUSE
417#define SNAKE2_PLAYPAUSE BUTTON_CENTER
418#endif
419#ifndef SNAKE2_PLAYPAUSE_TEXT 320#ifndef SNAKE2_PLAYPAUSE_TEXT
420#define SNAKE2_PLAYPAUSE_TEXT "CENTER" 321#define SNAKE2_PLAYPAUSE_TEXT "CENTER"
421#endif 322#endif
@@ -431,10 +332,9 @@ static int board[WIDTH][HEIGHT];
431 single frame 332 single frame
432*/ 333*/
433static int ardirectionbuffer[2]; 334static int ardirectionbuffer[2];
434static unsigned int score, hiscore = 0; 335static int score;
435static int applex; 336static int applex;
436static int appley; 337static int appley;
437static int strwdt,strhgt; /*used for string width, height for orientation purposes*/
438static int dir; 338static int dir;
439static int frames; 339static int frames;
440static int apple; 340static int apple;
@@ -447,7 +347,12 @@ static int num_apples_to_get=1;
447static int num_apples_to_got=0; 347static int num_apples_to_got=0;
448static int game_b_level=0; 348static int game_b_level=0;
449static int applecount=0; 349static int applecount=0;
450static char phscore[30]; 350/* used for string width, height for orientation purposes */
351static int strwdt, strhgt;
352static char strbuf[32];
353
354#define NUM_SCORES 5
355static struct highscore highscores[NUM_SCORES];
451 356
452#define NORTH 1 357#define NORTH 1
453#define EAST 2 358#define EAST 2
@@ -465,8 +370,8 @@ static char phscore[30];
465#define SOUTH_EAST 2048 370#define SOUTH_EAST 2048
466#define SOUTH_WEST 4096 371#define SOUTH_WEST 4096
467 372
468#define LEVELS_FILE PLUGIN_GAMES_DIR "/snake2.levels" 373#define LEVELS_FILE PLUGIN_GAMES_DIR "/snake2.levels"
469#define HISCORE_FILE PLUGIN_GAMES_DIR "/snake2.hs" 374#define SCORE_FILE PLUGIN_GAMES_DIR "/snake2.score"
470 375
471int load_all_levels(void) 376int load_all_levels(void)
472{ 377{
@@ -489,7 +394,7 @@ int load_all_levels(void)
489 return -1; 394 return -1;
490 } 395 }
491 396
492 while(rb->read_line(fd, buf, 64)) 397 while(rb->read_line(fd, buf, 64) > 0)
493 { 398 {
494 if(rb->strlen(buf) == 0) /* Separator? */ 399 if(rb->strlen(buf) == 0) /* Separator? */
495 { 400 {
@@ -514,36 +419,9 @@ int load_all_levels(void)
514 return 0; 419 return 0;
515} 420}
516 421
517/*Hi-Score reading and writing to file "/.rockbox/rocks/games/snake2.levels" function */
518void iohiscore(void)
519{
520 int fd;
521 unsigned int compare;
522
523 /* clear the buffer we're about to load the highscore data into */
524 rb->memset(phscore, 0, sizeof(phscore));
525
526 fd = rb->open(HISCORE_FILE,O_RDWR | O_CREAT);
527
528 /* highscore used to %d, is now %d\n
529 Deal with no file or bad file */
530 rb->read(fd,phscore, sizeof(phscore));
531
532 compare = rb->atoi(phscore);
533
534 if(hiscore > compare){
535 rb->lseek(fd,0,SEEK_SET);
536 rb->fdprintf(fd, "%d\n", hiscore);
537 }
538 else
539 hiscore = compare;
540
541 rb->close(fd);
542
543}
544
545/* 422/*
546** Completely clear the board of walls and/or snake */ 423** Completely clear the board of walls and/or snake
424*/
547 425
548void clear_board( void) 426void clear_board( void)
549{ 427{
@@ -853,6 +731,13 @@ void redraw (void)
853{ 731{
854 int x,y; 732 int x,y;
855 733
734#ifdef HAVE_LCD_COLOR
735 rb->lcd_set_foreground(LCD_BLACK);
736 rb->lcd_set_background(LCD_WHITE);
737#endif
738
739 rb->lcd_clear_display();
740
856 for (x = 0; x < WIDTH; x++) 741 for (x = 0; x < WIDTH; x++)
857 { 742 {
858 for (y = 0; y < HEIGHT; y++) 743 for (y = 0; y < HEIGHT; y++)
@@ -977,7 +862,6 @@ void die (void)
977{ 862{
978 int button; 863 int button;
979 bool done=false; 864 bool done=false;
980 char pscore[20];
981 865
982 rb->splash(HZ*2, "Oops!"); 866 rb->splash(HZ*2, "Oops!");
983 867
@@ -988,26 +872,26 @@ void die (void)
988 rb->lcd_getstringsize("You died!",&strwdt,&strhgt); 872 rb->lcd_getstringsize("You died!",&strwdt,&strhgt);
989 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt,"You died!"); 873 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt,"You died!");
990 874
991 rb->snprintf(pscore,sizeof(pscore),"Your score: %d",score); 875 rb->snprintf(strbuf, sizeof(strbuf), "Your score: %d", score);
992 rb->lcd_getstringsize(pscore,&strwdt,&strhgt); 876 rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
993 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 2 + 2,pscore); 877 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2, strhgt * 2 + 2, strbuf);
994 878
995 if (score>hiscore) 879 if (highscore_update(score, level_from_file, game_type==0?"Type A":"Type B",
880 highscores, NUM_SCORES) == 0)
996 { 881 {
997 hiscore=score;
998 rb->lcd_getstringsize("New high score!",&strwdt,&strhgt); 882 rb->lcd_getstringsize("New high score!",&strwdt,&strhgt);
999 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 4 + 2,"New high score!"); 883 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 4 + 2,"New high score!");
1000 } 884 }
1001 else 885 else
1002 { 886 {
1003 rb->snprintf(phscore,sizeof(phscore),"High score: %d",hiscore); 887 rb->snprintf(strbuf, sizeof(strbuf), "High score: %d", highscores[0].score);
1004 rb->lcd_getstringsize(phscore,&strwdt,&strhgt); 888 rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
1005 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 5,phscore); 889 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2, strhgt * 5, strbuf);
1006 } 890 }
1007 891
1008 rb->snprintf(phscore,sizeof(phscore),"Press %s...",SNAKE2_PLAYPAUSE_TEXT); 892 rb->snprintf(strbuf, sizeof(strbuf), "Press %s...", SNAKE2_PLAYPAUSE_TEXT);
1009 rb->lcd_getstringsize(phscore,&strwdt,&strhgt); 893 rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
1010 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt * 7,phscore); 894 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2, strhgt * 7, strbuf);
1011 895
1012 rb->lcd_update(); 896 rb->lcd_update();
1013 897
@@ -1060,9 +944,7 @@ void collision ( int x, int y )
1060 game_b_level++; 944 game_b_level++;
1061 } 945 }
1062 rb->splash(HZ, "Level Completed!"); 946 rb->splash(HZ, "Level Completed!");
1063 rb->lcd_clear_display();
1064 new_level(level_from_file); 947 new_level(level_from_file);
1065 rb->lcd_clear_display();
1066 redraw(); 948 redraw();
1067 rb->lcd_update(); 949 rb->lcd_update();
1068 } 950 }
@@ -1237,19 +1119,18 @@ void game_pause (void)
1237 switch (button) 1119 switch (button)
1238 { 1120 {
1239 case SNAKE2_PLAYPAUSE: 1121 case SNAKE2_PLAYPAUSE:
1240 rb->lcd_clear_display();
1241 redraw(); 1122 redraw();
1242 rb->lcd_update(); 1123 rb->lcd_update();
1243 rb->sleep(HZ/2); 1124 rb->sleep(HZ/2);
1244 return; 1125 return;
1245 1126
1246#ifdef SNAKE2_RC_QUIT 1127#ifdef SNAKE2_RC_QUIT
1247 case SNAKE2_RC_QUIT: 1128 case SNAKE2_RC_QUIT:
1248#endif 1129#endif
1249 case SNAKE2_QUIT: 1130 case SNAKE2_QUIT:
1250 dead = 1; 1131 dead = 1;
1251 quit = 1; 1132 quit = 1;
1252 return; 1133 return;
1253 1134
1254 default: 1135 default:
1255 if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { 1136 if (rb->default_event_handler(button)==SYS_USB_CONNECTED) {
@@ -1266,7 +1147,6 @@ void game (void)
1266{ 1147{
1267 int button; 1148 int button;
1268 1149
1269 rb->lcd_clear_display();
1270 redraw(); 1150 redraw();
1271 rb->lcd_update(); 1151 rb->lcd_update();
1272 /*main loop:*/ 1152 /*main loop:*/
@@ -1274,8 +1154,8 @@ void game (void)
1274 { 1154 {
1275 if(frames==5) 1155 if(frames==5)
1276 { 1156 {
1277 frame(); 1157 frame();
1278 if(frames>0) frames=0; 1158 if(frames > 0) frames = 0;
1279 } 1159 }
1280 frames++; 1160 frames++;
1281 1161
@@ -1305,66 +1185,59 @@ void game (void)
1305 1185
1306#ifdef HAS_BUTTON_HOLD 1186#ifdef HAS_BUTTON_HOLD
1307 if (rb->button_hold()) 1187 if (rb->button_hold())
1308 button = SNAKE2_PLAYPAUSE; 1188 button = SNAKE2_PLAYPAUSE;
1309#endif 1189#endif
1310 1190
1311 switch (button) 1191 switch (button)
1312 { 1192 {
1313 case SNAKE2_UP: 1193 case SNAKE2_UP:
1314 case SNAKE2_UP | BUTTON_REPEAT: 1194 case SNAKE2_UP | BUTTON_REPEAT:
1315 if (dir != SOUTH) set_direction(NORTH); 1195 if (dir != SOUTH) set_direction(NORTH);
1316 break; 1196 break;
1317 1197
1318 case SNAKE2_RIGHT: 1198 case SNAKE2_RIGHT:
1319 case SNAKE2_RIGHT | BUTTON_REPEAT: 1199 case SNAKE2_RIGHT | BUTTON_REPEAT:
1320 if (dir != WEST) set_direction(EAST); 1200 if (dir != WEST) set_direction(EAST);
1321 break; 1201 break;
1322 1202
1323 case SNAKE2_DOWN: 1203 case SNAKE2_DOWN:
1324 case SNAKE2_DOWN | BUTTON_REPEAT: 1204 case SNAKE2_DOWN | BUTTON_REPEAT:
1325 if (dir != NORTH) set_direction(SOUTH); 1205 if (dir != NORTH) set_direction(SOUTH);
1326 break; 1206 break;
1327 1207
1328 case SNAKE2_LEFT: 1208 case SNAKE2_LEFT:
1329 case SNAKE2_LEFT | BUTTON_REPEAT: 1209 case SNAKE2_LEFT | BUTTON_REPEAT:
1330 if (dir != EAST) set_direction(WEST); 1210 if (dir != EAST) set_direction(WEST);
1331 break; 1211 break;
1332 1212
1333#ifdef SNAKE2_RC_QUIT 1213#ifdef SNAKE2_RC_QUIT
1334 case SNAKE2_RC_QUIT: 1214 case SNAKE2_RC_QUIT:
1335#endif 1215#endif
1336 case SNAKE2_QUIT: 1216 case SNAKE2_QUIT:
1337 dead=1; 1217 dead=1;
1338 return; 1218 return;
1339 1219
1340 case SNAKE2_PLAYPAUSE: 1220 case SNAKE2_PLAYPAUSE:
1341 game_pause(); 1221 game_pause();
1342 break; 1222 break;
1343 1223
1344 default: 1224 default:
1345 if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { 1225 if (rb->default_event_handler(button)==SYS_USB_CONNECTED) {
1346 quit = 2; 1226 quit = 2;
1347 return; 1227 return;
1348 } 1228 }
1349 break; 1229 break;
1350 } 1230 }
1351 } 1231 }
1352 1232
1353} 1233}
1354 1234
1355void game_init(void) 1235void select_maze(void)
1356{ 1236{
1357 int button; 1237 int button;
1358 char plevel[30];
1359
1360 dead=0;
1361 apple=0;
1362 score=0;
1363 applecount=0;
1364 1238
1365 clear_board(); 1239 clear_board();
1366 load_level( level_from_file ); 1240 load_level( level_from_file );
1367 rb->lcd_clear_display();
1368 redraw(); 1241 redraw();
1369 rb->lcd_update(); 1242 rb->lcd_update();
1370 1243
@@ -1377,81 +1250,40 @@ void game_init(void)
1377 rb->lcd_bitmap(snake2_right,LCD_WIDTH-BMPWIDTH_snake2_right,BMPHEIGHT_snake2_header,BMPWIDTH_snake2_right, BMPHEIGHT_snake2_right); 1250 rb->lcd_bitmap(snake2_right,LCD_WIDTH-BMPWIDTH_snake2_right,BMPHEIGHT_snake2_header,BMPWIDTH_snake2_right, BMPHEIGHT_snake2_right);
1378 rb->lcd_bitmap(snake2_bottom,0,BMPHEIGHT_snake2_header+BMPHEIGHT_snake2_left,BMPWIDTH_snake2_bottom, BMPHEIGHT_snake2_bottom); 1251 rb->lcd_bitmap(snake2_bottom,0,BMPHEIGHT_snake2_header+BMPHEIGHT_snake2_left,BMPWIDTH_snake2_bottom, BMPHEIGHT_snake2_bottom);
1379 1252
1380 rb->snprintf(plevel,sizeof(plevel),"%d",level); 1253 rb->snprintf(strbuf, sizeof(strbuf), "%d", level);
1381 rb->lcd_getstringsize(plevel,&strwdt,&strhgt); 1254 rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
1382 rb->lcd_putsxy(TOP_X3-strwdt/2,TOP_Y2, plevel); 1255 rb->lcd_putsxy(TOP_X3 - strwdt/2, TOP_Y2, strbuf);
1383
1384 rb->snprintf(plevel,sizeof(plevel),"%d",level_from_file);
1385 rb->lcd_getstringsize(plevel,&strwdt,&strhgt);
1386 rb->lcd_putsxy(TOP_X2-strwdt/2,TOP_Y1, plevel);
1387
1388 if(game_type==0){
1389 rb->lcd_getstringsize("A",&strwdt,&strhgt);
1390 rb->lcd_putsxy(TOP_X1,TOP_Y1,"A");
1391 }
1392 else{
1393 rb->lcd_getstringsize("B",&strwdt,&strhgt);
1394 rb->lcd_putsxy(TOP_X1,TOP_Y1,"B");
1395 }
1396
1397 rb->snprintf(phscore,sizeof(phscore),"%d",hiscore);
1398 rb->lcd_getstringsize(phscore,&strwdt,&strhgt);
1399 rb->lcd_putsxy(TOP_X4-strwdt/2,TOP_Y2, phscore);
1400 1256
1401#else 1257 rb->snprintf(strbuf, sizeof(strbuf), "%d", level_from_file);
1402 rb->snprintf(plevel,sizeof(plevel),"Speed: %02d",level); 1258 rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
1403 rb->lcd_getstringsize("Speed: 00",&strwdt,&strhgt); 1259 rb->lcd_putsxy(TOP_X2 - strwdt/2, TOP_Y1, strbuf);
1404 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt+4, plevel);
1405 1260
1406 rb->snprintf(plevel,sizeof(plevel),"Maze: %d",level_from_file); 1261 rb->strcpy(strbuf, game_type==0? "A": "B");
1407 rb->lcd_getstringsize(plevel,&strwdt,&strhgt); 1262 rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
1408 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt*2+4, plevel); 1263 rb->lcd_putsxy(TOP_X1, TOP_Y1, strbuf);
1409 1264
1410 if(game_type==0){ 1265 rb->snprintf(strbuf, sizeof(strbuf), "%d", highscores[0].score);
1411 rb->lcd_getstringsize("Game Type: A ",&strwdt,&strhgt); 1266 rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
1412 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt*3+4,"Game Type: A"); 1267 rb->lcd_putsxy(TOP_X4 - strwdt/2, TOP_Y2, strbuf);
1413 }
1414 else{
1415 rb->lcd_getstringsize("Game Type: B ",&strwdt,&strhgt);
1416 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt*3+4,"Game Type: B");
1417 }
1418 1268
1419 rb->snprintf(phscore,sizeof(phscore),"Hi Score: %d",hiscore); 1269#else
1420 rb->lcd_getstringsize(phscore,&strwdt,&strhgt); 1270 rb->snprintf(strbuf, sizeof(strbuf), "Maze: %d", level_from_file);
1421 rb->lcd_putsxy((LCD_WIDTH - strwdt)/2,strhgt*4+4, phscore); 1271 rb->lcd_getstringsize(strbuf, &strwdt, &strhgt);
1272 rb->lcd_putsxy((WIDTH*MULTIPLIER - strwdt)/2,
1273 (HEIGHT*MULTIPLIER - strhgt)/2, strbuf);
1422#endif 1274#endif
1423 1275
1424 rb->lcd_update(); 1276 rb->lcd_update();
1425 1277
1426 button=rb->button_get(true); 1278 button = rb->button_get(true);
1427 switch (button) 1279 switch (button)
1428 { 1280 {
1429 case SNAKE2_LEVEL_UP:
1430 case SNAKE2_LEVEL_UP|BUTTON_REPEAT:
1431 if (level<10)
1432 level+=1;
1433 break;
1434 case SNAKE2_LEVEL_DOWN:
1435 case SNAKE2_LEVEL_DOWN|BUTTON_REPEAT:
1436 if (level>1)
1437 level-=1;
1438 break;
1439 case SNAKE2_QUIT: 1281 case SNAKE2_QUIT:
1440 quit=1;
1441 return;
1442 break;
1443 case SNAKE2_PLAYPAUSE: 1282 case SNAKE2_PLAYPAUSE:
1444 speed = level*20;
1445 return; 1283 return;
1446 break; 1284 break;
1447 case SNAKE2_SELECT_TYPE: 1285 case SNAKE2_UP:
1448 if(game_type==0)game_type=1; else game_type=0; 1286 case SNAKE2_RIGHT:
1449 break;
1450 case SNAKE2_MAZE_NEXT:
1451 rb->lcd_set_drawmode(DRMODE_BG|DRMODE_INVERSEVID);
1452 rb->lcd_fillrect(CENTER_X, CENTER_Y, CENTER_X+WIDTH*MULTIPLIER,
1453 CENTER_Y+HEIGHT*MULTIPLIER);
1454 rb->lcd_set_drawmode(DRMODE_SOLID);
1455 if(level_from_file < num_levels) 1287 if(level_from_file < num_levels)
1456 level_from_file++; 1288 level_from_file++;
1457 else 1289 else
@@ -1459,12 +1291,8 @@ void game_init(void)
1459 load_level( level_from_file ); 1291 load_level( level_from_file );
1460 redraw(); 1292 redraw();
1461 break; 1293 break;
1462#ifdef SNAKE2_MAZE_LAST 1294 case SNAKE2_DOWN:
1463 case SNAKE2_MAZE_LAST: 1295 case SNAKE2_LEFT:
1464 rb->lcd_set_drawmode(DRMODE_BG|DRMODE_INVERSEVID);
1465 rb->lcd_fillrect(CENTER_X, CENTER_Y, CENTER_X+WIDTH*MULTIPLIER,
1466 CENTER_Y+HEIGHT*MULTIPLIER);
1467 rb->lcd_set_drawmode(DRMODE_SOLID);
1468 if(level_from_file > 0) 1296 if(level_from_file > 0)
1469 level_from_file--; 1297 level_from_file--;
1470 else 1298 else
@@ -1472,7 +1300,6 @@ void game_init(void)
1472 load_level( level_from_file ); 1300 load_level( level_from_file );
1473 redraw(); 1301 redraw();
1474 break; 1302 break;
1475#endif
1476 default: 1303 default:
1477 if (rb->default_event_handler(button)==SYS_USB_CONNECTED) { 1304 if (rb->default_event_handler(button)==SYS_USB_CONNECTED) {
1478 quit = 2; 1305 quit = 2;
@@ -1484,6 +1311,63 @@ void game_init(void)
1484 1311
1485} 1312}
1486 1313
1314void game_init(void)
1315{
1316 int selection = 0;
1317
1318 static const struct opt_items type_options[] = {
1319 { "Type A", -1 },
1320 { "Type B", -1 },
1321 };
1322
1323 MENUITEM_STRINGLIST(menu, "Snake2 Menu", NULL,
1324 "Start New Game",
1325 "Game Type", "Select Maze", "Speed",
1326 "High Scores",
1327 "Playback Control", "Quit");
1328
1329 rb->button_clear_queue();
1330
1331 dead = 0;
1332 apple = 0;
1333 score = 0;
1334 applecount = 0;
1335
1336 while (1) {
1337 switch (rb->do_menu(&menu, &selection, NULL, false)) {
1338 case 0:
1339 speed = level*20;
1340 return;
1341 case 1:
1342 rb->set_option("Game Type", &game_type, INT,
1343 type_options, 2, NULL);
1344 break;
1345 case 2:
1346 select_maze();
1347 if(quit) return;
1348 break;
1349 case 3:
1350 rb->set_int("Speed", "", UNIT_INT, &level,
1351 NULL, 1, 1, 10, NULL);
1352 break;
1353 case 4:
1354 highscore_show(NUM_SCORES, highscores, NUM_SCORES, true);
1355 break;
1356 case 5:
1357 playback_control(NULL);
1358 break;
1359 case 6:
1360 quit = 1;
1361 return;
1362 case MENU_ATTACHED_USB:
1363 quit = 2;
1364 return;
1365 default:
1366 break;
1367 }
1368 }
1369}
1370
1487enum plugin_status plugin_start(const void* parameter) 1371enum plugin_status plugin_start(const void* parameter)
1488{ 1372{
1489 (void)(parameter); 1373 (void)(parameter);
@@ -1493,10 +1377,6 @@ enum plugin_status plugin_start(const void* parameter)
1493#if LCD_DEPTH > 1 1377#if LCD_DEPTH > 1
1494 rb->lcd_set_backdrop(NULL); 1378 rb->lcd_set_backdrop(NULL);
1495#endif 1379#endif
1496#ifdef HAVE_LCD_COLOR
1497 rb->lcd_set_foreground(LCD_BLACK);
1498 rb->lcd_set_background(LCD_WHITE);
1499#endif
1500 1380
1501 load_all_levels(); 1381 load_all_levels();
1502 1382
@@ -1505,24 +1385,25 @@ enum plugin_status plugin_start(const void* parameter)
1505 return PLUGIN_OK; 1385 return PLUGIN_OK;
1506 } 1386 }
1507 1387
1508 iohiscore(); 1388 highscore_load(SCORE_FILE, highscores, NUM_SCORES);
1509 1389
1510 while(quit==0) 1390 while(quit==0)
1511 { 1391 {
1512 game_init(); 1392 game_init();
1513 rb->lcd_clear_display(); 1393 if(quit)
1514 frames=1; 1394 break;
1395
1396 rb->lcd_clear_display();
1397 frames=1;
1515 1398
1516 if(quit==0) 1399 init_snake();
1517 {
1518 init_snake();
1519 1400
1520 /*Start Game:*/ 1401 /*Start Game:*/
1521 game(); 1402 game();
1522 }
1523 } 1403 }
1524 1404
1525 iohiscore(); 1405 highscore_save(SCORE_FILE, highscores, NUM_SCORES);
1406
1526 return (quit==1) ? PLUGIN_OK : PLUGIN_USB_CONNECTED; 1407 return (quit==1) ? PLUGIN_OK : PLUGIN_USB_CONNECTED;
1527} 1408}
1528 1409