Extend book to 48 piece types and 256 squares
[xboard.git] / book.c
diff --git a/book.c b/book.c
index ec3f543..8872d16 100644 (file)
--- a/book.c
+++ b/book.c
@@ -28,6 +28,8 @@
  * ------------------------------------------------------------------------
  */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <time.h>
@@ -326,7 +328,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 +340,8 @@ hash (int moveNr)
                                Zobrist = (Zobrist << 48) ^ (Zobrist >> 16);
                                break;
                    }
-                   if(squareNr >= 64) Zobrist = (Zobrist << 8) ^ (Zobrist >> 56);
+                   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
@@ -792,6 +796,7 @@ DisplayBook (int moveNr)
     p = MovesToText(count, entries);
     EditTagsPopUp(p, NULL);
     free(p);
+    addToBookFlag = FALSE;
     return TRUE;
 }
 
@@ -984,6 +989,15 @@ AddGameToBook (int always)
 }
 
 void
+PlayBookMove(char *text, int index)
+{
+    char *start = text+index, *end = start;
+    while(start > 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;