Add variants Cashew and Macadamia Shogi
authorH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 3 May 2016 20:49:31 +0000 (22:49 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 4 May 2016 12:19:10 +0000 (14:19 +0200)
The variants cashew-shogi and macadamia-shogi are announced and recognized,
and the start position is known internally and sent as setup command to
the GUI. Piece commands are sent to the GUI.

hachu.c

diff --git a/hachu.c b/hachu.c
index 147eda7..34bd893 100644 (file)
--- a/hachu.c
+++ b/hachu.c
@@ -280,14 +280,16 @@ PieceDesc waPieces[] = {
 };\r
 \r
 PieceDesc ddPieces[] = {\r
-  {"LG", "",   10, { 1,H,1,H,1,H,1,H } }, // Long-Nosed Goblin G!\r
-  {"OK", "LG", 10, { 2,1,2,0,2,0,2,1 } }, // Old Kite K'\r
+  {"HM", "",   10, { H,0,H,0,H,0,H,0 } }, // Hook Mover H!\r
+  {"LO", "",   10, { 1,H,1,H,1,H,1,H } }, // Long-Nosed Goblin G!\r
+  {"OK", "LO", 10, { 2,1,2,0,2,0,2,1 } }, // Old Kite K'\r
   {"PS", "HM", 10, { J,0,1,J,0,J,1,0 } }, // Poisonous Snake S'\r
+  {"FF", "",   10, { F,F,F,F,F,F,F,F } }, // Furious Fiend +L!\r
   {"GE", "",   10, { 3,3,5,5,3,5,5,3 } }, // Great Elephant +W!\r
-  {"WS", "LD", 10, { 1,1,2,0,1,0,2,1 } }, // Western Barbarian W'\r
-  {"EA", "LN", 10, { 2,1,1,0,2,0,1,1 } }, // Eastern Barbarian E'\r
-  {"NO", "FE", 10, { 0,2,1,1,0,1,1,2 } }, // Northern Barbarian N'\r
-  {"SO", "WE", 10, { 0,1,1,2,0,2,1,1 } }, // Southern Barbarian S'\r
+  {"We", "LD", 10, { 1,1,2,0,1,0,2,1 } }, // Western Barbarian W'\r
+  {"Ea", "LN", 10, { 2,1,1,0,2,0,1,1 } }, // Eastern Barbarian E'\r
+  {"No", "FE", 10, { 0,2,1,1,0,1,1,2 } }, // Northern Barbarian N'\r
+  {"So", "WE", 10, { 0,1,1,2,0,2,1,1 } }, // Southern Barbarian S'\r
   {"FE", "",   10, { 2,X,2,2,2,2,2,X } }, // Fragrant Elephant +N'\r
   {"WE", "",   10, { 2,2,2,X,2,X,2,2 } }, // White Elephant +S'\r
   {"FT", "",   10, { X,X,5,0,X,0,5,X } }, // Free Dream-Eater +W\r
@@ -297,6 +299,8 @@ PieceDesc ddPieces[] = {
   {"SB", "",   10, { X,X,2,2,2,2,2,X } }, // Standard Bearer +N\r
   {"FH", "FK", 10, { 1,2,1,0,1,0,1,2 } }, // Flying Horse  H'\r
   {"NK", "SB", 10, { 1,1,1,1,1,1,1,1 } }, // Neighbor King N\r
+  {"RG", "",   10, { 1,1,0,1,1,1,1,1 } }, // Right General R'\r
+  {"LG", "",   10, { 1,1,1,1,1,1,0,1 } }, // Left General L'\r
   {"BM", "MW", 10, { 0,1,1,1,0,1,1,1 } }, // Blind Monkey\r
   {"DO", "",   10, { 2,5,2,5,2,5,2,5 } }, // Dove\r
   {"EB", "DO", 10, { 2,0,2,0,0,0,2,0 } }, // Enchanted Badger B'\r
@@ -318,6 +322,8 @@ PieceDesc ddPieces[] = {
   {"SD", "",   10, { 5,2,5,2,5,2,5,2 } }, // She-Devil\r
   {"GD", "",   10, { 2,3,X,3,2,3,X,3 } }, // Great Dragon\r
   {"GO", "",   10, { X,3,2,3,X,3,2,3 } }, // Golden Bird\r
+  {"LC", "",   10, { X,0,0,X,1,0,0,X } }, // Left Chariot L'\r
+  {"RC", "",   10, { X,X,0,0,1,X,0,0 } }, // Right Chariot R'\r
   // Chu pieces (but with different promotion)\r
   {"LN", "FF",LVAL, { L,L,L,L,L,L,L,L }, 4 }, // lion\r
   {"FK", "",   600, { X,X,X,X,X,X,X,X }, 4 }, // free king\r
@@ -346,13 +352,13 @@ PieceDesc makaPieces[] = {
   {"DV", "TK", 10, { 0,1,0,1,0,0,1,1 } }, // Deva I'\r
   {"DS", "BS", 10, { 0,1,1,0,0,1,0,1 } }, // Dark Spirit J'\r
   {"T",  "fT", 10, { 0,1,0,0,1,0,0,1 } }, // Tile General Y\r
-  {"CS", "fS", 10, { 1,0,0,1,1,1,0,0 } }, // Coiled Serpent S!\r
+  {"CO", "fS", 10, { 1,0,0,1,1,1,0,0 } }, // Coiled Serpent S!\r
   {"RD", "fD", 10, { 1,0,1,1,1,1,1,0 } }, // Reclining Dragon D!\r
   {"CC", "WS", 10, { 0,1,1,0,1,0,1,1 } }, // Chinese Cock N'\r
   {"OM", "MW", 10, { 0,1,0,1,1,1,0,1 } }, // Old Monkey M'\r
   {"BB", "fB", 10, { 0,1,0,1,X,1,0,1 } }, // Blind Bear B'\r
   {"OR", "BA", 10, { 0,2,0,0,2,0,0,2 } }, // Old Rat O'\r
-  {"LD", "WS", 10, { T,T,T,T,T,T,T,T } }, // Lion Dog W!\r
+  {"LD", "G", 10, { T,T,T,T,T,T,T,T } }, // Lion Dog W!\r
   {"WR", "G", 10, { 0,3,1,3,0,3,1,3 } }, // Wrestler W'\r
   {"GG", "G", 10, { 3,1,3,0,3,0,3,1 } }, // Guardian of the Gods G'\r
   {"BD", "G", 10, { 0,3,1,0,1,0,1,3 } }, // Budhist Devil D'\r
@@ -380,6 +386,17 @@ PieceDesc makaPieces[] = {
   {"GO", "", 10, { X,3,2,3,X,3,2,3 } }, // Golden Bird +X\r
   {"fW", "", 10, { X,X,X,0,0,0,X,X } }, // Free Wolf +W\r
   {"BA", "", 10, { X,0,0,X,0,X,0,0 } }, // Bat +O'\r
+  {"FD", "G", 150, { 0,2,0,2,0,2,0,2 }, 2 }, // Flying Dragon\r
+  // Dai pieces with different promotion\r
+  {"FD", "G", 150, { 0,2,0,2,0,2,0,2 }, 2 }, // Flying Dragon\r
+  {"VO", "G", 200, { 2,0,2,0,2,0,2,0 }, 2 }, // Violent Ox\r
+  {"EW", "fW", 80, { 1,1,1,0,0,0,1,1 }, 2 }, // Evil Wolf\r
+  {"CS", "B",  70, { 0,1,0,1,0,1,0,1 }, 1 }, // Cat Sword\r
+  {"AB", "FB", 60, { 1,0,1,0,1,0,1,0 }, 1 }, // Angry Boar\r
+  {"T",  "fY", 80, { 0,1,0,0,1,0,0,1 }, 2 }, // Tile\r
+  {"I",  "fI", 80, { 1,1,0,0,0,0,0,1 }, 2 }, // Iron\r
+  {"N",  "G",  60, { N,0,0,0,0,0,0,N }, 0 }, // Knight\r
+  {"SG", "fU", 50, { 0,1,0,0,0,0,0,1 }, 0 }, // Stone\r
   // Chu pieces (but with different promotion)\r
   {"LN", "FF",LVAL, { L,L,L,L,L,L,L,L }, 4 }, // lion\r
   {"FK", "",   600, { X,X,X,X,X,X,X,X }, 4 }, // free king\r
@@ -514,6 +531,10 @@ char tenArray[] = "lnficsgekgscifnl/a1c!c!1txql!ot1c!c!1a/s'v'bhdw!d!q!h!d!w!dhb
                  "16/16/16/16/"\r
                  "4D6D4/PPPPPPPPPPPPPPPP/MVRF!E!B!R!Q!V!R!B!E!F!RVM/"\r
                  "S'V'BHDW!D!H!Q'D!W!DHBV'S'/A1C!C!TOL!QXT1C!C!1A/LNFICSGKEGSCIFNL";\r
+char cashewArray[]= "lh!f'dh'j'ki'qc'hg!l/t!p'w!+oogngx+xl!k'd!/r've'fst'+nt'sfw'vl'/ppppppppppppp/3d'5d'3/13/"\r
+                   "13/13/3D'5D'3/PPPPPPPPPPPPP/L'VW'FST'+NT'SFE'VR'/D!K'L!+XXGNGO+OW!P'T!/LG!HC'QI'KJ'H'DF'H!L";\r
+char macadArray[] = "lxcsgi'kj'gscol/1f'1w!1tet1l!1f'1/rr'g'bdh!qc!dbw'l'r/ppppppppppppp/3p'5p'3/13/"\r
+                   "13/13/3P'5P'3/PPPPPPPPPPPPP/RL'W'BDC!QH!DBG'R'R/1F'1L!1TET1W!1F'1/LOCSGI'KJ'GSCXL";\r
 char shoArray[]   = "lnsgkgsnl/1r2e2b1/ppppppppp/9/9/9/PPPPPPPPP/1B2E2R1/LNSGKGSNL";\r
 char waArray[]    = "hmlcvkwgudo/1e3s3f1/ppprpppxppp/3p3p3/11/11/11/3P3P3/PPPXPPPRPPP/1F3S3E1/ODUGWKVCLMH";\r
 char chessArray[] = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR";\r
@@ -537,7 +558,7 @@ char makaIDs[]  = "RVB C DKDEFLG DHI ..K L SMN KNP FKR S BTSG..EWPHT .."  // L (
                   "ABBBCSBDE FDGG  DVDS  LCBMCCORGB  RCSD      WRVODY  "  // L'\r
                   "    CARD      HM      LN            CO    VMLD      "; // L!\r
 char dadaIDs[]  = "RVB C DKEFFLG DHI ..K L SMNKKNP FKR S ..SGVBEWPH...."  // L (also for Cashew)\r
-                  "ABEBCSHDEAFDPRFHLGRGOKLCOMNOORPS  RCSOST  W WSVO    "  // L'\r
+                  "ABEBCSHDEaFDPRFHLGRGOKLCOMNoORPS  RCSoST  W WeVO    "  // L'\r
                   "RAWB  BD    LGHM      LN        SQ    WTRUVMLD      "; // L!\r
 \r
 typedef struct {\r
@@ -547,7 +568,8 @@ typedef struct {
   char *IDs;\r
 } VariantDesc;\r
 \r
-typedef enum { V_CHESS, V_SHO, V_CHU, V_DAI, V_DADA, V_MAKA, V_TAI, V_KYOKU, V_TENJIKU, V_SHATRANJ, V_MAKRUK, V_LION, V_WA, V_WOLF } Variant;\r
+typedef enum { V_CHESS, V_SHO, V_CHU, V_DAI, V_DADA, V_MAKA, V_TAI, V_KYOKU, V_TENJIKU,\r
+              V_CASHEW, V_MACAD, V_SHATRANJ, V_MAKRUK, V_LION, V_WA, V_WOLF } Variant;\r
 \r
 #define SAME (-1)\r
 \r
@@ -562,7 +584,9 @@ VariantDesc variants[] = {
   { 16,  8,  8, 3, V_MAKRUK,  "makruk",  thaiArray, chessIDs},  // Makruk\r
   { 16,  8,  8, 1, V_LION,    "lion",    lionArray, chessIDs},  // Mighty Lion\r
   { 22, 11, 11, 3, V_WA,      "wa-shogi", waArray,  waIDs},     // Wa\r
-  { 16,  8,  8, 1, V_WOLF,    "werewolf",wolfArray, chessIDs},  // Wa\r
+  { 16,  8,  8, 1, V_WOLF,    "werewolf",wolfArray, chessIDs},  // Werewolf Chess\r
+  { 26, 13, 13,13, V_CASHEW, "cashew-shogi",    cashewArray, dadaIDs },  // Cashew\r
+  { 26, 13, 13,13, V_MACAD,  "macadamia-shogi", macadArray,  makaIDs },  // Macadamia\r
 \r
   { 0, 0, 0, 0, 0 }, // sentinel\r
   { 34, 17, 17, 0, V_DADA,    "dada",    chuArray }, // Dai Dai\r
@@ -760,6 +784,10 @@ LookUp (char *name, int var)
       return ListLookUp(name, waPieces);\r
     case V_WOLF: // Werewolf\r
       return ListLookUp(name, wolfPieces);\r
+    case V_CASHEW: // Cashew\r
+      return ListLookUp(name, ddPieces);\r
+    case V_MACAD: // Cashew\r
+      return ListLookUp(name, makaPieces);\r
   }\r
   return NULL;\r
 }\r
@@ -918,8 +946,8 @@ AddPiece (int stm, PieceDesc *list)
 void\r
 SetUp (char *array, int var)\r
 {\r
-  int i, j, n, m, color;\r
-  char c, name[3], prince = 0;\r
+  int i, j, n, m, color, c;\r
+  char name[3], prince = 0;\r
   PieceDesc *p1, *p2;\r
   last[WHITE] = 1; last[BLACK] = 0;\r
   royal[WHITE] = royal[BLACK] = 0;\r
@@ -947,7 +975,7 @@ SetUp (char *array, int var)
       name[1] = IDs[2*(c - 'A') + 1]; if(name[1] == ' ') name[1] = 0;\r
       if(!strcmp(name, "CP") || pflag && !strcmp(name, "DE")) 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(!p1) printf("tellusererror Unknown piece '%s' in setup (%d)\n", name, c), 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
@@ -3055,6 +3083,23 @@ pboard(board);
                    "piece +P& WfF\npiece +O& K\npiece +H& vN\npiece +U& BfW\npiece +L& vRfF3bFsW\npiece +M& FfW\npiece +G& sRvW\npiece +C& vRsWfF\n"\r
                    "piece D& sbWfF\npiece V& FfW\npiece W& WfF\npiece S& sRvW\npiece R& FfRbW\npiece F& BfW\npiece X& FvWAvD\n"\r
                    "piece +D& WfF\npiece +V& FfsW\npiece +W& K\npiece +S& R\npiece +R& FvWAvD\npiece +F& BvRsW\npiece E& vRfF3bFsW\n");\r
+          if(currentVariant == V_MACAD)\r
+            printf("setup (P.*B*RQSEXOG....D^J'..*LP'.L!J'...*W!...*F'...^C.C.^L!.^P'^K.T*L'.*C!*H!^I'.^E...*R'^P^T*W'*G'^G^SI'^X^OK"\r
+                          "p.*b*rqsexog....d^j'..*lp'.l!j'...*w!...*f'...^c.c.^l!.^p'^k.t*l'.*c!*h!^i'.^e...*r'^p^t*w'*g'^g^si'^x^ok) 13x13+0_chu %s w 0 1\n"\r
+                  "piece P& fW\npiece S& FfW\npiece E& FfsW\npiece X& WA\npiece O& FD\npiece G& WfF\npiece D& RF\npiece +J'& QNADcaKmabK\n"\r
+                  "piece L& fR\npiece P'& vW\npiece L!& KNADcaKmabK\npiece J'& blfFrW\npiece H!& RmasR\npiece W!& KADcavKmcpafmcpavK\n"\r
+                  "piece C!& BmasB\npiece F'& F2\npiece +C& vRfB\npiece C& vWfF\npiece +L!& K3NADcaKmabK\npiece +P'& vR\npiece T& FbsW\n"\r
+                  "piece L'& lfrbBfRbW\npiece +I'& QADcavKmcpafmcpavK\npiece +E& K\npiece R'& rflbBfRbW\npiece +P& WfF\npiece +T& BbsR\n"\r
+                  "piece W'& F3sW\npiece G'& W3fF\npiece +G& RfB\npiece +S& BfR\npiece I'& rbfFlW\npiece +X& F3vRsW\npiece +O& F3sRvW\n", macadArray);\r
+          if(currentVariant == V_CASHEW)\r
+            printf("setup (P.^K'^P'QS^W!XOGND'.HDT!...P'.L!E'.^W'K'W!..LF'V^E'J'H'...^L!^N..FT'L'C'G!H!D!I'.^H'..R'..^C'^F'..W'^X^OK"\r
+                          "p.^k'^p'qs^w!xognd'.hdt!...p'.l!e'.^w'k'w!..lf'v^e'j'h'...^l!^n..ft'l'c'g!h!d!i'.^h'..r'..^c'^f'..w'^x^ok) 13x13+0_chu %s w 0 1\n"\r
+                   "piece P& fW\npiece S& FfW\npiece W'& fFvWsW2\npiece E'& fFsWvW2\npiece X& WA\npiece O& FD\npiece G& WfF\npiece H& BW\n"\r
+                   "piece +C'& BW\npiece D& RF\npiece +F'& RF\npiece L& fR\npiece D'& fRbW\npiece L!& KNADcaKmabK\npiece +E'& KNADcaKmabK\n"\r
+                   "piece J'& FvlW\npiece H!& RmasR\npiece +W'& KADcavKmcpafmcpavK\npiece G!& WBmasB\npiece F'& F2\npiece +L!& K3NADcaKmabK\n"\r
+                   "piece T!& vRsW2flBfrF\npiece T'& fFvW2\npiece L'& lfrbBfRbW\npiece N& K\npiece R'& rflbBfRbW\npiece I'& FvrW\n"\r
+                   "piece +X& F3vRsW2\npiece +O& F3sRvW2\npiece H'& WfF2\npiece +H'& Q\npiece C'& F\npiece D!& sRvW2frBflF\npiece P'& sWfDbA\n"\r
+                   "piece K'& W2fF\npiece +K'& WBmasB\npiece +P'& RmasR\npiece +N& fRfBbF2bsW2\npiece F& FvW\npiece V& fF2sW\n", cashewArray);\r
          repStack[199] = hashKeyH, checkStack[199] = 0;\r
           continue;\r
         }\r