summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2007-05-29 16:33:16 +0000
committerNils Wallménius <nils@rockbox.org>2007-05-29 16:33:16 +0000
commit3e190c814ad7c4d53b9917c324329c8477297cb7 (patch)
tree8eb2f5053d06d51a2ecfc52eb7ac439c2ea5d249
parent6fd3d96309f73e31168a900e592f5d94231762a4 (diff)
downloadrockbox-3e190c814ad7c4d53b9917c324329c8477297cb7.tar.gz
rockbox-3e190c814ad7c4d53b9917c324329c8477297cb7.zip
Accept FS#7209 by Mauricio Peccorini, Make chessbox able to view games stored in PGN format
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13515 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/chessbox/Makefile2
-rw-r--r--apps/plugins/chessbox/chessbox.c324
-rw-r--r--apps/plugins/chessbox/gnuchess.c9
-rw-r--r--apps/plugins/chessbox/gnuchess.h2
-rw-r--r--apps/plugins/viewers.config1
5 files changed, 311 insertions, 27 deletions
diff --git a/apps/plugins/chessbox/Makefile b/apps/plugins/chessbox/Makefile
index 7d8653285e..bb85d40751 100644
--- a/apps/plugins/chessbox/Makefile
+++ b/apps/plugins/chessbox/Makefile
@@ -18,7 +18,7 @@ endif
18 18
19LINKFILE := $(OBJDIR)/link.lds 19LINKFILE := $(OBJDIR)/link.lds
20DEPFILE = $(OBJDIR)/dep-chessbox 20DEPFILE = $(OBJDIR)/dep-chessbox
21SRC = chessbox.c gnuchess.c opening.c 21SRC = chessbox.c gnuchess.c opening.c chessbox_pgn.c
22 22
23SOURCES = $(SRC) 23SOURCES = $(SRC)
24OBJS := $(SRC:%.c=$(OBJDIR)/%.o) 24OBJS := $(SRC:%.c=$(OBJDIR)/%.o)
diff --git a/apps/plugins/chessbox/chessbox.c b/apps/plugins/chessbox/chessbox.c
index 9f9e1099af..d273888f2b 100644
--- a/apps/plugins/chessbox/chessbox.c
+++ b/apps/plugins/chessbox/chessbox.c
@@ -25,6 +25,7 @@
25 25
26#include "gnuchess.h" 26#include "gnuchess.h"
27#include "opening.h" 27#include "opening.h"
28#include "chessbox_pgn.h"
28 29
29/* type definitions */ 30/* type definitions */
30struct cb_command { 31struct cb_command {
@@ -51,6 +52,11 @@ PLUGIN_HEADER
51#define CB_RESTART (BUTTON_SELECT | BUTTON_LEFT) 52#define CB_RESTART (BUTTON_SELECT | BUTTON_LEFT)
52#define CB_MENU (BUTTON_SELECT | BUTTON_MENU) 53#define CB_MENU (BUTTON_SELECT | BUTTON_MENU)
53 54
55#define CB_SCROLL_UP (BUTTON_SCROLL_FWD|BUTTON_REPEAT)
56#define CB_SCROLL_DOWN (BUTTON_SCROLL_BACK|BUTTON_REPEAT)
57#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
58#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
59
54#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD 60#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
55#define CB_SELECT BUTTON_SELECT 61#define CB_SELECT BUTTON_SELECT
56#define CB_UP BUTTON_UP 62#define CB_UP BUTTON_UP
@@ -62,6 +68,11 @@ PLUGIN_HEADER
62#define CB_RESTART (BUTTON_SELECT | BUTTON_PLAY) 68#define CB_RESTART (BUTTON_SELECT | BUTTON_PLAY)
63#define CB_MENU BUTTON_POWER 69#define CB_MENU BUTTON_POWER
64 70
71#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT)
72#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT)
73#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
74#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
75
65#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) 76#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
66#define CB_SELECT BUTTON_SELECT 77#define CB_SELECT BUTTON_SELECT
67#define CB_UP BUTTON_UP 78#define CB_UP BUTTON_UP
@@ -75,6 +86,11 @@ PLUGIN_HEADER
75 86
76#define CB_RC_QUIT BUTTON_RC_STOP 87#define CB_RC_QUIT BUTTON_RC_STOP
77 88
89#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT)
90#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT)
91#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
92#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
93
78#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD 94#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
79#define CB_SELECT BUTTON_SELECT 95#define CB_SELECT BUTTON_SELECT
80#define CB_UP BUTTON_UP 96#define CB_UP BUTTON_UP
@@ -85,6 +101,11 @@ PLUGIN_HEADER
85#define CB_LEVEL BUTTON_EQ 101#define CB_LEVEL BUTTON_EQ
86#define CB_MENU BUTTON_MODE 102#define CB_MENU BUTTON_MODE
87 103
104#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT)
105#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT)
106#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
107#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
108
88#elif CONFIG_KEYPAD == RECORDER_PAD 109#elif CONFIG_KEYPAD == RECORDER_PAD
89#define CB_SELECT BUTTON_PLAY 110#define CB_SELECT BUTTON_PLAY
90#define CB_UP BUTTON_UP 111#define CB_UP BUTTON_UP
@@ -96,6 +117,11 @@ PLUGIN_HEADER
96#define CB_RESTART BUTTON_F3 117#define CB_RESTART BUTTON_F3
97#define CB_MENU BUTTON_OFF 118#define CB_MENU BUTTON_OFF
98 119
120#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT)
121#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT)
122#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
123#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
124
99#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD 125#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
100#define CB_SELECT BUTTON_SELECT 126#define CB_SELECT BUTTON_SELECT
101#define CB_UP BUTTON_UP 127#define CB_UP BUTTON_UP
@@ -107,6 +133,11 @@ PLUGIN_HEADER
107#define CB_RESTART BUTTON_F3 133#define CB_RESTART BUTTON_F3
108#define CB_MENU BUTTON_OFF 134#define CB_MENU BUTTON_OFF
109 135
136#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT)
137#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT)
138#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
139#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
140
110#elif CONFIG_KEYPAD == ONDIO_PAD 141#elif CONFIG_KEYPAD == ONDIO_PAD
111#define CB_SELECT_PRE BUTTON_MENU 142#define CB_SELECT_PRE BUTTON_MENU
112#define CB_SELECT (BUTTON_MENU|BUTTON_REL) 143#define CB_SELECT (BUTTON_MENU|BUTTON_REL)
@@ -120,16 +151,25 @@ PLUGIN_HEADER
120#define CB_RESTART (BUTTON_MENU|BUTTON_LEFT) 151#define CB_RESTART (BUTTON_MENU|BUTTON_LEFT)
121#define CB_MENU BUTTON_OFF 152#define CB_MENU BUTTON_OFF
122 153
154#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT)
155#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT)
156#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
157#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
158
123#elif (CONFIG_KEYPAD == GIGABEAT_PAD) 159#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
124#define CB_SELECT BUTTON_SELECT 160#define CB_SELECT BUTTON_SELECT
125#define CB_UP BUTTON_UP 161#define CB_UP BUTTON_UP
126#define CB_DOWN BUTTON_DOWN 162#define CB_DOWN BUTTON_DOWN
127#define CB_LEFT BUTTON_LEFT 163#define CB_LEFT BUTTON_LEFT
128#define CB_RIGHT BUTTON_RIGHT 164#define CB_RIGHT BUTTON_RIGHT
129#define CB_PLAY BUTTON_A 165#define CB_PLAY BUTTON_POWER
130#define CB_LEVEL BUTTON_VOL_UP 166#define CB_LEVEL BUTTON_MENU
131#define CB_RESTART BUTTON_VOL_DOWN 167#define CB_MENU BUTTON_A
132#define CB_MENU BUTTON_MENU 168
169#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT)
170#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT)
171#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
172#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
133 173
134#elif CONFIG_KEYPAD == IRIVER_H10_PAD 174#elif CONFIG_KEYPAD == IRIVER_H10_PAD
135#define CB_SELECT BUTTON_REW 175#define CB_SELECT BUTTON_REW
@@ -142,6 +182,11 @@ PLUGIN_HEADER
142#define CB_RESTART (BUTTON_REW | BUTTON_PLAY) 182#define CB_RESTART (BUTTON_REW | BUTTON_PLAY)
143#define CB_MENU BUTTON_POWER 183#define CB_MENU BUTTON_POWER
144 184
185#define CB_SCROLL_UP (BUTTON_SCROLL_UP|BUTTON_REPEAT)
186#define CB_SCROLL_DOWN (BUTTON_SCROLL_DOWN|BUTTON_REPEAT)
187#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
188#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
189
145#elif CONFIG_KEYPAD == SANSA_E200_PAD 190#elif CONFIG_KEYPAD == SANSA_E200_PAD
146#define CB_SELECT BUTTON_SELECT 191#define CB_SELECT BUTTON_SELECT
147#define CB_UP BUTTON_UP 192#define CB_UP BUTTON_UP
@@ -153,6 +198,11 @@ PLUGIN_HEADER
153#define CB_RESTART (BUTTON_SELECT | BUTTON_REPEAT) 198#define CB_RESTART (BUTTON_SELECT | BUTTON_REPEAT)
154#define CB_MENU BUTTON_POWER 199#define CB_MENU BUTTON_POWER
155 200
201#define CB_SCROLL_UP (BUTTON_SCROLL_UP|BUTTON_REPEAT)
202#define CB_SCROLL_DOWN (BUTTON_SCROLL_DOWN|BUTTON_REPEAT)
203#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
204#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
205
156#else 206#else
157 #error CHESSBOX: Unsupported keypad 207 #error CHESSBOX: Unsupported keypad
158#endif 208#endif
@@ -203,6 +253,11 @@ PLUGIN_HEADER
203#define COMMAND_SAVE 7 253#define COMMAND_SAVE 7
204#define COMMAND_RESTORE 8 254#define COMMAND_RESTORE 8
205#define COMMAND_RESUME 9 255#define COMMAND_RESUME 9
256#define COMMAND_SELECT 10
257#define COMMAND_NEXT 11
258#define COMMAND_PREV 12
259
260short plugin_mode;
206 261
207/* level+1's string */ 262/* level+1's string */
208const char *level_string[] = { "Level 1: 60 moves / 5 min" , 263const char *level_string[] = { "Level 1: 60 moves / 5 min" ,
@@ -516,16 +571,219 @@ void cb_restoreposition ( void ) {
516 Sdepth = 0; 571 Sdepth = 0;
517} 572}
518 573
574/* ---- show menu in viewer mode---- */
575static int cb_menu_viewer(void)
576{
577 int selection;
578 int result = 0;
579 bool menu_quit = false;
580
581 MENUITEM_STRINGLIST(menu,"Chessbox Menu",NULL,"Restart Game",
582 "Select Other Game", "Quit");
583
584 while(!menu_quit)
585 {
586 switch(rb->do_menu(&menu, &selection))
587 {
588 case 0:
589 menu_quit = true;
590 result = COMMAND_RESTART;
591 break;
592 case 1:
593 result = COMMAND_SELECT;
594 menu_quit = true;
595 break;
596 case 2:
597 result = COMMAND_QUIT;
598 menu_quit = true;
599 break;
600 }
601 }
602 return result;
603}
604
605/* ---- get a command in game mode ---- */
606struct cb_command cb_get_viewer_command (void) {
607 int button;
608 struct cb_command result = { 0, {0,0,0,0,0}, 0 };
609
610 /* main loop */
611 while ( true ) {
612 button = rb->button_get(true);
613 switch (button) {
614#ifdef CB_RC_QUIT
615 case CB_RC_QUIT:
616 result.type = COMMAND_QUIT;
617 return result;
618#endif
619 case CB_MENU:
620 result.type = cb_menu_viewer();
621 return result;
622 case CB_LEFT:
623 result.type = COMMAND_PREV;
624 return result;
625 case CB_RIGHT:
626 result.type = COMMAND_NEXT;
627 return result;
628 }
629 }
630
631}
632
633/* ---- viewer main loop ---- */
634void cb_start_viewer(char* filename){
635 struct pgn_game_node *first_game, *selected_game;
636 struct pgn_ply_node *curr_ply;
637 bool exit_game = false;
638 bool exit_viewer = false;
639 struct cb_command command;
640
641 first_game = pgn_list_games(rb, filename);
642 if (first_game == NULL){
643 rb->splash ( 200 , "No games found !" );
644 return;
645 }
646
647 do {
648 selected_game = pgn_show_game_list(rb, first_game);
649 if (selected_game == NULL){
650 break;
651 }
652
653 pgn_parse_game(rb, filename, selected_game);
654 if (selected_game->first_ply != NULL) {
655
656 /* init board */
657 GNUChess_Initialize();
658
659 /* draw the board */
660 cb_drawboard();
661
662 curr_ply = selected_game->first_ply;
663 exit_game = false;
664
665 do {
666 command = cb_get_viewer_command ();
667 switch (command.type) {
668 case COMMAND_PREV:
669 /* unapply the previous ply */
670 if (curr_ply->prev_node != NULL){
671 curr_ply = curr_ply->prev_node;
672 } else {
673 rb->splash ( 200 , "At the begining of the game" );
674 cb_drawboard();
675 break;
676 }
677 board[locn[curr_ply->row_from][curr_ply->column_from]]
678 = board[locn[curr_ply->row_to][curr_ply->column_to]];
679 color[locn[curr_ply->row_from][curr_ply->column_from]]
680 = color[locn[curr_ply->row_to][curr_ply->column_to]];
681 board[locn[curr_ply->row_to][curr_ply->column_to]] = no_piece;
682 color[locn[curr_ply->row_to][curr_ply->column_to]] = neutral;
683 if (curr_ply->taken_piece != no_piece && !curr_ply->enpassant){
684 board[locn[curr_ply->row_to][curr_ply->column_to]]
685 = curr_ply->taken_piece;
686 color[locn[curr_ply->row_to][curr_ply->column_to]]
687 = ((curr_ply->player==white)?black:white);
688 }
689 if (curr_ply->castle){
690 if (curr_ply->column_to == 6){
691 /* castling kingside */
692 board[locn[curr_ply->row_to][7]] = rook;
693 color[locn[curr_ply->row_to][7]] = curr_ply->player;
694 board[locn[curr_ply->row_to][5]] = no_piece;
695 color[locn[curr_ply->row_to][5]] = neutral;
696 } else {
697 /* castling queenside */
698 board[locn[curr_ply->row_to][0]] = rook;
699 color[locn[curr_ply->row_to][0]] = curr_ply->player;
700 board[locn[curr_ply->row_to][3]] = no_piece;
701 color[locn[curr_ply->row_to][3]] = neutral;
702 }
703 }
704 if (curr_ply->enpassant){
705 board[locn[curr_ply->row_from][curr_ply->column_to]] = pawn;
706 color[locn[curr_ply->row_from][curr_ply->column_to]]
707 = ((curr_ply->player==white)?black:white);
708 }
709 if (curr_ply->promotion){
710 board[locn[curr_ply->row_from][curr_ply->column_from]] = pawn;
711 color[locn[curr_ply->row_from][curr_ply->column_from]]
712 = curr_ply->player;
713 }
714
715 cb_drawboard();
716 break;
717 case COMMAND_NEXT:
718 /* apply the current move */
719 if (curr_ply->player == neutral){
720 rb->splash ( 200 , "At the end of the game" );
721 break;
722 }
723 board[locn[curr_ply->row_to][curr_ply->column_to]]
724 = board[locn[curr_ply->row_from][curr_ply->column_from]];
725 color[locn[curr_ply->row_to][curr_ply->column_to]]
726 = color[locn[curr_ply->row_from][curr_ply->column_from]];
727 board[locn[curr_ply->row_from][curr_ply->column_from]] = no_piece;
728 color[locn[curr_ply->row_from][curr_ply->column_from]] = neutral;
729 if (curr_ply->castle){
730 if (curr_ply->column_to == 6){
731 /* castling kingside */
732 board[locn[curr_ply->row_to][5]] = rook;
733 color[locn[curr_ply->row_to][5]] = curr_ply->player;
734 board[locn[curr_ply->row_to][7]] = no_piece;
735 color[locn[curr_ply->row_to][7]] = neutral;
736 } else {
737 /* castling queenside */
738 board[locn[curr_ply->row_to][3]] = rook;
739 color[locn[curr_ply->row_to][3]] = curr_ply->player;
740 board[locn[curr_ply->row_to][0]] = no_piece;
741 color[locn[curr_ply->row_to][0]] = neutral;
742 }
743 }
744 if (curr_ply->enpassant){
745 board[locn[curr_ply->row_from][curr_ply->column_to]] = no_piece;
746 color[locn[curr_ply->row_from][curr_ply->column_to]] = neutral;
747 }
748 if (curr_ply->promotion){
749 board[locn[curr_ply->row_to][curr_ply->column_to]]
750 = curr_ply->promotion_piece;
751 color[locn[curr_ply->row_to][curr_ply->column_to]]
752 = curr_ply->player;
753 }
754 if (curr_ply->next_node != NULL){
755 curr_ply = curr_ply->next_node;
756 }
757 cb_drawboard();
758 break;
759 case COMMAND_RESTART:
760 GNUChess_Initialize();
761 cb_drawboard();
762 curr_ply = selected_game->first_ply;
763 case COMMAND_SELECT:
764 exit_game = true;
765 break;
766 case COMMAND_QUIT:
767 exit_viewer = true;
768 break;
769 }
770 } while (!exit_game && !exit_viewer);
771 } else {
772 rb->splash ( 200 , "Error parsing game !");
773 }
774 } while (!exit_viewer);
775}
776
519/* ---- show menu ---- */ 777/* ---- show menu ---- */
520static int cb_menu(void) 778static int cb_menu(void)
521{ 779{
522 int selection; 780 int selection;
523 int result = 0; 781 int result = 0;
524 bool menu_quit = false; 782 bool menu_quit = false;
525 783
526 MENUITEM_STRINGLIST(menu,"Chessbox Menu",NULL,"New Game","Resume Game", 784 MENUITEM_STRINGLIST(menu,"Chessbox Menu",NULL,"New Game","Resume Game",
527 "Save Game", "Restore Game", "Quit"); 785 "Save Game", "Restore Game", "Quit");
528 786
529 while(!menu_quit) 787 while(!menu_quit)
530 { 788 {
531 switch(rb->do_menu(&menu, &selection)) 789 switch(rb->do_menu(&menu, &selection))
@@ -555,7 +813,7 @@ static int cb_menu(void)
555 return result; 813 return result;
556} 814}
557 815
558/* ---- main user loop ---- */ 816/* ---- get a command in game mode ---- */
559struct cb_command cb_getcommand (void) { 817struct cb_command cb_getcommand (void) {
560 static short x = 4 , y = 3 ; 818 static short x = 4 , y = 3 ;
561 short c , r , l; 819 short c , r , l;
@@ -690,21 +948,13 @@ struct cb_command cb_getcommand (void) {
690 948
691} 949}
692 950
693/***************************************************************************** 951/* ---- game main loop ---- */
694* plugin entry point. 952void cb_play_game(void) {
695******************************************************************************/
696enum plugin_status plugin_start(struct plugin_api* api, void* parameter) {
697 struct cb_command command; 953 struct cb_command command;
954 char move_buffer[10];
955
698 /* init status */ 956 /* init status */
699 bool exit = false; 957 bool exit = false;
700
701 /* plugin init */
702 (void)parameter;
703 rb = api;
704#if LCD_DEPTH > 1
705 rb->lcd_set_backdrop(NULL);
706#endif
707 /* end of plugin init */
708 958
709 /* load opening book, soon */ 959 /* load opening book, soon */
710 960
@@ -717,7 +967,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) {
717 /* draw the board */ 967 /* draw the board */
718 /* I don't like configscreens, start game inmediatly */ 968 /* I don't like configscreens, start game inmediatly */
719 cb_drawboard(); 969 cb_drawboard();
720 970
721 while (!exit) { 971 while (!exit) {
722 if ( mate ) { 972 if ( mate ) {
723 rb->splash ( 500 , "Checkmate!" ); 973 rb->splash ( 500 , "Checkmate!" );
@@ -737,7 +987,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) {
737#ifdef HAVE_ADJUSTABLE_CPU_FREQ 987#ifdef HAVE_ADJUSTABLE_CPU_FREQ
738 rb->cpu_boost ( true ); 988 rb->cpu_boost ( true );
739#endif 989#endif
740 SelectMove ( computer , 0 , cb_wt_callback ); 990 SelectMove ( computer , 0 , cb_wt_callback, move_buffer);
741#ifdef HAVE_ADJUSTABLE_CPU_FREQ 991#ifdef HAVE_ADJUSTABLE_CPU_FREQ
742 rb->cpu_boost ( false ); 992 rb->cpu_boost ( false );
743#endif 993#endif
@@ -766,7 +1016,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) {
766 1016
767 /* init board */ 1017 /* init board */
768 GNUChess_Initialize(); 1018 GNUChess_Initialize();
769 1019
770 /* restore saved position, if saved */ 1020 /* restore saved position, if saved */
771 cb_restoreposition(); 1021 cb_restoreposition();
772 1022
@@ -784,7 +1034,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) {
784#ifdef HAVE_ADJUSTABLE_CPU_FREQ 1034#ifdef HAVE_ADJUSTABLE_CPU_FREQ
785 rb->cpu_boost ( true ); 1035 rb->cpu_boost ( true );
786#endif 1036#endif
787 SelectMove ( computer , 0 , cb_wt_callback ); 1037 SelectMove ( computer , 0 , cb_wt_callback , move_buffer );
788#ifdef HAVE_ADJUSTABLE_CPU_FREQ 1038#ifdef HAVE_ADJUSTABLE_CPU_FREQ
789 rb->cpu_boost ( false ); 1039 rb->cpu_boost ( false );
790#endif 1040#endif
@@ -806,6 +1056,32 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) {
806 1056
807 cb_saveposition(); 1057 cb_saveposition();
808 rb->lcd_setfont(FONT_UI); 1058 rb->lcd_setfont(FONT_UI);
1059
1060}
1061
1062/*****************************************************************************
1063* plugin entry point.
1064******************************************************************************/
1065enum plugin_status plugin_start(struct plugin_api* api, void* parameter) {
1066
1067 /* plugin init */
1068
1069 rb = api;
1070#if LCD_DEPTH > 1
1071 rb->lcd_set_backdrop(NULL);
1072#endif
1073
1074 /* end of plugin init */
1075
1076 /* if the plugin was invoked as a viewer, parse the file and show the game list
1077 * else, start playing a game
1078 */
1079 if (parameter != NULL) {
1080 cb_start_viewer((char *)parameter);
1081 } else {
1082 cb_play_game();
1083 }
1084
809 return PLUGIN_OK; 1085 return PLUGIN_OK;
810} 1086}
811 1087
diff --git a/apps/plugins/chessbox/gnuchess.c b/apps/plugins/chessbox/gnuchess.c
index 4f86863ac8..e72a489a0d 100644
--- a/apps/plugins/chessbox/gnuchess.c
+++ b/apps/plugins/chessbox/gnuchess.c
@@ -1003,7 +1003,7 @@ register int sq;
1003/* ............ MOVE GENERATION & SEARCH ROUTINES .............. */ 1003/* ............ MOVE GENERATION & SEARCH ROUTINES .............. */
1004 1004
1005 1005
1006int SelectMove( short side, short iop , void (*callback)(void)) 1006int SelectMove( short side, short iop , void (*callback)(void), char* move_buffer)
1007 1007
1008/* 1008/*
1009 Select a move by calling function search() at progressively deeper 1009 Select a move by calling function search() at progressively deeper
@@ -1114,6 +1114,13 @@ static short i,alpha,beta,score,tempb,tempc,tempsf,tempst,xside,rpt;
1114 } 1114 }
1115 else mvstr1[0] = '\0'; 1115 else mvstr1[0] = '\0';
1116 /*OutputMove();*/ 1116 /*OutputMove();*/
1117
1118 short index;
1119 for (index=0;index<4;index++){
1120 move_buffer[index] = mvstr1[index];
1121 }
1122 move_buffer[index] = '\0';
1123
1117 if (score == -9999 || score == 9998) mate = true; 1124 if (score == -9999 || score == 9998) mate = true;
1118 if (mate) hint = 0; 1125 if (mate) hint = 0;
1119 if (root->flags & cstlmask) Game50 = GameCnt; 1126 if (root->flags & cstlmask) Game50 = GameCnt;
diff --git a/apps/plugins/chessbox/gnuchess.h b/apps/plugins/chessbox/gnuchess.h
index 3bca031ef7..5e8974f3b7 100644
--- a/apps/plugins/chessbox/gnuchess.h
+++ b/apps/plugins/chessbox/gnuchess.h
@@ -50,7 +50,7 @@ extern struct plugin_api* rb;
50void SetTimeControl(void); 50void SetTimeControl(void);
51void GNUChess_Initialize(void); 51void GNUChess_Initialize(void);
52int VerifyMove(char s[],short iop,unsigned short *mv); 52int VerifyMove(char s[],short iop,unsigned short *mv);
53int SelectMove ( short side, short iop , void (*callback)(void) ); 53int SelectMove ( short side, short iop , void (*callback)(void), char *move_buffer );
54void InitializeStats ( void ); 54void InitializeStats ( void );
55 55
56#endif 56#endif
diff --git a/apps/plugins/viewers.config b/apps/plugins/viewers.config
index 4abdfb106f..7ae8707984 100644
--- a/apps/plugins/viewers.config
+++ b/apps/plugins/viewers.config
@@ -16,6 +16,7 @@ m3u,viewers/iriverify,-
16mid,viewers/midiplay,7 16mid,viewers/midiplay,7
17rmi,viewers/midiplay,7 17rmi,viewers/midiplay,7
18rsp,viewers/searchengine,8 18rsp,viewers/searchengine,8
19pgn,rocks/chessbox,1
19ss,rocks/sudoku,1 20ss,rocks/sudoku,1
20wav,viewers/wav2wv,- 21wav,viewers/wav2wv,-
21wav,viewers/mp3_encoder,- 22wav,viewers/mp3_encoder,-