Add string option /pieceNickNames
authorH.G. Muller <h.g.muller@hccnet.nl>
Fri, 30 Jul 2010 21:21:50 +0000 (23:21 +0200)
committerArun Persaud <arun@nubati.net>
Mon, 2 Aug 2010 07:58:21 +0000 (00:58 -0700)
This (volatile) option allows definition of alternate letters for the
pieces, which will be recognized next to the standard symbols as given
in the /pieceToCharTable on input. (Output always uses the standard.)
This can be useful for reading PGN from another language, or
non-compliant FENs (e.g. using B and N for E and H in Xiangqi).
  The format of the argument is the same as for /pieceToCharTable.
Because the nickNames are consulted before the standard table, it is
possible to redefine a standard name as a nick for another piece.

args.h
backend.c
common.h
moves.c
moves.h

diff --git a/args.h b/args.h
index b16b963..e6c72f8 100644 (file)
--- a/args.h
+++ b/args.h
@@ -549,6 +549,7 @@ ArgDescriptor argDescriptors[] = {
   { "holdingsSize", ArgInt, (void *) &appData.holdingsSize, TRUE, (ArgIniType) -1 },
   { "matchPause", ArgInt, (void *) &appData.matchPause, TRUE, (ArgIniType) 10000 },
   { "pieceToCharTable", ArgString, (void *) &appData.pieceToCharTable, FALSE, INVALID },
+  { "pieceNickNames", ArgString, (void *) &appData.pieceNickNames, FALSE, INVALID },
   { "flipBlack", ArgBoolean, (void *) &appData.upsideDown, TRUE, (ArgIniType) FALSE },
   { "allWhite", ArgBoolean, (void *) &appData.allWhite, TRUE, (ArgIniType) FALSE },
   { "alphaRank", ArgBoolean, (void *) &appData.alphaRank, FALSE, (ArgIniType) FALSE },
index 99aceae..661476c 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -234,6 +234,7 @@ char *ProbeBook P((int moveNr, char *book)); // [HGM] book: returns a book move
 char *SendMoveToBookUser P((int nr, ChessProgramState *cps, int initial)); // [HGM] book
 void ics_update_width P((int new_width));
 extern char installDir[MSG_SIZ];
+VariantClass startVariant; /* [HGM] nicks: initial variant */
 
 extern int tinyLayout, smallLayout;
 ChessProgramStats programStats;
@@ -637,6 +638,7 @@ InitBackEnd1()
     int matched, min, sec;
 
     ShowThinkingEvent(); // [HGM] thinking: make sure post/nopost state is set according to options
+    startVariant = StringToVariant(appData.variant); // [HGM] nicks: remember original variant
 
     GetTimeMark(&programStartTime);
     srandom((programStartTime.ms + 1000*programStartTime.sec)*0x1001001); // [HGM] book: makes sure random is unpredictabe to msec level
@@ -5260,7 +5262,10 @@ InitPosition(redraw)
     for(i=0; i<BOARD_FILES-2; i++)
       initialPosition[CASTLING][i] = initialRights[i] = NoRights; /* but no rights yet */
     initialPosition[EP_STATUS] = EP_NONE;
-    SetCharTable(pieceToChar, "PNBRQ...........Kpnbrq...........k"); 
+    SetCharTable(pieceToChar, "PNBRQ...........Kpnbrq...........k");
+    if(startVariant == gameInfo.variant) // [HGM] nicks: enable nicknames in original variant
+         SetCharTable(pieceNickName, appData.pieceNickNames);
+    else SetCharTable(pieceNickName, "............");
 
     switch (gameInfo.variant) {
     case VariantFischeRandom:
index 0e52ace..2b6d695 100644 (file)
--- a/common.h
+++ b/common.h
@@ -579,6 +579,7 @@ typedef struct {
     int holdingsSize;
     int matchPause;
     char * pieceToCharTable;
+    char * pieceNickNames;
     Boolean allWhite;
     Boolean upsideDown;
     Boolean alphaRank;
diff --git a/moves.c b/moves.c
index f281aa7..7267173 100644 (file)
--- a/moves.c
+++ b/moves.c
@@ -144,6 +144,7 @@ char pieceToChar[] = {
                         'p', 'n', 'b', 'r', 'q', 'f', 'e', 'a', 'c', 'w', 'm', 
                         'o', 'h', 'i', 'j', 'g', 'd', 'v', 'l', 's', 'u', 'k', 
                         'x' };
+char pieceNickName[EmptySquare];
 
 char PieceToChar(p)
      ChessSquare p;
@@ -167,6 +168,8 @@ ChessSquare CharToPiece(c)
 {
      int i;
      for(i=0; i< (int) EmptySquare; i++)
+          if(pieceNickName[i] == c) return (ChessSquare) i;
+     for(i=0; i< (int) EmptySquare; i++)
           if(pieceToChar[i] == c) return (ChessSquare) i;
      return EmptySquare;
 }
diff --git a/moves.h b/moves.h
index 82c7482..3ee1a8c 100644 (file)
--- a/moves.h
+++ b/moves.h
@@ -60,6 +60,7 @@ extern int PieceToNumber P((ChessSquare p));
 extern void CopyBoard P((Board to, Board from));
 extern int CompareBoards P((Board board1, Board board2));
 extern char pieceToChar[(int)EmptySquare+1];
+extern char pieceNickName[(int)EmptySquare];
 
 typedef void (*MoveCallback) P((Board board, int flags, ChessMove kind,
                                int rf, int ff, int rt, int ft,