Fix buf in position setup without Elephant/Prince
authorH.G. Muller <h.g.muller@hccnet.nl>
Fri, 26 Apr 2013 08:38:48 +0000 (10:38 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Mon, 21 Oct 2013 08:40:23 +0000 (10:40 +0200)
HaChu's check test assumes the piece after King in the piece list will be
Crown Prince. When positions without CP or DE (which causes addition of
a CP for promotion, marked as ABSENT) were loaded, this would not be the
case, and the presence of another piece could create the illusion of
immunity to check. In Chess / Shatranj / Makruk a dummy (ABSENT) CP was
added to prevent this, but the problem occurred just as much in set-up
positions of true Shogi variants. Now we always add a dummy CP if the
loaded position did not cause adding it already.

hachu.c

diff --git a/hachu.c b/hachu.c
index b6d3786..04b95f3 100644 (file)
--- a/hachu.c
+++ b/hachu.c
@@ -11,7 +11,7 @@
 // promotions by pieces with Lion power stepping in & out the zone in same turn\r
 // promotion on capture\r
 \r
-#define VERSION "0.6beta"\r
+#define VERSION "0.7beta"\r
 \r
 #define PATH level==0 || path[0] == 0xc4028 &&  (level==1 /*|| path[1] == 0x75967 && (level == 2 || path[2] == 0x3400b && (level == 3))*/)\r
 //define PATH 0\r
@@ -699,11 +699,9 @@ void
 SetUp(char *array, int var)\r
 {\r
   int i, j, n, m, nr, color;\r
-  char c, *q, name[3];\r
+  char c, *q, name[3], prince = 0;\r
   PieceDesc *p1, *p2;\r
   last[WHITE] = 1; last[BLACK] = 0;\r
-  if(var == V_CHESS || var == V_SHATRANJ || var == V_MAKRUK) // add dummy Crown Princes\r
-    p[AddPiece(WHITE, LookUp("CP", V_CHU))].pos =  p[AddPiece(BLACK, LookUp("CP", V_CHU))].pos = ABSENT;\r
   for(i=0; ; i++) {\r
 //printf("next rank: %s\n", array);\r
     for(j = BW*i; ; j++) {\r
@@ -720,12 +718,14 @@ SetUp(char *array, int var)
        name[0] += 'A' - 'a';\r
        if(name[1]) name[1] += 'A' - 'a';\r
       } else color = WHITE;\r
+      if(!strcmp(name, "CP")) prince |= color+1; // remember if we added Crown Prince\r
       p1 = LookUp(name, var);\r
       if(!p1) printf("tellusererror Unknown piece '%s' in setup\n", name), exit(-1);\r
       if(pflag && p1->promoted) p1 = LookUp(p1->promoted, var); // use promoted piece instead\r
       n = AddPiece(color, p1);\r
       p[n].pos = j;\r
       if(p1->promoted[0] && !pflag) {\r
+        if(!strcmp(p1->promoted, "CP")) prince |= color+1; // remember if we added Crown Prince\r
        p2 = LookUp(p1->promoted, var);\r
         m = AddPiece(color, p2);\r
        if(m <= n) n += 2;\r
@@ -741,6 +741,9 @@ SetUp(char *array, int var)
     }\r
   }\r
  eos:\r
+  // add dummy Crown Princes if not yet added\r
+  if(!(prince & WHITE+1)) p[AddPiece(WHITE, LookUp("CP", V_CHU))].pos = ABSENT;\r
+  if(!(prince & BLACK+1)) p[AddPiece(BLACK, LookUp("CP", V_CHU))].pos = ABSENT;\r
   for(i=0; i<8; i++)  fireFlags[i] = 0;\r
   for(i=2, n=1; i<10; i++) if(p[i].value == 10*FVAL) {\r
     int x = p[i].pos; // mark all burn zones\r