Change book Zobrist key for Chu promoted pieces
authorH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 3 Mar 2015 21:44:32 +0000 (22:44 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Thu, 7 May 2015 18:53:33 +0000 (20:53 +0200)
Promoted pieces for Chu (i.e. above Lion, with the exception of King)
now get keys derived from their base type, by XORing in a square-dependent
'promoted' key. This makes it possible to extend the unpromoted series
with new pieces without altering the keys for the promoted pieces.
So that the current book code works upto 48 unpromoted piece types,
rather than 48 piece types total.

book.c

diff --git a/book.c b/book.c
index 8b4a43c..caa61b1 100644 (file)
--- a/book.c
+++ b/book.c
@@ -313,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);
@@ -340,6 +341,7 @@ hash (int moveNr)
                                Zobrist = (Zobrist << 48) ^ (Zobrist >> 16);
                                break;
                    }
+                   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