summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
authorMarcoen Hirschberg <marcoen@gmail.com>2006-03-14 20:55:59 +0000
committerMarcoen Hirschberg <marcoen@gmail.com>2006-03-14 20:55:59 +0000
commit789e01bd069bc59b30d24534843090103e7df482 (patch)
tree02de519dc9f62b75700083d221c9a82949d3663d /apps/plugins
parent258a693e95d81b0e149a3c9424c6c5c6aa8b2212 (diff)
downloadrockbox-789e01bd069bc59b30d24534843090103e7df482.zip
rockbox-789e01bd069bc59b30d24534843090103e7df482.tar.gz
rockbox-789e01bd069bc59b30d24534843090103e7df482.tar.bz2
rockbox-789e01bd069bc59b30d24534843090103e7df482.tar.xz
latest update by Miguel Arevalo
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9037 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/chessbox/chessbox.c183
-rw-r--r--apps/plugins/chessbox/gnuchess.c16
-rw-r--r--apps/plugins/chessbox/gnuchess.h19
3 files changed, 181 insertions, 37 deletions
diff --git a/apps/plugins/chessbox/chessbox.c b/apps/plugins/chessbox/chessbox.c
index 2e863b9..17b5050 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 9bd07c8..6ca5793 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 e947489..6be88ae 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