diff options
-rw-r--r-- | apps/plugins/chessbox/chessbox.c | 112 | ||||
-rw-r--r-- | apps/plugins/chessbox/chessbox_pgn.c | 70 | ||||
-rw-r--r-- | apps/plugins/chessbox/gnuchess.c | 9 | ||||
-rw-r--r-- | apps/plugins/chessbox/gnuchess.h | 7 |
4 files changed, 164 insertions, 34 deletions
diff --git a/apps/plugins/chessbox/chessbox.c b/apps/plugins/chessbox/chessbox.c index 86ca5a355e..7d42b72c1b 100644 --- a/apps/plugins/chessbox/chessbox.c +++ b/apps/plugins/chessbox/chessbox.c | |||
@@ -26,8 +26,7 @@ | |||
26 | #if (MEMORYSIZE > 8) /* Lowmem doesn't have playback in chessbox */ | 26 | #if (MEMORYSIZE > 8) /* Lowmem doesn't have playback in chessbox */ |
27 | #define HAVE_PLAYBACK_CONTROL | 27 | #define HAVE_PLAYBACK_CONTROL |
28 | #endif | 28 | #endif |
29 | 29 | /*#define CHESSBOX_SAVE_FILE_DBG PLUGIN_GAMES_DATA_DIR "/chessbox_dbg.save"*/ | |
30 | |||
31 | #ifdef HAVE_PLAYBACK_CONTROL | 30 | #ifdef HAVE_PLAYBACK_CONTROL |
32 | #include "lib/playback_control.h" | 31 | #include "lib/playback_control.h" |
33 | #endif | 32 | #endif |
@@ -265,12 +264,117 @@ static void cb_levelup ( void ) { | |||
265 | rb->splash ( HZ/2 , level_string[Level-1] ); | 264 | rb->splash ( HZ/2 , level_string[Level-1] ); |
266 | }; | 265 | }; |
267 | 266 | ||
267 | #ifdef CHESSBOX_SAVE_FILE_DBG | ||
268 | /* Save a debug file with names, variables, and sizes */ | ||
269 | static void cb_saveposition_dbg ( void ) | ||
270 | { | ||
271 | int fd; | ||
272 | short sq,i,c; | ||
273 | unsigned short temp; | ||
274 | char buf[32]="\0"; | ||
275 | int ch_ct = 0; | ||
276 | |||
277 | rb->splash ( 0 , "Saving debug" ); | ||
278 | fd = rb->open(CHESSBOX_SAVE_FILE_DBG, O_WRONLY|O_CREAT, 0666); | ||
279 | ch_ct = rb->snprintf(buf,31,"computer = %d, %d bytes\n",computer+1, | ||
280 | sizeof(computer)); | ||
281 | rb->write(fd, buf, ch_ct); | ||
282 | ch_ct = rb->snprintf(buf,31,"opponent = %d, %d bytes\n",opponent+1, | ||
283 | sizeof(opponent)); | ||
284 | rb->write(fd, buf, ch_ct); | ||
285 | ch_ct = rb->snprintf(buf,31,"Game50 = %d, %d bytes\n",Game50, | ||
286 | sizeof(Game50)); | ||
287 | rb->write(fd, buf, ch_ct); | ||
288 | ch_ct = rb->snprintf(buf,31,"CastldWht = %d, %d bytes\n",castld[white], | ||
289 | sizeof(castld[white])); | ||
290 | rb->write(fd, buf, ch_ct); | ||
291 | ch_ct = rb->snprintf(buf,31,"CastldBlk = %d, %d bytes\n",castld[black], | ||
292 | sizeof(castld[black])); | ||
293 | rb->write(fd, buf, ch_ct); | ||
294 | ch_ct = rb->snprintf(buf,31,"KngMovedWht = %d, %d bytes\n",kingmoved[white], | ||
295 | sizeof(kingmoved[white])); | ||
296 | rb->write(fd, buf, ch_ct); | ||
297 | ch_ct = rb->snprintf(buf,31,"KngMovedBlk = %d, %d bytes\n",kingmoved[black], | ||
298 | sizeof(kingmoved[black])); | ||
299 | rb->write(fd, buf, ch_ct); | ||
300 | ch_ct = rb->snprintf(buf,31,"WithBook = %d, %d bytes\n",withbook, | ||
301 | sizeof(withbook)); | ||
302 | rb->write(fd, buf, ch_ct); | ||
303 | ch_ct = rb->snprintf(buf,31,"Lvl = %ld, %d bytes\n",Level, | ||
304 | sizeof(Level)); | ||
305 | rb->write(fd, buf, ch_ct); | ||
306 | ch_ct = rb->snprintf(buf,31,"TCflag = %d, %d bytes\n",TCflag, | ||
307 | sizeof(TCflag)); | ||
308 | rb->write(fd, buf, ch_ct); | ||
309 | ch_ct = rb->snprintf(buf,31,"OpTime = %d, %d bytes\n",OperatorTime, | ||
310 | sizeof(OperatorTime)); | ||
311 | rb->write(fd, buf, ch_ct); | ||
312 | ch_ct = rb->snprintf(buf,31,"TmCtlClkWht = %ld, %d bytes\n", | ||
313 | TimeControl.clock[white], sizeof(TimeControl.clock[white])); | ||
314 | rb->write(fd, buf, ch_ct); | ||
315 | ch_ct = rb->snprintf(buf,31,"TmCtlClkBlk = %ld, %d bytes\n", | ||
316 | TimeControl.clock[black], sizeof(TimeControl.clock[black])); | ||
317 | rb->write(fd, buf, ch_ct); | ||
318 | ch_ct = rb->snprintf(buf,31,"TmCtlMovesWht = %d, %d bytes\n", | ||
319 | TimeControl.moves[white], sizeof(TimeControl.moves[white])); | ||
320 | rb->write(fd, buf, ch_ct); | ||
321 | ch_ct = rb->snprintf(buf,31,"TmCtlMovesBlk = %d, %d bytes\n", | ||
322 | TimeControl.moves[black], sizeof(TimeControl.moves[black])); | ||
323 | rb->write(fd, buf, ch_ct); | ||
324 | for (sq = 0; sq < 64; sq++) { | ||
325 | if (color[sq] == neutral) c = 0; else c = color[sq]+1; | ||
326 | temp = 256*board[sq] + c ; | ||
327 | ch_ct = rb->snprintf(buf,31,"sq %02d = %d, %d bytes\n",sq, temp, | ||
328 | sizeof(temp)); | ||
329 | rb->write(fd, buf, ch_ct); | ||
330 | } | ||
331 | for (i = 0; i <= GameCnt; i++) { | ||
332 | ch_ct = rb->snprintf(buf,31,"GameCt %d, %d bytes\n",i, | ||
333 | sizeof(GameCnt)); | ||
334 | rb->write(fd, buf, ch_ct); | ||
335 | if (GameList[i].color == neutral) | ||
336 | { | ||
337 | c = 0; | ||
338 | ch_ct = rb->snprintf(buf,31,"color = %d, %d bytes\n",c, | ||
339 | sizeof(c)); | ||
340 | rb->write(fd, buf, ch_ct); | ||
341 | } | ||
342 | else | ||
343 | c = GameList[i].color + 1; | ||
344 | ch_ct = rb->snprintf(buf,31,"gmove = %d, %d bytes\n",GameList[i].gmove, | ||
345 | sizeof(GameList[i].gmove)); | ||
346 | rb->write(fd, buf, ch_ct); | ||
347 | ch_ct = rb->snprintf(buf,31,"score = %d, %d bytes\n",GameList[i].score, | ||
348 | sizeof(GameList[i].score)); | ||
349 | rb->write(fd, buf, ch_ct); | ||
350 | ch_ct = rb->snprintf(buf,31,"depth = %d, %d bytes\n",GameList[i].depth, | ||
351 | sizeof(GameList[i].depth)); | ||
352 | rb->write(fd, buf, ch_ct); | ||
353 | ch_ct = rb->snprintf(buf,31,"nodes = %ld, %d bytes\n",GameList[i].nodes, | ||
354 | sizeof(GameList[i].nodes)); | ||
355 | rb->write(fd, buf, ch_ct); | ||
356 | ch_ct = rb->snprintf(buf,31,"time = %d, %d bytes\n",GameList[i].time, | ||
357 | sizeof(GameList[i].time)); | ||
358 | rb->write(fd, buf, ch_ct); | ||
359 | ch_ct = rb->snprintf(buf,31,"piece = %d, %d bytes\n",GameList[i].piece, | ||
360 | sizeof(GameList[i].piece)); | ||
361 | rb->write(fd, buf, ch_ct); | ||
362 | ch_ct = rb->snprintf(buf,31,"color = %d, %d bytes\n",c,sizeof(c)); | ||
363 | rb->write(fd, buf, ch_ct); | ||
364 | } | ||
365 | rb->close(fd); | ||
366 | |||
367 | } | ||
368 | #endif | ||
369 | |||
268 | /* ---- Save current position ---- */ | 370 | /* ---- Save current position ---- */ |
269 | static void cb_saveposition ( void ) { | 371 | static void cb_saveposition ( void ) { |
270 | int fd; | 372 | int fd; |
271 | short sq,i,c; | 373 | short sq,i,c; |
272 | unsigned short temp; | 374 | unsigned short temp; |
273 | 375 | #ifdef CHESSBOX_SAVE_FILE_DBG | |
376 | cb_saveposition_dbg(); | ||
377 | #endif | ||
274 | rb->splash ( 0 , "Saving position" ); | 378 | rb->splash ( 0 , "Saving position" ); |
275 | 379 | ||
276 | fd = rb->open(SAVE_FILE, O_WRONLY|O_CREAT, 0666); | 380 | fd = rb->open(SAVE_FILE, O_WRONLY|O_CREAT, 0666); |
@@ -356,7 +460,7 @@ static void cb_restoreposition ( void ) { | |||
356 | else | 460 | else |
357 | --color[sq]; | 461 | --color[sq]; |
358 | } | 462 | } |
359 | GameCnt = -1; | 463 | GameCnt = MAX_GAME_CNT - 1; /*uchar rollsover to 0 after 255*/ |
360 | while (rb->read(fd, &(GameList[++GameCnt].gmove), | 464 | while (rb->read(fd, &(GameList[++GameCnt].gmove), |
361 | sizeof(GameList[GameCnt].gmove)) > 0) { | 465 | sizeof(GameList[GameCnt].gmove)) > 0) { |
362 | rb->read(fd, &(GameList[GameCnt].score), | 466 | rb->read(fd, &(GameList[GameCnt].score), |
diff --git a/apps/plugins/chessbox/chessbox_pgn.c b/apps/plugins/chessbox/chessbox_pgn.c index 98d9e29431..f5f19e2688 100644 --- a/apps/plugins/chessbox/chessbox_pgn.c +++ b/apps/plugins/chessbox/chessbox_pgn.c | |||
@@ -159,9 +159,10 @@ static char pgn_from_piece(unsigned short piece, unsigned short color){ | |||
159 | return pgn_piece; | 159 | return pgn_piece; |
160 | } | 160 | } |
161 | 161 | ||
162 | static void pgn_to_coords(struct pgn_ply_node* ply){ | 162 | static bool pgn_to_coords(struct pgn_ply_node* ply){ |
163 | bool success = true; | ||
163 | unsigned short str_length = rb->strlen(ply->pgn_text); | 164 | unsigned short str_length = rb->strlen(ply->pgn_text); |
164 | char str[10]; | 165 | char str[9]; |
165 | rb->strcpy(str,ply->pgn_text); | 166 | rb->strcpy(str,ply->pgn_text); |
166 | ply->column_from = 0xFF; | 167 | ply->column_from = 0xFF; |
167 | ply->row_from = 0xFF; | 168 | ply->row_from = 0xFF; |
@@ -172,6 +173,7 @@ static void pgn_to_coords(struct pgn_ply_node* ply){ | |||
172 | ply->enpassant = false; | 173 | ply->enpassant = false; |
173 | ply->castle = false; | 174 | ply->castle = false; |
174 | ply->promotion = false; | 175 | ply->promotion = false; |
176 | |||
175 | unsigned short i, j, piece; | 177 | unsigned short i, j, piece; |
176 | bool found = false; | 178 | bool found = false; |
177 | 179 | ||
@@ -342,16 +344,25 @@ static void pgn_to_coords(struct pgn_ply_node* ply){ | |||
342 | /* leave a very complete log of the parsing of the game while it gets stable */ | 344 | /* leave a very complete log of the parsing of the game while it gets stable */ |
343 | for (i=0;i<8;i++){ | 345 | for (i=0;i<8;i++){ |
344 | for (j=0;j<8;j++) { | 346 | for (j=0;j<8;j++) { |
347 | |||
345 | rb->fdprintf(loghandler,"%c",pgn_from_piece(board[locn[7-i][j]],color[locn[7-i][j]])); | 348 | rb->fdprintf(loghandler,"%c",pgn_from_piece(board[locn[7-i][j]],color[locn[7-i][j]])); |
346 | } | 349 | } |
347 | rb->fdprintf(loghandler,"\n"); | 350 | rb->fdprintf(loghandler,"\n"); |
348 | } | 351 | } |
349 | 352 | /* check bounds of row and columns should be 0-7 bad .pgn returns 0xFF */ | |
353 | if ((ply->row_to | ply->column_to | ply->row_from | ply->column_from) < 8) | ||
354 | { | ||
350 | /* update the board */ | 355 | /* update the board */ |
351 | board[locn[ply->row_to][ply->column_to]] = board[locn[ply->row_from][ply->column_from]]; | 356 | board[locn[ply->row_to][ply->column_to]] = |
352 | color[locn[ply->row_to][ply->column_to]] = color[locn[ply->row_from][ply->column_from]]; | 357 | board[locn[ply->row_from][ply->column_from]]; |
353 | board[locn[ply->row_from][ply->column_from]] = no_piece; | 358 | color[locn[ply->row_to][ply->column_to]] = |
354 | color[locn[ply->row_from][ply->column_from]] = neutral; | 359 | color[locn[ply->row_from][ply->column_from]]; |
360 | board[locn[ply->row_from][ply->column_from]] = no_piece; | ||
361 | color[locn[ply->row_from][ply->column_from]] = neutral; | ||
362 | } | ||
363 | else | ||
364 | success = false; /*ERROR*/ | ||
365 | return success; | ||
355 | } | 366 | } |
356 | 367 | ||
357 | static void coords_to_pgn(struct pgn_ply_node* ply){ | 368 | static void coords_to_pgn(struct pgn_ply_node* ply){ |
@@ -657,9 +668,10 @@ void pgn_parse_game(const char* filename, | |||
657 | struct pgn_game_node* selected_game){ | 668 | struct pgn_game_node* selected_game){ |
658 | struct pgn_ply_node size_ply, *first_ply = NULL; | 669 | struct pgn_ply_node size_ply, *first_ply = NULL; |
659 | struct pgn_ply_node *temp_ply = NULL, *curr_node = NULL; | 670 | struct pgn_ply_node *temp_ply = NULL, *curr_node = NULL; |
671 | bool success = true; | ||
660 | int fhandler, i; | 672 | int fhandler, i; |
661 | char line_buffer[128]; | 673 | char line_buffer[128]; |
662 | char token_buffer[10]; | 674 | char token_buffer[9]; |
663 | unsigned short pos; | 675 | unsigned short pos; |
664 | unsigned short curr_player = white; | 676 | unsigned short curr_player = white; |
665 | 677 | ||
@@ -685,24 +697,35 @@ void pgn_parse_game(const char* filename, | |||
685 | || (token_buffer[0] >= 'a' && token_buffer[0] <= 'z') | 697 | || (token_buffer[0] >= 'a' && token_buffer[0] <= 'z') |
686 | || (token_buffer[0] == '0' && token_buffer[2] != '1')){ | 698 | || (token_buffer[0] == '0' && token_buffer[2] != '1')){ |
687 | temp_ply = (struct pgn_ply_node *)pl_malloc(sizeof size_ply); | 699 | temp_ply = (struct pgn_ply_node *)pl_malloc(sizeof size_ply); |
688 | temp_ply->player = curr_player; | 700 | /* Null pointer can be returned from pl_malloc check for this */ |
689 | curr_player = (curr_player==white)?black:white; | 701 | if (temp_ply) |
690 | rb->strcpy(temp_ply->pgn_text, token_buffer); | 702 | { |
691 | pgn_to_coords(temp_ply); | 703 | temp_ply->player = curr_player; |
692 | temp_ply->prev_node = NULL; | 704 | curr_player = (curr_player==white)?black:white; |
693 | temp_ply->next_node = NULL; | 705 | rb->strcpy(temp_ply->pgn_text, token_buffer); |
694 | if (first_ply == NULL) { | 706 | success = pgn_to_coords(temp_ply); |
695 | first_ply = curr_node = temp_ply; | 707 | temp_ply->prev_node = NULL; |
696 | } else { | 708 | temp_ply->next_node = NULL; |
697 | curr_node->next_node = temp_ply; | 709 | if (first_ply == NULL && success) { |
698 | temp_ply->prev_node = curr_node; | 710 | first_ply = curr_node = temp_ply; |
699 | curr_node = temp_ply; | 711 | } else if (success){ |
700 | } | 712 | curr_node->next_node = temp_ply; |
701 | rb->fdprintf(loghandler, | 713 | temp_ply->prev_node = curr_node; |
702 | "player: %u; pgn: %s; from: %u,%u; to: %u,%u; taken: %u.\n", | 714 | curr_node = temp_ply; |
715 | } else{ | ||
716 | /* bad .pgn break loop and notify user */ | ||
717 | first_ply = NULL; | ||
718 | break; | ||
719 | } | ||
720 | |||
721 | rb->fdprintf(loghandler, | ||
722 | "player: %u; pgn: %s; from: %u,%u; to: %u,%u; taken: %u.\n", | ||
703 | temp_ply->player, temp_ply->pgn_text, temp_ply->row_from, | 723 | temp_ply->player, temp_ply->pgn_text, temp_ply->row_from, |
704 | temp_ply->column_from, temp_ply->row_to, | 724 | temp_ply->column_from, temp_ply->row_to, |
705 | temp_ply->column_to, temp_ply->taken_piece); | 725 | temp_ply->column_to, temp_ply->taken_piece); |
726 | } | ||
727 | else | ||
728 | first_ply = NULL; | ||
706 | } | 729 | } |
707 | } | 730 | } |
708 | } | 731 | } |
@@ -719,6 +742,7 @@ void pgn_parse_game(const char* filename, | |||
719 | curr_node->next_node = temp_ply; | 742 | curr_node->next_node = temp_ply; |
720 | } | 743 | } |
721 | selected_game->first_ply = first_ply; | 744 | selected_game->first_ply = first_ply; |
745 | |||
722 | rb->close(fhandler); | 746 | rb->close(fhandler); |
723 | } | 747 | } |
724 | 748 | ||
diff --git a/apps/plugins/chessbox/gnuchess.c b/apps/plugins/chessbox/gnuchess.c index 5e67df4f39..4b21cd785c 100644 --- a/apps/plugins/chessbox/gnuchess.c +++ b/apps/plugins/chessbox/gnuchess.c | |||
@@ -103,8 +103,9 @@ short INCscore; | |||
103 | short HasPawn[2],HasKnight[2],HasBishop[2],HasRook[2],HasQueen[2]; | 103 | short HasPawn[2],HasKnight[2],HasBishop[2],HasRook[2],HasQueen[2]; |
104 | short ChkFlag[maxdepth],CptrFlag[maxdepth],PawnThreat[maxdepth]; | 104 | short ChkFlag[maxdepth],CptrFlag[maxdepth],PawnThreat[maxdepth]; |
105 | short Pscore[maxdepth],Tscore[maxdepth],Threat[maxdepth]; | 105 | short Pscore[maxdepth],Tscore[maxdepth],Threat[maxdepth]; |
106 | struct GameRec GameList[240]; | 106 | struct GameRec GameList[MAX_GAME_CNT]; |
107 | short GameCnt,Game50,epsquare,lpost,rcptr,contempt; | 107 | unsigned char GameCnt; /*Bug fix now rolls over instead of overflow*/ |
108 | short Game50,epsquare,lpost,rcptr,contempt; | ||
108 | short MaxSearchDepth,Xscore; | 109 | short MaxSearchDepth,Xscore; |
109 | struct TimeControlRec TimeControl; | 110 | struct TimeControlRec TimeControl; |
110 | short TCflag,TCmoves,TCminutes,OperatorTime; | 111 | short TCflag,TCmoves,TCminutes,OperatorTime; |
@@ -1132,7 +1133,7 @@ static short i,alpha,beta,score,tempb,tempc,tempsf,tempst,xside,rpt; | |||
1132 | if (--TimeControl.moves[side] == 0) SetTimeControl(); | 1133 | if (--TimeControl.moves[side] == 0) SetTimeControl(); |
1133 | } | 1134 | } |
1134 | if ((root->flags & draw) && bothsides) quit = true; | 1135 | if ((root->flags & draw) && bothsides) quit = true; |
1135 | if (GameCnt > 238) quit = true; | 1136 | if (GameCnt > MAX_GAME_CNT - 2) quit = true; |
1136 | player = xside; | 1137 | player = xside; |
1137 | Sdepth = 0; | 1138 | Sdepth = 0; |
1138 | return(0); | 1139 | return(0); |
@@ -2319,7 +2320,7 @@ void NewGame() { | |||
2319 | xwndw = 90; | 2320 | xwndw = 90; |
2320 | MaxSearchDepth = 29; | 2321 | MaxSearchDepth = 29; |
2321 | contempt = 0; | 2322 | contempt = 0; |
2322 | GameCnt = -1; Game50 = 0; | 2323 | GameCnt = MAX_GAME_CNT - 1; Game50 = 0; |
2323 | Zwmtl = Zbmtl = 0; | 2324 | Zwmtl = Zbmtl = 0; |
2324 | Developed[white] = Developed[black] = false; | 2325 | Developed[white] = Developed[black] = false; |
2325 | castld[white] = castld[black] = false; | 2326 | castld[white] = castld[black] = false; |
diff --git a/apps/plugins/chessbox/gnuchess.h b/apps/plugins/chessbox/gnuchess.h index b7a3a309f8..f52e1b1a0a 100644 --- a/apps/plugins/chessbox/gnuchess.h +++ b/apps/plugins/chessbox/gnuchess.h | |||
@@ -1,7 +1,7 @@ | |||
1 | 1 | ||
2 | #ifndef _GNUCHESS_H_ | 2 | #ifndef _GNUCHESS_H_ |
3 | #define _GNUCHESS_H_ | 3 | #define _GNUCHESS_H_ |
4 | 4 | #define MAX_GAME_CNT 256 | |
5 | #define neutral 2 | 5 | #define neutral 2 |
6 | #define white 0 | 6 | #define white 0 |
7 | #define black 1 | 7 | #define black 1 |
@@ -39,9 +39,10 @@ extern bool withbook; | |||
39 | extern long Level; | 39 | extern long Level; |
40 | extern short TCflag,TCmoves,TCminutes; | 40 | extern short TCflag,TCmoves,TCminutes; |
41 | extern short timeout; | 41 | extern short timeout; |
42 | extern short GameCnt,Game50,castld[2],kingmoved[2],OperatorTime; | 42 | extern unsigned char GameCnt; /* Bug fix rolls over at 255 instead of overflow */ |
43 | extern short Game50,castld[2],kingmoved[2],OperatorTime; | ||
43 | extern struct TimeControlRec TimeControl; | 44 | extern struct TimeControlRec TimeControl; |
44 | extern struct GameRec GameList[240]; | 45 | extern struct GameRec GameList[MAX_GAME_CNT]; |
45 | 46 | ||
46 | /* ---- The beginning of a GNUChess v2 APIfication ---- */ | 47 | /* ---- The beginning of a GNUChess v2 APIfication ---- */ |
47 | void SetTimeControl(void); | 48 | void SetTimeControl(void); |