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 ++++++++++++++++++++++++++++++++++----- 1 file changed, 163 insertions(+), 20 deletions(-) (limited to 'apps/plugins/chessbox/chessbox.c') 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; } -- cgit v1.2.3