Print setup and piece commands in engine-defined variants
authorH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 28 Dec 2016 16:01:16 +0000 (17:01 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 28 Dec 2016 16:01:16 +0000 (17:01 +0100)
A setup command with the start position is now sent whenever a variant
is initialized, and ptc[] contains a piece-to-char table for that variant.
In addition, piece commands are sent when betza[] contains move definitions
for that variant.

dropper.c

index 1e2516f..29f632c 100644 (file)
--- a/dropper.c
+++ b/dropper.c
@@ -329,6 +329,26 @@ shogiProms[16] = { Z_MUST, Z_2ND, COLOR, 0, Z_MUST, Z_MUST, Z_2ND },
 toriProms[16]  = { Z_MUST, 0, 0, 0, 0, Z_MUST },
 waProms[16]    = { Z_MUST, Z_2ND, Z_MUST, Z_MUST, Z_MUST, COLOR, COLOR, Z_MUST, Z_MUST, Z_MUST, COLOR, Z_MUST, COLOR, Z_MUST };
 
+char *betza[] = { // piece defs for sending to GUI
+  NULL, // suppresses setup command
+  "",
+  "",
+  NULL,
+  ",P& fW,L& fWbF,U& fWbF,C& fFsW,G& fFvW,M& fFvW,D& fFbsW,V& FfW,W& WfF,O& fR,H& fRbW2,S& sRvW,F& BfW,E& vRfF3bFsW,R& fRFbW,X& FAvWvD"
+  ",+P& WfF,+L& vRfF3bFsW,+U& BfW,+C& vRfFsW,+G& sRvW,+M& FfW,+D& WfF,+V& FfsW,+W& K,+O& K,+H& vN,+S& R,+F& BvRsW,+R& FAvWvD",
+  ",S& fW,P& fDbF,L& fRbrBblF,R& fRblBbrF,C& FvW,F& FfsW,+S& fAbD,+F& fBbRbF2fsW",
+};
+
+char *ptc[] = { // XBoard 4.9 piece-to-char table
+  NULL,
+  "P.BR.S...G.+.++.+Kp.br.s...g.+.++.+k",
+  "PNBR.S...G.++++.+Kpnbr.s...g.++++.+k",
+  NULL,
+  "P..^S^FV..^LW^OH.F.^R.E....R...D.GOL^M..^H.M.C.^CU.^W../.......^V.^P.^U..^DS.^GXK"
+  "p..^s^fv..^lw^oh.f.^r.e....r...d.gol^m..^h.m.c.^cu.^w../.......^v.^p.^u..^ds.^gxk",
+  "S.....F..........^F.P........^S....L........C......RKs.....f..........^f.p........^s....l........c......rk"
+};
+
 typedef struct {
   int files, ranks, hand, zone;
   char *name;
@@ -408,7 +428,7 @@ void
 GameInit (char *name)
 {
     int v, *ip, i, color, r, f, zone;
-    unsigned char *moves, *codes; char c;
+    unsigned char *moves, *codes; char c, *p;
 
     // determine variant parameters
     if(sscanf(name, "%dx%d+%d_%c", &f, &r, &i, &c) == 4) {
@@ -425,6 +445,12 @@ printf("# variant %d: %s\n", v, variants[v].name);
     startPos= variants[v].fen;
     codes   = variants[v].proms;
 
+    if((p = betza[v])) { // configure GUI for this variant
+       printf("setup (%s) %dx%d+%d_%s %s 0 1", ptc[v], nrFiles, nrRanks, maxDrop+1, (v == 4 ? "chu" : "shogi"), startPos);
+       while(*p) { if(*p == ',') printf("\npiece "); else printf("%c", *p); p++; }
+       printf("\n");
+    }
+
     maxDrop += (v==2 || v==1); // Judkins & mini-Shogi have dummy Lance
 
     // board