A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 647 lines 18 kB view raw
1/*************************************************************************** 2 * __________ __ ___. 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 * \/ \/ \/ \/ \/ 8 * $Id$ 9 * 10 * Copyright (C) 2002 Itai Shaked 11 * 12 * This program is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU General Public License 14 * as published by the Free Software Foundation; either version 2 15 * of the License, or (at your option) any later version. 16 * 17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 18 * KIND, either express or implied. 19 * 20 ****************************************************************************/ 21 22/* 23Snake! 24 25by Itai Shaked 26 27ok, a little explanation - 28board holds the snake and apple position - 1+ - snake body (the number 29represents the age [1 is the snake's head]). 30-1 is an apple, and 0 is a clear spot. 31dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left; 32 33*/ 34 35#include "plugin.h" 36 37#include "lib/configfile.h" 38#include "lib/highscore.h" 39#include "lib/playback_control.h" 40 41 42 43/* variable button definitions */ 44#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ 45 (CONFIG_KEYPAD == IRIVER_H300_PAD) 46#define SNAKE_QUIT BUTTON_OFF 47#define SNAKE_LEFT BUTTON_LEFT 48#define SNAKE_RIGHT BUTTON_RIGHT 49#define SNAKE_UP BUTTON_UP 50#define SNAKE_DOWN BUTTON_DOWN 51#define SNAKE_PLAYPAUSE BUTTON_ON 52 53#define SNAKE_RC_QUIT BUTTON_RC_STOP 54 55#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ 56 (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 57 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 58#define SNAKE_QUIT (BUTTON_SELECT|BUTTON_REPEAT) 59#define SNAKE_LEFT BUTTON_LEFT 60#define SNAKE_RIGHT BUTTON_RIGHT 61#define SNAKE_UP BUTTON_MENU 62#define SNAKE_DOWN BUTTON_PLAY 63#define SNAKE_PLAYPAUSE (BUTTON_SELECT|BUTTON_REL) 64 65#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) 66#define SNAKE_QUIT BUTTON_POWER 67#define SNAKE_LEFT BUTTON_LEFT 68#define SNAKE_RIGHT BUTTON_RIGHT 69#define SNAKE_UP BUTTON_UP 70#define SNAKE_DOWN BUTTON_DOWN 71#define SNAKE_PLAYPAUSE BUTTON_PLAY 72 73#elif (CONFIG_KEYPAD == GIGABEAT_PAD) 74#define SNAKE_QUIT BUTTON_POWER 75#define SNAKE_LEFT BUTTON_LEFT 76#define SNAKE_RIGHT BUTTON_RIGHT 77#define SNAKE_UP BUTTON_UP 78#define SNAKE_DOWN BUTTON_DOWN 79#define SNAKE_PLAYPAUSE BUTTON_SELECT 80 81#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \ 82 (CONFIG_KEYPAD == SANSA_C200_PAD) || \ 83 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \ 84 (CONFIG_KEYPAD == SANSA_M200_PAD) || \ 85 (CONFIG_KEYPAD == SANSA_CONNECT_PAD) 86#define SNAKE_QUIT BUTTON_POWER 87#define SNAKE_LEFT BUTTON_LEFT 88#define SNAKE_RIGHT BUTTON_RIGHT 89#define SNAKE_UP BUTTON_UP 90#define SNAKE_DOWN BUTTON_DOWN 91#define SNAKE_PLAYPAUSE BUTTON_SELECT 92 93#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD) 94#define SNAKE_QUIT (BUTTON_HOME|BUTTON_REPEAT) 95#define SNAKE_LEFT BUTTON_LEFT 96#define SNAKE_RIGHT BUTTON_RIGHT 97#define SNAKE_UP BUTTON_UP 98#define SNAKE_DOWN BUTTON_DOWN 99#define SNAKE_PLAYPAUSE BUTTON_SELECT 100 101#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) 102#define SNAKE_QUIT BUTTON_POWER 103#define SNAKE_LEFT BUTTON_LEFT 104#define SNAKE_RIGHT BUTTON_RIGHT 105#define SNAKE_UP BUTTON_SCROLL_UP 106#define SNAKE_DOWN BUTTON_SCROLL_DOWN 107#define SNAKE_PLAYPAUSE BUTTON_PLAY 108 109#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) || \ 110 (CONFIG_KEYPAD == SAMSUNG_YPR0_PAD) 111#define SNAKE_QUIT BUTTON_BACK 112#define SNAKE_LEFT BUTTON_LEFT 113#define SNAKE_RIGHT BUTTON_RIGHT 114#define SNAKE_UP BUTTON_UP 115#define SNAKE_DOWN BUTTON_DOWN 116#define SNAKE_PLAYPAUSE BUTTON_SELECT 117 118#elif (CONFIG_KEYPAD == MROBE100_PAD) 119#define SNAKE_QUIT BUTTON_POWER 120#define SNAKE_LEFT BUTTON_LEFT 121#define SNAKE_RIGHT BUTTON_RIGHT 122#define SNAKE_UP BUTTON_UP 123#define SNAKE_DOWN BUTTON_DOWN 124#define SNAKE_PLAYPAUSE BUTTON_SELECT 125 126#elif CONFIG_KEYPAD == IAUDIO_M3_PAD 127#define SNAKE_QUIT BUTTON_RC_REC 128#define SNAKE_LEFT BUTTON_RC_REW 129#define SNAKE_RIGHT BUTTON_RC_FF 130#define SNAKE_UP BUTTON_RC_VOL_UP 131#define SNAKE_DOWN BUTTON_RC_VOL_DOWN 132#define SNAKE_PLAYPAUSE BUTTON_RC_PLAY 133 134#define SNAKE_RC_QUIT BUTTON_REC 135 136#elif CONFIG_KEYPAD == CREATIVEZVM_PAD 137#define SNAKE_QUIT BUTTON_BACK 138#define SNAKE_LEFT BUTTON_LEFT 139#define SNAKE_RIGHT BUTTON_RIGHT 140#define SNAKE_UP BUTTON_UP 141#define SNAKE_DOWN BUTTON_DOWN 142#define SNAKE_PLAYPAUSE BUTTON_PLAY 143 144#elif CONFIG_KEYPAD == CREATIVE_ZENXFI3_PAD 145#define SNAKE_QUIT BUTTON_POWER 146#define SNAKE_LEFT BUTTON_BACK 147#define SNAKE_RIGHT BUTTON_MENU 148#define SNAKE_UP BUTTON_UP 149#define SNAKE_DOWN BUTTON_DOWN 150#define SNAKE_PLAYPAUSE BUTTON_PLAY 151 152#elif (CONFIG_KEYPAD == PHILIPS_HDD1630_PAD) || \ 153 (CONFIG_KEYPAD == PHILIPS_HDD6330_PAD) 154#define SNAKE_QUIT BUTTON_POWER 155#define SNAKE_LEFT BUTTON_LEFT 156#define SNAKE_RIGHT BUTTON_RIGHT 157#define SNAKE_UP BUTTON_UP 158#define SNAKE_DOWN BUTTON_DOWN 159#define SNAKE_PLAYPAUSE BUTTON_MENU 160 161#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD 162#define SNAKE_QUIT BUTTON_POWER 163#define SNAKE_LEFT BUTTON_PREV 164#define SNAKE_RIGHT BUTTON_NEXT 165#define SNAKE_UP BUTTON_UP 166#define SNAKE_DOWN BUTTON_DOWN 167#define SNAKE_PLAYPAUSE BUTTON_MENU 168 169#elif (CONFIG_KEYPAD == SAMSUNG_YH820_PAD) || \ 170 (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD) 171#define SNAKE_QUIT BUTTON_REW 172#define SNAKE_LEFT BUTTON_LEFT 173#define SNAKE_RIGHT BUTTON_RIGHT 174#define SNAKE_UP BUTTON_UP 175#define SNAKE_DOWN BUTTON_DOWN 176#define SNAKE_PLAYPAUSE BUTTON_PLAY 177 178#elif CONFIG_KEYPAD == MROBE500_PAD 179#define SNAKE_QUIT BUTTON_POWER 180#define SNAKE_RC_QUIT BUTTON_RC_DOWN 181 182#elif (CONFIG_KEYPAD == ONDAVX747_PAD) 183#define SNAKE_QUIT BUTTON_POWER 184 185#elif (CONFIG_KEYPAD == ONDAVX777_PAD) 186#define SNAKE_QUIT BUTTON_POWER 187 188#elif CONFIG_KEYPAD == COWON_D2_PAD 189#define SNAKE_QUIT BUTTON_POWER 190 191#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD 192#define SNAKE_QUIT BUTTON_REC 193#define SNAKE_LEFT BUTTON_PREV 194#define SNAKE_RIGHT BUTTON_NEXT 195#define SNAKE_UP BUTTON_UP 196#define SNAKE_DOWN BUTTON_DOWN 197#define SNAKE_PLAYPAUSE BUTTON_PLAY 198 199#elif CONFIG_KEYPAD == MPIO_HD200_PAD 200#define SNAKE_QUIT (BUTTON_REC|BUTTON_PLAY) 201#define SNAKE_LEFT BUTTON_VOL_DOWN 202#define SNAKE_RIGHT BUTTON_VOL_UP 203#define SNAKE_UP BUTTON_REW 204#define SNAKE_DOWN BUTTON_FF 205#define SNAKE_PLAYPAUSE BUTTON_PLAY 206 207#elif CONFIG_KEYPAD == MPIO_HD300_PAD 208#define SNAKE_QUIT (BUTTON_MENU|BUTTON_REPEAT) 209#define SNAKE_LEFT BUTTON_REW 210#define SNAKE_RIGHT BUTTON_FF 211#define SNAKE_UP BUTTON_UP 212#define SNAKE_DOWN BUTTON_DOWN 213#define SNAKE_PLAYPAUSE BUTTON_PLAY 214 215#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD 216#define SNAKE_QUIT BUTTON_POWER 217#define SNAKE_LEFT BUTTON_LEFT 218#define SNAKE_RIGHT BUTTON_RIGHT 219#define SNAKE_UP BUTTON_UP 220#define SNAKE_DOWN BUTTON_DOWN 221#define SNAKE_PLAYPAUSE BUTTON_PLAYPAUSE 222 223#elif (CONFIG_KEYPAD == HM60X_PAD) || \ 224 (CONFIG_KEYPAD == HM801_PAD) 225#define SNAKE_QUIT BUTTON_POWER 226#define SNAKE_LEFT BUTTON_LEFT 227#define SNAKE_RIGHT BUTTON_RIGHT 228#define SNAKE_UP BUTTON_UP 229#define SNAKE_DOWN BUTTON_DOWN 230#define SNAKE_PLAYPAUSE BUTTON_SELECT 231 232#elif CONFIG_KEYPAD == SONY_NWZ_PAD 233#define SNAKE_QUIT BUTTON_BACK 234#define SNAKE_LEFT BUTTON_LEFT 235#define SNAKE_RIGHT BUTTON_RIGHT 236#define SNAKE_UP BUTTON_UP 237#define SNAKE_DOWN BUTTON_DOWN 238#define SNAKE_PLAYPAUSE BUTTON_PLAY 239 240#elif CONFIG_KEYPAD == CREATIVE_ZEN_PAD 241#define SNAKE_QUIT BUTTON_BACK 242#define SNAKE_LEFT BUTTON_LEFT 243#define SNAKE_RIGHT BUTTON_RIGHT 244#define SNAKE_UP BUTTON_UP 245#define SNAKE_DOWN BUTTON_DOWN 246#define SNAKE_PLAYPAUSE BUTTON_PLAYPAUSE 247 248#elif CONFIG_KEYPAD == DX50_PAD 249#define SNAKE_QUIT BUTTON_POWER 250#define SNAKE_LEFT BUTTON_LEFT 251#define SNAKE_RIGHT BUTTON_PLAY 252#define SNAKE_UP BUTTON_VOL_UP 253#define SNAKE_DOWN BUTTON_VOL_DOWN 254#define SNAKE_PLAYPAUSE BUTTON_RIGHT 255 256#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD 257#define SNAKE_QUIT BUTTON_POWER 258#define SNAKE_PLAYPAUSE BUTTON_MENU 259 260#elif CONFIG_KEYPAD == AGPTEK_ROCKER_PAD 261#define SNAKE_QUIT BUTTON_POWER 262#define SNAKE_LEFT BUTTON_LEFT 263#define SNAKE_RIGHT BUTTON_RIGHT 264#define SNAKE_UP BUTTON_UP 265#define SNAKE_DOWN BUTTON_DOWN 266#define SNAKE_PLAYPAUSE BUTTON_SELECT 267 268#elif CONFIG_KEYPAD == XDUOO_X3_PAD 269#define SNAKE_QUIT BUTTON_POWER 270#define SNAKE_LEFT BUTTON_PREV 271#define SNAKE_RIGHT BUTTON_NEXT 272#define SNAKE_UP BUTTON_HOME 273#define SNAKE_DOWN BUTTON_OPTION 274#define SNAKE_PLAYPAUSE BUTTON_PLAY 275 276#elif CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD 277#define SNAKE_QUIT BUTTON_POWER 278#define SNAKE_LEFT BUTTON_PREV 279#define SNAKE_RIGHT BUTTON_NEXT 280#define SNAKE_UP BUTTON_HOME 281#define SNAKE_DOWN BUTTON_OPTION 282#define SNAKE_PLAYPAUSE BUTTON_PLAY 283 284#elif CONFIG_KEYPAD == FIIO_M3K_LINUX_PAD 285#define SNAKE_QUIT BUTTON_POWER 286#define SNAKE_LEFT BUTTON_PREV 287#define SNAKE_RIGHT BUTTON_NEXT 288#define SNAKE_UP BUTTON_HOME 289#define SNAKE_DOWN BUTTON_OPTION 290#define SNAKE_PLAYPAUSE BUTTON_PLAY 291 292#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD 293#define SNAKE_QUIT BUTTON_POWER 294#define SNAKE_LEFT BUTTON_HOME 295#define SNAKE_RIGHT BUTTON_VOL_DOWN 296#define SNAKE_UP BUTTON_PREV 297#define SNAKE_DOWN BUTTON_NEXT 298#define SNAKE_PLAYPAUSE BUTTON_PLAY 299 300#elif CONFIG_KEYPAD == EROSQ_PAD 301#define SNAKE_QUIT BUTTON_POWER 302#define SNAKE_LEFT BUTTON_SCROLL_BACK 303#define SNAKE_RIGHT BUTTON_SCROLL_FWD 304#define SNAKE_UP BUTTON_PREV 305#define SNAKE_DOWN BUTTON_NEXT 306#define SNAKE_PLAYPAUSE BUTTON_PLAY 307 308#elif CONFIG_KEYPAD == FIIO_M3K_PAD 309#define SNAKE_QUIT BUTTON_POWER 310#define SNAKE_LEFT BUTTON_LEFT 311#define SNAKE_RIGHT BUTTON_RIGHT 312#define SNAKE_UP BUTTON_UP 313#define SNAKE_DOWN BUTTON_DOWN 314#define SNAKE_PLAYPAUSE BUTTON_PLAY 315 316#elif CONFIG_KEYPAD == SHANLING_Q1_PAD 317/* use touchscreen */ 318 319#elif CONFIG_KEYPAD == SDL_PAD 320#elif CONFIG_KEYPAD == MA_PAD 321#define SNAKE_QUIT BUTTON_BACK 322#define SNAKE_LEFT BUTTON_LEFT 323#define SNAKE_RIGHT BUTTON_RIGHT 324#define SNAKE_UP BUTTON_UP 325#define SNAKE_DOWN BUTTON_DOWN 326#define SNAKE_PLAYPAUSE BUTTON_SELECT 327 328#elif CONFIG_KEYPAD == RG_NANO_PAD 329#define SNAKE_QUIT BUTTON_START 330#define SNAKE_LEFT BUTTON_LEFT 331#define SNAKE_RIGHT BUTTON_RIGHT 332#define SNAKE_UP BUTTON_UP 333#define SNAKE_DOWN BUTTON_DOWN 334#define SNAKE_PLAYPAUSE BUTTON_A 335 336#else 337#error No keymap defined! 338#endif 339 340#ifdef HAVE_TOUCHSCREEN 341#ifndef SNAKE_QUIT 342#define SNAKE_QUIT BUTTON_TOPLEFT 343#endif 344#ifndef SNAKE_LEFT 345#define SNAKE_LEFT BUTTON_MIDLEFT 346#endif 347#ifndef SNAKE_RIGHT 348#define SNAKE_RIGHT BUTTON_MIDRIGHT 349#endif 350#ifndef SNAKE_UP 351#define SNAKE_UP BUTTON_TOPMIDDLE 352#endif 353#ifndef SNAKE_DOWN 354#define SNAKE_DOWN BUTTON_BOTTOMMIDDLE 355#endif 356#ifndef SNAKE_PLAYPAUSE 357#define SNAKE_PLAYPAUSE BUTTON_CENTER 358#endif 359#endif 360 361#define BOARD_WIDTH (LCD_WIDTH/4) 362#define BOARD_HEIGHT (LCD_HEIGHT/4) 363 364#define CONFIG_FILE_NAME "snake.cfg" 365#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/snake.score" 366#define NUM_SCORES 5 367 368static int board[BOARD_WIDTH][BOARD_HEIGHT],snakelength; 369static unsigned int score, level = 1; 370static int dir; 371static bool apple, dead, ingame; 372static struct highscore highscores[NUM_SCORES]; 373 374static struct configdata config[] = { 375 {TYPE_INT, 1, 9, { .int_p = &level }, "level", NULL}, 376}; 377 378static void snake_die (void) 379{ 380 rb->lcd_clear_display(); 381 rb->lcd_puts(0,0,"Oops..."); 382 rb->lcd_putsf(0,1,"Your score: %d",score); 383 if (highscore_update(score, level, "", highscores, NUM_SCORES) == 0) { 384 rb->lcd_puts(0,2,"New High Score!"); 385 } 386 else { 387 rb->lcd_putsf(0,2,"High Score: %d", highscores[0].score); 388 } 389 rb->lcd_update(); 390 rb->sleep(3*HZ); 391 dead=true; 392} 393 394static void snake_colission (short x, short y) 395{ 396 if (x==BOARD_WIDTH || x<0 || y==BOARD_HEIGHT || y<0) { 397 snake_die(); 398 return; 399 } 400 switch (board[x][y]) { 401 case 0: 402 break; 403 case -1: 404 snakelength+=2; 405 score+=level; 406 apple=false; 407 break; 408 default: 409 snake_die(); 410 break; 411 } 412} 413 414static void snake_move_head (short x, short y) 415{ 416 switch (dir) { 417 case 0: 418 y-=1; 419 break; 420 case 1: 421 x+=1; 422 break; 423 case 2: 424 y+=1; 425 break; 426 case 3: 427 x-=1; 428 break; 429 } 430 snake_colission (x,y); 431 if (dead) 432 return; 433 board[x][y]=1; 434 rb->lcd_fillrect(x*4,y*4,4,4); 435} 436 437static void snake_redraw (void) 438{ 439 short x,y; 440 rb->lcd_clear_display(); 441 for (x=0; x<BOARD_WIDTH; x++) { 442 for (y=0; y<BOARD_HEIGHT; y++) { 443 switch (board[x][y]) { 444 case -1: 445 rb->lcd_fillrect((x*4)+1,y*4,2,4); 446 rb->lcd_fillrect(x*4,(y*4)+1,4,2); 447 break; 448 case 0: 449 break; 450 default: 451 rb->lcd_fillrect(x*4,y*4,4,4); 452 break; 453 } 454 } 455 } 456 rb->lcd_update(); 457} 458 459static void snake_frame (void) 460{ 461 short x,y,head=0; 462 for (x=0; x<BOARD_WIDTH; x++) { 463 for (y=0; y<BOARD_HEIGHT; y++) { 464 switch (board[x][y]) { 465 case 1: 466 if (!head) { 467 snake_move_head(x,y); 468 if (dead) 469 return; 470 board[x][y]++; 471 head=1; 472 } 473 break; 474 case 0: 475 break; 476 case -1: 477 break; 478 default: 479 if (board[x][y]==snakelength) { 480 board[x][y]=0; 481 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); 482 rb->lcd_fillrect(x*4,y*4,4,4); 483 rb->lcd_set_drawmode(DRMODE_SOLID); 484 } 485 else 486 board[x][y]++; 487 break; 488 } 489 } 490 } 491 rb->lcd_update(); 492} 493 494static void snake_game_init(void) { 495 short x,y; 496 rb->lcd_clear_display(); 497 498 for (x=0; x<BOARD_WIDTH; x++) { 499 for (y=0; y<BOARD_HEIGHT; y++) { 500 board[x][y]=0; 501 } 502 } 503 apple=false; 504 dead=false; 505 snakelength=4; 506 score=0; 507 dir=1; 508 board[11][7]=1; 509} 510 511static int snake_menu_cb(int action, 512 const struct menu_item_ex *this_item, 513 struct gui_synclist *this_list) 514{ 515 (void)this_list; 516 if(action == ACTION_REQUEST_MENUITEM 517 && !ingame && ((intptr_t)this_item)==0) 518 return ACTION_EXIT_MENUITEM; 519 return action; 520} 521 522static int snake_game_menu(void) 523{ 524 MENUITEM_STRINGLIST(main_menu,"Snake Menu",snake_menu_cb, 525 "Resume Game", 526 "Start New Game", 527 "Snake Speed", 528 "High Score", 529 "Playback Control", 530 "Quit"); 531 int selected = 0; 532 533 rb->button_clear_queue(); 534 535 while (true) { 536 switch (rb->do_menu(&main_menu, &selected, NULL, false)) { 537 case 0: 538 snake_redraw(); 539 return 0; 540 case 1: 541 snake_game_init(); 542 return 0; 543 case 2: 544 rb->set_int("Snake Speed", "", UNIT_INT, &level, 545 NULL, 1, 1, 9, NULL); 546 break; 547 case 3: 548 highscore_show(-1, highscores, NUM_SCORES, true); 549 rb->lcd_setfont(FONT_UI); 550 break; 551 case 4: 552 playback_control(NULL); 553 break; 554 case 5: 555 return 1; 556 case MENU_ATTACHED_USB: 557 return 1; 558 default: 559 break; 560 } 561 } 562} 563 564static int snake_game_loop (void) { 565 int button; 566 short x,y; 567 bool pause = false; 568 569 if (snake_game_menu()) 570 return 1; 571 572 ingame = true; 573 while (true) { 574 if (!pause) { 575 snake_frame(); 576 if (dead) { 577 ingame = false; 578 return 0; 579 } 580 if (!apple) { 581 do { 582 x=rb->rand() % BOARD_WIDTH; 583 y=rb->rand() % BOARD_HEIGHT; 584 } while (board[x][y]); 585 apple=true; 586 board[x][y]=-1; 587 rb->lcd_fillrect((x*4)+1,y*4,2,4); 588 rb->lcd_fillrect(x*4,(y*4)+1,4,2); 589 } 590 591 rb->sleep(HZ/level); 592 } 593 594 button=rb->button_get(false); 595 596#ifdef HAS_BUTTON_HOLD 597 if (rb->button_hold() && !pause) 598 button = SNAKE_PLAYPAUSE; 599#endif 600 switch (button) { 601 case SNAKE_UP: 602 if (dir!=2) dir=0; 603 break; 604 case SNAKE_RIGHT: 605 if (dir!=3) dir=1; 606 break; 607 case SNAKE_DOWN: 608 if (dir!=0) dir=2; 609 break; 610 case SNAKE_LEFT: 611 if (dir!=1) dir=3; 612 break; 613 case SNAKE_PLAYPAUSE: 614 pause = !pause; 615 if (pause) 616 rb->splash (HZ, "Paused"); 617 else 618 snake_redraw(); 619 break; 620#ifdef SNAKE_RC_QUIT 621 case SNAKE_RC_QUIT: 622#endif 623 case SNAKE_QUIT: 624 return 0; 625 break; 626 default: 627 if (rb->default_event_handler (button) == SYS_USB_CONNECTED) 628 return 1; 629 break; 630 } 631 } 632} 633 634enum plugin_status plugin_start(const void* parameter) 635{ 636 (void)parameter; 637 638 configfile_load(CONFIG_FILE_NAME, config, 1, 0); 639 highscore_load(SCORE_FILE, highscores, NUM_SCORES); 640 rb->lcd_clear_display(); 641 ingame = false; 642 while(snake_game_loop() == 0) 643 ; 644 configfile_save(CONFIG_FILE_NAME, config, 1, 0); 645 highscore_save(SCORE_FILE, highscores, NUM_SCORES); 646 return PLUGIN_OK; 647}