diff options
author | Nils Wallménius <nils@rockbox.org> | 2007-05-29 16:33:16 +0000 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2007-05-29 16:33:16 +0000 |
commit | 3e190c814ad7c4d53b9917c324329c8477297cb7 (patch) | |
tree | 8eb2f5053d06d51a2ecfc52eb7ac439c2ea5d249 | |
parent | 6fd3d96309f73e31168a900e592f5d94231762a4 (diff) | |
download | rockbox-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/Makefile | 2 | ||||
-rw-r--r-- | apps/plugins/chessbox/chessbox.c | 324 | ||||
-rw-r--r-- | apps/plugins/chessbox/gnuchess.c | 9 | ||||
-rw-r--r-- | apps/plugins/chessbox/gnuchess.h | 2 | ||||
-rw-r--r-- | apps/plugins/viewers.config | 1 |
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 | ||
19 | LINKFILE := $(OBJDIR)/link.lds | 19 | LINKFILE := $(OBJDIR)/link.lds |
20 | DEPFILE = $(OBJDIR)/dep-chessbox | 20 | DEPFILE = $(OBJDIR)/dep-chessbox |
21 | SRC = chessbox.c gnuchess.c opening.c | 21 | SRC = chessbox.c gnuchess.c opening.c chessbox_pgn.c |
22 | 22 | ||
23 | SOURCES = $(SRC) | 23 | SOURCES = $(SRC) |
24 | OBJS := $(SRC:%.c=$(OBJDIR)/%.o) | 24 | OBJS := $(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 */ |
30 | struct cb_command { | 31 | struct 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 | |||
260 | short plugin_mode; | ||
206 | 261 | ||
207 | /* level+1's string */ | 262 | /* level+1's string */ |
208 | const char *level_string[] = { "Level 1: 60 moves / 5 min" , | 263 | const 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---- */ | ||
575 | static 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 ---- */ | ||
606 | struct 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 ---- */ | ||
634 | void 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 ---- */ |
520 | static int cb_menu(void) | 778 | static 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 ---- */ |
559 | struct cb_command cb_getcommand (void) { | 817 | struct 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. | 952 | void cb_play_game(void) { |
695 | ******************************************************************************/ | ||
696 | enum 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 | ******************************************************************************/ | ||
1065 | enum 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 | ||
1006 | int SelectMove( short side, short iop , void (*callback)(void)) | 1006 | int 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; | |||
50 | void SetTimeControl(void); | 50 | void SetTimeControl(void); |
51 | void GNUChess_Initialize(void); | 51 | void GNUChess_Initialize(void); |
52 | int VerifyMove(char s[],short iop,unsigned short *mv); | 52 | int VerifyMove(char s[],short iop,unsigned short *mv); |
53 | int SelectMove ( short side, short iop , void (*callback)(void) ); | 53 | int SelectMove ( short side, short iop , void (*callback)(void), char *move_buffer ); |
54 | void InitializeStats ( void ); | 54 | void 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,- | |||
16 | mid,viewers/midiplay,7 | 16 | mid,viewers/midiplay,7 |
17 | rmi,viewers/midiplay,7 | 17 | rmi,viewers/midiplay,7 |
18 | rsp,viewers/searchengine,8 | 18 | rsp,viewers/searchengine,8 |
19 | pgn,rocks/chessbox,1 | ||
19 | ss,rocks/sudoku,1 | 20 | ss,rocks/sudoku,1 |
20 | wav,viewers/wav2wv,- | 21 | wav,viewers/wav2wv,- |
21 | wav,viewers/mp3_encoder,- | 22 | wav,viewers/mp3_encoder,- |