summaryrefslogtreecommitdiff
path: root/apps/plugins/solitaire.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/solitaire.c')
-rw-r--r--apps/plugins/solitaire.c176
1 files changed, 60 insertions, 116 deletions
diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c
index faaf504622..5342fe3350 100644
--- a/apps/plugins/solitaire.c
+++ b/apps/plugins/solitaire.c
@@ -135,7 +135,7 @@ static struct plugin_api* rb;
135# define SOL_REM2STACK_PRE BUTTON_RIGHT 135# define SOL_REM2STACK_PRE BUTTON_RIGHT
136# define SOL_REM2STACK (BUTTON_RIGHT | BUTTON_REPEAT) 136# define SOL_REM2STACK (BUTTON_RIGHT | BUTTON_REPEAT)
137# define SOL_MENU_RUN BUTTON_SELECT 137# define SOL_MENU_RUN BUTTON_SELECT
138# define HK_UD "SROLL U/D" 138# define HK_UD "SCROLL U/D"
139# define HK_MOVE "SELECT" 139# define HK_MOVE "SELECT"
140# define HK_DRAW "MENU" 140# define HK_DRAW "MENU"
141# define HK_REM2CUR "PLAY" 141# define HK_REM2CUR "PLAY"
@@ -574,8 +574,6 @@ enum help solitaire_help( void )
574 574
575/** 575/**
576 * Custom menu / options 576 * Custom menu / options
577 *
578 * TODO: use rockbox api menus instead
579 */ 577 */
580 578
581#define CFGFILE_VERSION 0 579#define CFGFILE_VERSION 0
@@ -588,133 +586,88 @@ static struct configdata config[] = {
588 { TYPE_INT, 0, 1, &draw_type_disk, "draw_type", NULL, NULL } 586 { TYPE_INT, 0, 1, &draw_type_disk, "draw_type", NULL, NULL }
589}; 587};
590 588
591/* menu return codes */
592enum { MENU_RESUME, MENU_RESTART, MENU_OPT,
593 MENU_HELP, MENU_QUIT, MENU_USB };
594#define MENU_LENGTH MENU_USB
595 589
596/* different menu behaviors */ 590char draw_option_string[32];
597enum { MENU_BEFOREGAME, MENU_BEFOREGAMEOP, MENU_DURINGGAME };
598 591
599/** 592static void create_draw_option_string(void)
600 * The menu
601 * text displayed changes depending on the context */
602int solitaire_menu( unsigned char context )
603{ 593{
604 static char menu[3][MENU_LENGTH][17] = 594 if (draw_type == 0)
605 { { "Start Game", 595 rb->strcpy(draw_option_string, "Draw Three Cards");
606 "", 596 else
607 "Draw Three Cards", 597 rb->strcpy(draw_option_string, "Draw One Card");
608 "Help", 598}
609 "Quit" },
610 { "Start Game",
611 "",
612 "Draw One Card",
613 "Help",
614 "Quit" },
615 { "Resume Game",
616 "Restart Game",
617 "",
618 "Help",
619 "Quit"},
620 };
621 599
600void solitaire_init(void);
622 601
623 int i; 602/* menu return codes */
624 int cursor = 0; 603enum { MENU_RESUME, MENU_QUIT, MENU_USB };
625 int button; 604
605int solitaire_menu(bool in_game)
606{
607 int m;
608 int result = -1;
609 int i = 0;
626 610
627 int fh; 611 struct menu_item items[4];
628 rb->lcd_getstringsize( menu[0][0], NULL, &fh );
629 fh++;
630 612
631 if( context != MENU_BEFOREGAMEOP 613 if (in_game)
632 && context != MENU_BEFOREGAME
633 && context != MENU_DURINGGAME )
634 { 614 {
635 context = MENU_DURINGGAME; 615 items[i++].desc = "Resume Game";
616 items[i++].desc = "Restart Game";
636 } 617 }
637 618 else
638#if LCD_DEPTH > 1
639 rb->lcd_set_background( LCD_DEFAULT_BG );
640 rb->lcd_set_foreground( LCD_DEFAULT_FG );
641#endif
642
643 while( true )
644 { 619 {
620 items[i++].desc = "Start Game";
621 items[i++].desc = draw_option_string;
622 }
623 items[i++].desc = "Help";
624 items[i++].desc = "Quit";
645 625
646 rb->lcd_clear_display(); 626 create_draw_option_string();
647 rb->lcd_putsxy( 20, 1, "Solitaire" ); 627 m = rb->menu_init(items, i, NULL, NULL, NULL, NULL);
648 628 while (result < 0)
649 for( i = 0; i<MENU_LENGTH; i++ ) 629 {
650 { 630 switch (rb->menu_show(m))
651 rb->lcd_putsxy( 1, 17+fh*i, menu[context][i] );
652 if( cursor == i )
653 {
654 rb->lcd_set_drawmode( DRMODE_COMPLEMENT );
655 rb->lcd_fillrect( 0, 17+fh*i, LCD_WIDTH, fh );
656 rb->lcd_set_drawmode( DRMODE_SOLID );
657 }
658 }
659
660 rb->lcd_update();
661
662 button = rb->button_get( true );
663 switch( button )
664 { 631 {
665 case SOL_UP: 632 case MENU_SELECTED_EXIT:
666#ifndef SOL_UP_PRE 633 result = MENU_RESUME;
667 case SOL_UP|BUTTON_REPEAT:
668#endif
669 cursor = (cursor + MENU_LENGTH - 1)%MENU_LENGTH;
670 break; 634 break;
671 635
672 case SOL_DOWN: 636 case MENU_ATTACHED_USB:
673#ifndef SOL_DOWN_PRE 637 result = MENU_USB;
674 case SOL_DOWN|BUTTON_REPEAT:
675#endif
676 cursor = (cursor + 1)%MENU_LENGTH;
677 break; 638 break;
678 639
679 case SOL_LEFT: 640 case 0:
680 return MENU_RESUME; 641 result = MENU_RESUME;
642 break;
681 643
682 case SOL_MENU_RUN: 644 case 1:
683#ifdef SOL_MENU_RUN2 645 if (in_game)
684 case SOL_MENU_RUN2:
685#endif
686 switch( cursor )
687 { 646 {
688 case MENU_RESUME: 647 solitaire_init();
689 case MENU_RESTART: 648 result = MENU_RESUME;
690 case MENU_OPT: 649 }
691 case MENU_QUIT: 650 else
692 return cursor; 651 {
693 652 draw_type = (draw_type + 1) % 2;
694 case MENU_HELP: 653 create_draw_option_string();
695 if( solitaire_help() == HELP_USB )
696 return MENU_USB;
697 break;
698 } 654 }
699 break; 655 break;
700 656
701#ifdef SOL_OPT 657 case 2:
702 case SOL_OPT: 658 rb->lcd_setmargins(0, 0);
703 return MENU_OPT; 659 if (solitaire_help() == HELP_USB)
704#endif 660 result = MENU_USB;
705 661 break;
706#ifdef SOL_RC_QUIT
707 case SOL_RC_QUIT:
708#endif
709 case SOL_QUIT:
710 return MENU_QUIT;
711 662
712 default: 663 case 3:
713 if( rb->default_event_handler( button ) == SYS_USB_CONNECTED ) 664 result = MENU_QUIT;
714 return MENU_USB;
715 break; 665 break;
716 } 666 }
717 } 667 }
668 rb->menu_exit(m);
669 rb->lcd_setmargins(0, 0);
670 return result;
718} 671}
719 672
720/** 673/**
@@ -1131,18 +1084,13 @@ int solitaire( void )
1131 int biggest_col_length; 1084 int biggest_col_length;
1132 1085
1133 rb->srand( *rb->current_tick ); 1086 rb->srand( *rb->current_tick );
1134 switch( solitaire_menu( draw_type == 0 ? MENU_BEFOREGAME 1087 switch( solitaire_menu(false) )
1135 : MENU_BEFOREGAMEOP ) )
1136 { 1088 {
1137 case MENU_QUIT: 1089 case MENU_QUIT:
1138 return SOLITAIRE_QUIT; 1090 return SOLITAIRE_QUIT;
1139 1091
1140 case MENU_USB: 1092 case MENU_USB:
1141 return SOLITAIRE_USB; 1093 return SOLITAIRE_USB;
1142
1143 case MENU_OPT:
1144 draw_type = (draw_type+1)%2;
1145 return 0;
1146 } 1094 }
1147 solitaire_init(); 1095 solitaire_init();
1148 1096
@@ -1564,17 +1512,13 @@ int solitaire( void )
1564 case SOL_RC_QUIT: 1512 case SOL_RC_QUIT:
1565#endif 1513#endif
1566 case SOL_QUIT: 1514 case SOL_QUIT:
1567 switch( solitaire_menu( MENU_DURINGGAME ) ) 1515 switch( solitaire_menu(true) )
1568 { 1516 {
1569 case MENU_QUIT: 1517 case MENU_QUIT:
1570 return SOLITAIRE_QUIT; 1518 return SOLITAIRE_QUIT;
1571 1519
1572 case MENU_USB: 1520 case MENU_USB:
1573 return SOLITAIRE_USB; 1521 return SOLITAIRE_USB;
1574
1575 case MENU_RESTART:
1576 solitaire_init();
1577 break;
1578 } 1522 }
1579 break; 1523 break;
1580 1524