X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=book.c;h=c956362328d2910c399a43f82855d281aa08d3a7;hb=c02489ef9e5b337bff38fd5a8594b8117f991c45;hp=e4916154d0a48beac1e645580c5a9477c2db3c0b;hpb=1c03d229073e56dda9e5856db5adaae51576a3bb;p=xboard.git diff --git a/book.c b/book.c index e491615..c956362 100644 --- a/book.c +++ b/book.c @@ -28,6 +28,8 @@ * ------------------------------------------------------------------------ */ +#include "config.h" + #include #include #include @@ -311,8 +313,9 @@ hash (int moveNr) ChessSquare p = boards[moveNr][r][f]; if(f == BOARD_LEFT-1 || f == BOARD_RGHT) continue; // between board and holdings if(p != EmptySquare){ - int j = (int)p; + int j = (int)p, promoted = 0; j -= (j >= (int)BlackPawn) ? (int)BlackPawn :(int)WhitePawn; + if(j >= CHUPROMOTED WhitePawn) promoted++, j -= CHUPROMOTED WhitePawn; if(j > (int)WhiteQueen) j++; // make space for King if(j > (int) WhiteKing) j = (int)WhiteQueen + 1; p_enc = 2*j + ((int)p < (int)BlackPawn); @@ -326,7 +329,8 @@ hash (int moveNr) pieceGroup = p_enc / 12; p_enc = p_enc % 12; Zobrist = RandomPiece[64*p_enc + (squareNr & 63)]; - switch(pieceGroup) { + if(pieceGroup & 4) Zobrist *= 987654321; + switch(pieceGroup & 3) { case 1: // pieces 5-10 (FEACWM) Zobrist = (Zobrist << 16) ^ (Zobrist >> 48); break; @@ -337,7 +341,9 @@ hash (int moveNr) Zobrist = (Zobrist << 48) ^ (Zobrist >> 16); break; } - if(squareNr >= 64) Zobrist = (Zobrist << 8) ^ (Zobrist >> 56); + if(promoted) Zobrist ^= 123456789*RandomPiece[squareNr & 63]; + if(squareNr & 64) Zobrist = (Zobrist << 8) ^ (Zobrist >> 56); + if(squareNr & 128) Zobrist = (Zobrist << 4) ^ (Zobrist >> 60); // holdings have separate (additive) key, to encode presence of multiple pieces on same square if(f == BOARD_LEFT-2) holdingsKey += Zobrist * boards[moveNr][r][f+1]; else if(f == BOARD_RGHT+1) holdingsKey += Zobrist * boards[moveNr][r][f-1]; else @@ -479,7 +485,7 @@ find_key (FILE *f, uint64 key, entry_t *entry) } void -move_to_string (char move_s[6], uint16 move) +move_to_string (char move_s[10], uint16 move) { int f,fr,ff,t,tr,tf,p; int width = BOARD_RGHT - BOARD_LEFT, size; // allow for alternative board formats @@ -493,24 +499,28 @@ move_to_string (char move_s[6], uint16 move) t = move % size; tr = t / width; tf = t % width; - move_s[0] = ff + 'a'; - move_s[1] = fr + '1' - (BOARD_HEIGHT > 9); - move_s[2] = tf + 'a'; - move_s[3] = tr + '1' - (BOARD_HEIGHT > 9); + snprintf(move_s, 9, "%c%d%c%d", ff + 'a', fr + 1 - (BOARD_HEIGHT == 10), tf + 'a', tr + 1 - (BOARD_HEIGHT == 10)); + + if(IS_SHOGI(gameInfo.variant) && p) { + if(p == 2) p = 10; // Lion moves, for boards so big that 10 is out of range + else if(p != 7) p = 8; // use '+' for all others that do not explicitly defer + } // kludge: encode drops as special promotion code if(gameInfo.holdingsSize && p == 9) { move_s[0] = f + '@'; // from square encodes piece type move_s[1] = '@'; // drop symbol p = 0; + } else if(p == 10) { // decode Lion move + + p = 0; } // add promotion piece, if any if(p){ - move_s[4] = promote_pieces[p]; - move_s[5] = '\0'; - }else{ - move_s[4] = '\0'; + int len = strlen(move_s); + move_s[len] = promote_pieces[p]; + move_s[len+1] = '\0'; } if(gameInfo.variant != VariantNormal) return; @@ -561,6 +571,8 @@ GetBookMoves (FILE *f, int moveNr, entry_t entries[], int max) return count; } +static int dirty; + int ReadFromBookFile (int moveNr, char *book, entry_t entries[]) { // retrieve all entries for given position from book in 'entries', return number. @@ -568,6 +580,7 @@ ReadFromBookFile (int moveNr, char *book, entry_t entries[]) static char curBook[MSG_SIZ]; if(book == NULL) return -1; + if(dirty) { if(f) fclose(f); dirty = 0; f = NULL; } if(!f || strcmp(book, curBook)){ // keep book file open until book changed strncpy(curBook, book, MSG_SIZ); if(f) fclose(f); @@ -712,7 +725,7 @@ char * MovesToText(int count, entry_t *entries) { int i, totalWeight = 0; - char algMove[6]; + char algMove[12]; char *p = (char*) malloc(40*count+1); for(i=0; i text && start[-1] != ' ' && start[-1] != '\t') start--; + while(*end && *++end != ' ' && *end != '\n'); *end = NULLCHAR; // find clicked word + if(start != end) TypeInDoneEvent(start); // fake it was typed in move type-in +} + +void FlushBook () { FILE *f;