latest update by Miguel Arevalo
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9037 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
258a693e95
commit
789e01bd06
3 changed files with 181 additions and 37 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue