X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=moves.c;h=bcaef30286cbd4fd2f47c43e6716c7d4a76840e2;hb=94d2b2b896207fac048806e05c8a114297b1a513;hp=29638b801c454b50fd597d6eaed12c074740d95a;hpb=d30d12e2d31771571fec432198b17a485a8881c7;p=xboard.git diff --git a/moves.c b/moves.c index 29638b8..bcaef30 100644 --- a/moves.c +++ b/moves.c @@ -74,6 +74,16 @@ int PosFlags(int index); extern signed char initialRights[BOARD_FILES]; /* [HGM] all rights enabled, set in InitPosition */ int quickFlag; char *pieceDesc[EmptySquare]; +char *defaultDesc[EmptySquare] = { + "fmWfceFifmnD", "N", "B", "R", "Q", + "F", "A", "BN", "RN", "W", "K", + "mRcpR", "N0", "BW", "RF", "gQ", + "", "", "QN", "", "N", "", + "", "", "", "", "", + "", "", "", "", "", "", + "", "", "", "", "", + "", "", "", "", "", "K" +}; int WhitePiece (ChessSquare piece) @@ -168,8 +178,49 @@ CompareBoards (Board board1, Board board2) return TRUE; } +char defaultName[] = "PNBRQ......................................K" // white + "pnbrq......................................k"; // black +char shogiName[] = "PNBRLS...G.++++++..........................K" // white + "pnbrls...g.++++++..........................k"; // black +char xqName[] = "PH.R.AE..K.C................................" // white + "ph.r.ae..k.c................................"; // black + +char * +CollectPieceDescriptors () +{ // make a line of piece descriptions for use in the PGN Piece tag: + // dump all engine defined pieces, and pieces with non-standard names, + // but suppress black pieces that are the same as their white counterpart + ChessSquare p; + static char buf[MSG_SIZ]; + char *m, c, d, *pieceName = defaultName; + int len; + *buf = NULLCHAR; + if(!pieceDefs) return ""; + if(gameInfo.variant == VariantChu) return ""; // for now don't do this for Chu Shogi + if(gameInfo.variant == VariantShogi) pieceName = shogiName; + if(gameInfo.variant == VariantXiangqi) pieceName = xqName; + for(p=WhitePawn; p= BlackPawn && pieceToChar[BLACK_TO_WHITE p] == toupper(c) + && (c != '+' || pieceToChar[DEMOTED BLACK_TO_WHITE p] == d)) { // black member of normal pair + char *wm = pieceDesc[BLACK_TO_WHITE p]; + if(!m && !wm || m && wm && !strcmp(wm, m)) continue; // moves as a white piece + } else // white or unpaired black + if((p < BlackPawn || CharToPiece(toupper(d)) != EmptySquare) && // white or lone black + !pieceDesc[p] /*&& pieceName[p] == c*/) continue; // orthodox piece known by its usual name +// TODO: listing pieces because of unusual name can only be done if we have accurate Betza of all defaults + if(!m) m = defaultDesc[p]; + len = strlen(buf); + snprintf(buf+len, MSG_SIZ-len, "%s%s%c:%s", len ? ";" : "", c == '+' ? "+" : "", d, m); + } + return buf; +} + // [HGM] gen: configurable move generation from Betza notation sent by engine. +Boolean pieceDefs; + // alphabet "abcdefghijklmnopqrstuvwxyz" char symmetry[] = "FBNW.FFW.NKN.NW.QR....W..N"; char xStep[] = "2110.130.102.10.00....0..2"; @@ -532,7 +583,10 @@ GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, if(PieceToChar(piece) == '~') piece = (ChessSquare) ( DEMOTED piece ); if(filter != EmptySquare && piece != filter) continue; - if(pieceDesc[piece]) { MovesFromString(board, flags, ff, rf, pieceDesc[piece], callback, closure); continue; } // [HGM] gen + if(pieceDefs && pieceDesc[piece]) { // [HGM] gen: use engine-defined moves + MovesFromString(board, flags, ff, rf, pieceDesc[piece], callback, closure); + continue; + } if(IS_SHOGI(gameInfo.variant)) piece = (ChessSquare) ( SHOGI piece ); @@ -1876,6 +1930,12 @@ Disambiguate (Board board, int flags, DisambiguateClosure *closure) return; } } + } else if(pieceDefs && closure->count > 1) { // [HGM] gen: move is ambiguous under engine-defined rules + DisambiguateClosure spare = *closure; + pieceDefs = FALSE; spare.count = 0; // See if the (erroneous) built-in rules would resolve that + GenLegal(board, flags, DisambiguateCallback, (VOIDSTAR) &spare, closure->pieceIn); + if(spare.count == 1) *closure = spare; // It does, so use those in stead (game from file saved before gen patch?) + pieceDefs = TRUE; } if (c == 'x') c = NULLCHAR; // get rid of any 'x' (which should never happen?)