From 789e01bd069bc59b30d24534843090103e7df482 Mon Sep 17 00:00:00 2001 From: Marcoen Hirschberg Date: Tue, 14 Mar 2006 20:55:59 +0000 Subject: latest update by Miguel Arevalo git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9037 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/chessbox/chessbox.c | 183 ++++++++++++++++++++++++++++++++++----- apps/plugins/chessbox/gnuchess.c | 16 +--- apps/plugins/chessbox/gnuchess.h | 19 +++- 3 files changed, 181 insertions(+), 37 deletions(-) (limited to 'apps/plugins/chessbox') diff --git a/apps/plugins/chessbox/chessbox.c b/apps/plugins/chessbox/chessbox.c index 2e863b957b..17b505001a 100644 --- a/apps/plugins/chessbox/chessbox.c +++ b/apps/plugins/chessbox/chessbox.c @@ -5,6 +5,7 @@ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ +* $Id$ * * Copyright (C) 2006 Miguel A. Arévalo * Color graphics from eboard @@ -46,6 +47,7 @@ PLUGIN_HEADER #define CB_RIGHT BUTTON_RIGHT #define CB_PLAY (BUTTON_SELECT | BUTTON_PLAY) #define CB_LEVEL (BUTTON_SELECT | BUTTON_RIGHT) +#define CB_RESTART (BUTTON_SELECT | BUTTON_LEFT) #define CB_QUIT (BUTTON_SELECT | BUTTON_MENU) #elif CONFIG_KEYPAD == IAUDIO_X5_PAD @@ -56,6 +58,7 @@ PLUGIN_HEADER #define CB_RIGHT BUTTON_RIGHT #define CB_PLAY BUTTON_PLAY #define CB_LEVEL BUTTON_REC +#define CB_RESTART BUTTON_SELECT #define CB_QUIT BUTTON_POWER #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) @@ -66,6 +69,7 @@ PLUGIN_HEADER #define CB_RIGHT BUTTON_RIGHT #define CB_PLAY BUTTON_ON #define CB_LEVEL BUTTON_MODE +#define CB_RESTART BUTTON_REC #define CB_QUIT BUTTON_OFF #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD @@ -138,14 +142,31 @@ PLUGIN_HEADER #define XOFS ((LCD_WIDTH-8*TILE_WIDTH)/2) #define YOFS ((LCD_HEIGHT-8*TILE_HEIGHT)/2) +/* save files */ +#define SAVE_FILE PLUGIN_DIR "/chessbox.save" + /* commands enum */ #define COMMAND_NOP 0 #define COMMAND_MOVE 1 #define COMMAND_PLAY 2 #define COMMAND_LEVEL 3 -/*#define COMMAND_RESTART 4*/ +#ifdef CB_RESTART + #define COMMAND_RESTART 4 +#endif #define COMMAND_QUIT 5 +/* level+1's string */ +const char *level_string[] = { "Level 1: 60 moves / 5 min" , + "Level 2: 60 moves / 15 min" , + "Level 3: 60 moves / 30 min" , + "Level 4: 40 moves / 30 min" , + "Level 5: 40 moves / 60 min" , + "Level 6: 40 moves / 120 min" , + "Level 7: 40 moves / 240 min" , + "Level 8: 1 move / 15 min" , + "Level 9: 1 move / 60 min" , + "Level 10: 1 move / 600 min" }; + /* "While thinking" command */ int wt_command = COMMAND_NOP; @@ -262,69 +283,188 @@ void cb_wt_callback ( void ) { } } -/* ---- increase playing level ---- */ -void cb_levelup ( void ) { - Level ++; - if ( Level == 8 ) Level = 1; +/* ---- set playing parameters depending on level ---- */ +void cb_setlevel ( int lev ) { + Level = (lev > 7) ? 7 : ( (lev < 1) ? 1 : lev ) ; switch (Level) { case 1 : TCmoves = 60; TCminutes = 5; - rb->splash ( 50 , true , "Level 1: 60 moves / 5 min" ); break; case 2 : TCmoves = 60; TCminutes = 15; - rb->splash ( 50 , true , "Level 2: 60 moves / 15 min" ); break; case 3 : TCmoves = 60; TCminutes = 30; - rb->splash ( 50 , true , "Level 3: 60 moves / 30 min" ); break; case 4 : TCmoves = 40; TCminutes = 30; - rb->splash ( 50 , true , "Level 4: 40 moves / 30 min" ); break; case 5 : TCmoves = 40; TCminutes = 60; - rb->splash ( 50 , true , "Level 5: 40 moves / 60 min" ); break; case 6 : TCmoves = 40; TCminutes = 120; - rb->splash ( 50 , true , "Level 6: 40 moves / 120 min" ); break; case 7 : TCmoves = 40; TCminutes = 240; - rb->splash ( 50 , true , "Level 7: 40 moves / 240 min" ); break; case 8 : TCmoves = 1; TCminutes = 15; - rb->splash ( 50 , true , "Level 8: 1 move / 15 min" ); break; case 9 : TCmoves = 1; TCminutes = 60; - rb->splash ( 50 , true , "Level 9: 1 move / 60 min" ); break; case 10 : TCmoves = 1; TCminutes = 600; - rb->splash ( 50 , true , "Level 10: 1 move / 600 min" ); break; } TCflag = (TCmoves > 1); - SetTimeControl(); + SetTimeControl(); +} + +/* ---- increase playing level ---- */ +void cb_levelup ( void ) { + if ( Level == 7 ) + cb_setlevel ( 1 ); + else + cb_setlevel ( Level+1 ); + rb->splash ( 50 , true , level_string[Level-1] ); }; +/* ---- Save current position ---- */ +void cb_saveposition ( void ) { + int fd; + short sq,i,c; + unsigned short temp; + + rb->splash ( 0 , true , "Saving position" ); + + fd = rb->open(SAVE_FILE, O_WRONLY|O_CREAT); + + computer++; rb->write(fd, &(computer), sizeof(computer)); computer--; + opponent++; rb->write(fd, &(opponent), sizeof(opponent)); opponent--; + rb->write(fd, &(Game50), sizeof(Game50)); + + rb->write(fd, &(castld[white]), sizeof(castld[white])); + rb->write(fd, &(castld[black]), sizeof(castld[black])); + rb->write(fd, &(kingmoved[white]), sizeof(kingmoved[white])); + rb->write(fd, &(kingmoved[black]), sizeof(kingmoved[black])); + + rb->write(fd, &(Level), sizeof(Level)); + rb->write(fd, &(TCflag), sizeof(TCflag)); + rb->write(fd, &(OperatorTime), sizeof(OperatorTime)); + + rb->write(fd, &(TimeControl.clock[white]), + sizeof(TimeControl.clock[white]) ); + rb->write(fd, &(TimeControl.clock[black]), + sizeof(TimeControl.clock[black]) ); + rb->write(fd, &(TimeControl.moves[white]), + sizeof(TimeControl.moves[white]) ); + rb->write(fd, &(TimeControl.moves[black]), + sizeof(TimeControl.moves[black]) ); + for (sq = 0; sq < 64; sq++) { + if (color[sq] == neutral) c = 0; else c = color[sq]+1; + temp = 256*board[sq] + c ; + rb->write(fd, &(temp), sizeof(temp)); + } + for (i = 0; i <= GameCnt; i++) { + if (GameList[i].color == neutral) + c = 0; + else + c = GameList[i].color + 1; + rb->write(fd, &(GameList[i].gmove), sizeof(GameList[i].gmove)); + rb->write(fd, &(GameList[i].score), sizeof(GameList[i].score)); + rb->write(fd, &(GameList[i].depth), sizeof(GameList[i].depth)); + rb->write(fd, &(GameList[i].nodes), sizeof(GameList[i].nodes)); + rb->write(fd, &(GameList[i].time), sizeof(GameList[i].time)); + rb->write(fd, &(GameList[i].piece), sizeof(GameList[i].piece)); + rb->write(fd, &(c), sizeof(c)); + } + rb->close(fd); +} + +/* ---- Restore saved position ---- */ +void cb_restoreposition ( void ) { + int fd; + int c; + short sq; + unsigned short m; + + if ( (fd = rb->open(SAVE_FILE, O_RDONLY)) >= 0 ) { + rb->splash ( 0 , true , "Loading position" ); + rb->read(fd, &(computer), sizeof(computer)); + rb->read(fd, &(opponent), sizeof(opponent)); + rb->read(fd, &(Game50), sizeof(Game50)); + + rb->read(fd, &(castld[white]), sizeof(castld[white])); + rb->read(fd, &(castld[black]), sizeof(castld[black])); + rb->read(fd, &(kingmoved[white]), sizeof(kingmoved[white])); + rb->read(fd, &(kingmoved[black]), sizeof(kingmoved[black])); + + rb->read(fd, &(Level), sizeof(Level)); + rb->read(fd, &(TCflag), sizeof(TCflag)); + rb->read(fd, &(OperatorTime), sizeof(OperatorTime)); + + rb->read(fd, &(TimeControl.clock[white]), + sizeof(TimeControl.clock[white])); + rb->read(fd, &(TimeControl.clock[black]), + sizeof(TimeControl.clock[black])); + rb->read(fd, &(TimeControl.moves[white]), + sizeof(TimeControl.moves[white])); + rb->read(fd, &(TimeControl.moves[black]), + sizeof(TimeControl.moves[black])); + for (sq = 0; sq < 64; sq++) { + rb->read(fd, &(m), sizeof(m)); + board[sq] = (m >> 8); color[sq] = (m & 0xFF); + if (color[sq] == 0) + color[sq] = neutral; + else + --color[sq]; + } + GameCnt = -1; c = '?'; + while (rb->read(fd, &(GameList[++GameCnt].gmove), + sizeof(GameList[GameCnt].gmove)) > 0) { + rb->read(fd, &(GameList[GameCnt].score), + sizeof(GameList[GameCnt].score)); + rb->read(fd, &(GameList[GameCnt].depth), + sizeof(GameList[GameCnt].depth)); + rb->read(fd, &(GameList[GameCnt].nodes), + sizeof(GameList[GameCnt].nodes)); + rb->read(fd, &(GameList[GameCnt].time), + sizeof(GameList[GameCnt].time)); + rb->read(fd, &(GameList[GameCnt].piece), + sizeof(GameList[GameCnt].piece)); + rb->read(fd, &(GameList[GameCnt].color), + sizeof(GameList[GameCnt].color)); + if (GameList[GameCnt].color == 0) + GameList[GameCnt].color = neutral; + else + --GameList[GameCnt].color; + } + GameCnt--; + if (TimeControl.clock[white] > 0) + TCflag = true; + computer--; opponent--; + } + rb->close(fd); + cb_setlevel(Level); + InitializeStats(); + Sdepth = 0; +} + /* ---- main user loop ---- */ struct cb_command cb_getcommand (void) { - static short x = 4 , y = 4 ; + static short x = 4 , y = 3 ; short c , r , l; int button, lastbutton = BUTTON_NONE; int marked = false , from_marked = false ; @@ -339,7 +479,7 @@ struct cb_command cb_getcommand (void) { case CB_QUIT: result.type = COMMAND_QUIT; return result; -#if 0 +#ifdef CB_RESTART case CB_RESTART: result.type = COMMAND_RESTART; return result; @@ -470,6 +610,9 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { /* init board */ GNUChess_Initialize(); + /* restore saved position, if saved */ + cb_restoreposition(); + /* draw the board */ /* I don't like configscreens, start game inmediatly */ cb_drawboard(); @@ -504,7 +647,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { cb_drawboard(); } break; -#if 0 +#ifdef COMMAND_RESTART case COMMAND_RESTART: GNUChess_Initialize(); cb_drawboard(); @@ -531,12 +674,12 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { cb_drawboard(); break; case COMMAND_QUIT: - /*cb_saveposition();*/ exit = true; break; } } + cb_saveposition(); rb->lcd_setfont(FONT_UI); return PLUGIN_OK; } diff --git a/apps/plugins/chessbox/gnuchess.c b/apps/plugins/chessbox/gnuchess.c index 9bd07c8eee..6ca579378f 100644 --- a/apps/plugins/chessbox/gnuchess.c +++ b/apps/plugins/chessbox/gnuchess.c @@ -32,9 +32,6 @@ #define ttblsz 4096 -/*#define ttblsz 16384*/ -#define huge - #define ctlP 0x4000 #define ctlN 0x2800 #define ctlB 0x1800 @@ -74,17 +71,6 @@ struct leaf short f,t,score,reply; unsigned short flags; }; -struct GameRec - { - unsigned short gmove; - short score,depth,time,piece,color; - long nodes; - }; -struct TimeControlRec - { - short moves[2]; - long clock[2]; - }; struct BookEntry { struct BookEntry *next; @@ -182,7 +168,7 @@ unsigned short hashkey; unsigned long hashbd; struct hashval hashcode[2][7][64]; struct hashentry ttable[ttblsz]; -struct hashentry huge *ptbl; +struct hashentry *ptbl; unsigned char history[8192]; short Mwpawn[64],Mbpawn[64],Mknight[2][64],Mbishop[2][64]; diff --git a/apps/plugins/chessbox/gnuchess.h b/apps/plugins/chessbox/gnuchess.h index e94748919a..6be88aecfa 100644 --- a/apps/plugins/chessbox/gnuchess.h +++ b/apps/plugins/chessbox/gnuchess.h @@ -19,14 +19,28 @@ #define valueQ 1100 #define valueK 1200 -/* ---- chess system global variables ---- */ -extern short mate,opponent,computer; +/* ---- chess engine global types ---- */ +struct GameRec { + unsigned short gmove; + short score,depth,time,piece,color; + long nodes; +}; +struct TimeControlRec { + short moves[2]; + long clock[2]; +}; + +/* ---- chess engine global variables ---- */ +extern short mate,opponent,computer,Sdepth; extern short locn[8][8]; extern short board[64]; extern short color[64]; extern long Level; extern short TCflag,TCmoves,TCminutes; extern short timeout; +extern short GameCnt,Game50,castld[2],kingmoved[2],OperatorTime; +extern struct TimeControlRec TimeControl; +extern struct GameRec GameList[240]; /* ---- RockBox integration ---- */ extern struct plugin_api* rb; @@ -36,5 +50,6 @@ void SetTimeControl(void); void GNUChess_Initialize(void); int VerifyMove(char s[],short iop,unsigned short *mv); int SelectMove ( short side, short iop , void (*callback)(void) ); +void InitializeStats ( void ); #endif -- cgit v1.2.3