Add move type jump + step
authorH.G.Muller <hgm@hgm-xboard.(none)>
Thu, 12 Mar 2015 19:36:21 +0000 (20:36 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Thu, 12 Mar 2015 19:36:21 +0000 (20:36 +0100)
The Wa Trecherous Fox and the Maka Dai Dai Donkey (in some interpretations)
need this move.

hachu.c

diff --git a/hachu.c b/hachu.c
index fd67a21..e3ba644 100644 (file)
--- a/hachu.c
+++ b/hachu.c
@@ -176,11 +176,12 @@ Move retMove, moveStack[20000], path[100], repStack[300], pv[1000], repeatMove[3
 #define R 37 /* jump capture        */\r
 #define N -1 /* Knight              */\r
 #define J -2 /* jump                */\r
-#define D -3 /* linear double move  */\r
-#define T -4 /* linear triple move  */\r
-#define L -5 /* true Lion move      */\r
-#define F -6 /* Lion + 3-step       */\r
-#define S -7 /* Lion + range        */\r
+#define I -3 /* jump + step         */\r
+#define D -4 /* linear double move  */\r
+#define T -5 /* linear triple move  */\r
+#define L -6 /* true Lion move      */\r
+#define F -7 /* Lion + 3-step       */\r
+#define S -8 /* Lion + range        */\r
 #define H -9 /* hook move           */\r
 #define C -10 /* capture only       */\r
 #define M -11 /* non-capture only   */\r
@@ -1168,14 +1169,14 @@ GenNonCapts (int promoSuppress)
        } else\r
        if(r >= S) { // in any case, do a jump of 2\r
          int occup = NewNonCapture(x, x + 2*v, pFlag);\r
-         if(r < J) { // Lion power, also single step\r
+         if(r < I) { // Lion power, also single step\r
            if(!NewNonCapture(x, x + v, pFlag)) nullMove = x; else occup = 1;\r
            if(r <= L) { // true Lion, also Knight jump\r
              if(!occup & r < L) for(y=x+2*v; !NewNonCapture(x, y+=v, pFlag) && r == S; ); // BS and FF moves\r
              v = nStep[j];\r
              NewNonCapture(x, x + v, pFlag);\r
            }\r
-         }\r
+         } else if(r == I) NewNonCapture(x, x + v, pFlag); // also do step\r
        } else\r
        if(r == M) { // FIDE Pawn; check double-move\r
          if(!NewNonCapture(x, x+v, pFlag) && chessFlag && promoBoard[x-v] & LAST_RANK)\r
@@ -1217,6 +1218,7 @@ MapOneColor (int start, int last, int *map)
          if(r < J) { // Lion power, also single step\r
            if(board[x + v] != EMPTY && board[x + v] != EDGE)\r
              map[2*(x + v) + start] += one[j];\r
+           if(r < I) {\r
            if(r == T) { // Lion Dog, also jump of 3\r
              if(board[x + 3*v] != EMPTY && board[x + 3*v] != EDGE)\r
                map[2*(x + 3*v) + start] += one[j];\r
@@ -1237,6 +1239,7 @@ MapOneColor (int start, int last, int *map)
              if(board[x + v] != EMPTY && board[x + v] != EDGE)\r
                map[2*(x + v) + start] += one[8];\r
            }\r
+           }\r
          }\r
        } else\r
        if(r == C) { // FIDE Pawn diagonal\r
@@ -1281,6 +1284,7 @@ MapFromScratch (int *map)
   int i;\r
   for(i=0; i<2*bsize; i++) map[i] = 0;\r
   mobilityScore  = MapOneColor(1, last[WHITE], map);\r
+\r
   mobilityScore -= MapOneColor(0, last[BLACK], map);\r
 }\r
 \r
@@ -1548,6 +1552,8 @@ GenCapts (int sqr, int victimValue)
              break;\r
            case J: // plain jump (as in KY, PH)\r
              if(d != 2) break;\r
+           case I: // jump + step (as in Wa TF)\r
+             if(d > 2) break;\r
              NewCapture(x, sqr + victimValue - SORTKEY(attacker), p[attacker].promoFlag);\r
              att -= one[i];\r
              break;\r
@@ -2230,6 +2236,7 @@ pbytes (unsigned char *b)
   for(i=BH-1; i>=0; i--) {\r
     for(j=0; j<BH; j++) printf("%3x", b[BW*i+j]);\r
     printf("\n");\r
+\r
   }\r
 }\r
 \r