X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=5a1780ddc0a9d86d16ac21a1c2507b0b8f0d7726;hb=40c740ae01e3c9694449134e68b7a7bd077fb172;hp=c487dd164339c5cef47b856db121a8ab52842a8a;hpb=f856eb7ac5fbeec648f7fd27013905f0a5a26616;p=xboard.git diff --git a/backend.c b/backend.c index c487dd1..5a1780d 100644 --- a/backend.c +++ b/backend.c @@ -387,7 +387,7 @@ u64ToDouble (u64 value) by this function. */ int -PosFlags (index) +PosFlags (int index) { int flags = F_ALL_CASTLE_OK; if ((index % 2) == 0) flags |= F_WHITE_ON_MOVE; @@ -1982,7 +1982,7 @@ read_from_player (InputSourceRef isr, VOIDSTAR closure, char *message, int count DisplayFatalError(_("Error reading from keyboard"), error, 1); } else if (gotEof++ > 0) { RemoveInputSource(isr); - DisplayFatalError(_("Got end of file from keyboard"), 0, 0); + DisplayFatalError(_("Got end of file from keyboard"), 0, 666); // [HGM] 666 is kludge to alert front end } } @@ -5161,7 +5161,15 @@ SendMoveToProgram (int moveNum, ChessProgramState *cps) m[2], m[3] - '0', m[5], m[6] - '0', m[2] + (m[0] > m[5] ? 1 : -1), m[3] - '0'); - else + else if(*c && m[8]) { // kill square followed by 2 characters: 2nd kill square rather than promo suffix + *c = m[9]; + snprintf(buf, MSG_SIZ, "%c%d%c%d,%c%d%c%d,%c%d%c%d%s\n", m[0], m[1] - '0', // convert to three moves + m[7], m[8] - '0', + m[7], m[8] - '0', + m[5], m[6] - '0', + m[5], m[6] - '0', + m[2], m[3] - '0', c); + } else snprintf(buf, MSG_SIZ, "%c%d%c%d,%c%d%c%d%s\n", m[0], m[1] - '0', // convert to two moves m[5], m[6] - '0', m[5], m[6] - '0', @@ -5364,14 +5372,14 @@ CoordsToComputerAlgebraic (int rf, int ff, int rt, int ft, char promoChar, char AAA + ff, ONE + rf, AAA + ft, ONE + rt); if(killX >= 0 && killY >= 0) { sprintf(move+4, ";%c%c\n", AAA + killX, ONE + killY); - if(kill2X >= 0 && kill2Y >= 0) sprintf(move+7, "%c%c\n", AAA + killX, ONE + killY); + if(kill2X >= 0 && kill2Y >= 0) sprintf(move+7, "%c%c\n", AAA + kill2X, ONE + kill2Y); } } else { sprintf(move, "%c%c%c%c%c\n", AAA + ff, ONE + rf, AAA + ft, ONE + rt, promoChar); if(killX >= 0 && killY >= 0) { sprintf(move+4, ";%c%c\n", AAA + killX, ONE + killY); - if(kill2X >= 0 && kill2Y >= 0) sprintf(move+7, "%c%c%c\n", AAA + killX, ONE + killY, promoChar); + if(kill2X >= 0 && kill2Y >= 0) sprintf(move+7, "%c%c%c\n", AAA + kill2X, ONE + kill2Y, promoChar); } } } @@ -5571,7 +5579,7 @@ ParseOneMove (char *move, int moveNum, ChessMove *moveType, int *fromX, int *fro *toX = currentMoveString[2] - AAA; *toY = currentMoveString[3] - ONE; *promoChar = currentMoveString[4]; - if(*promoChar == ';') *promoChar = currentMoveString[7]; + if(*promoChar == ';') *promoChar = currentMoveString[7 + 2*(currentMoveString[8] != 0)]; if (*fromX < BOARD_LEFT || *fromX >= BOARD_RGHT || *fromY < 0 || *fromY >= BOARD_HEIGHT || *toX < BOARD_LEFT || *toX >= BOARD_RGHT || *toY < 0 || *toY >= BOARD_HEIGHT) { if (appData.debugMode) { @@ -7406,10 +7414,11 @@ Mark (Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VO { typedef char Markers[BOARD_RANKS][BOARD_FILES]; Markers *m = (Markers *) closure; - if(rf == fromY && ff == fromX && (killX < 0 ? !(rt == rf && ft == ff) && legNr & 1 : rt == killY && ft == killX || legNr & 2)) + if(rf == fromY && ff == fromX && (killX < 0 ? !(rt == rf && ft == ff) && legNr & 1 : + kill2X < 0 ? rt == killY && ft == killX || legNr & 2 : rt == killY && ft == killX || legNr & 4)) (*m)[rt][ft] = 1 + (board[rt][ft] != EmptySquare || kind == WhiteCapturesEnPassant - || kind == BlackCapturesEnPassant) + 3*(kind == FirstLeg && killX < 0), legal[rt][ft] = 3; + || kind == BlackCapturesEnPassant) + 3*(kind == FirstLeg && (killX < 0 & legNr || legNr & 2 && kill2X < 0)), legal[rt][ft] = 3; else if(flags & F_MANDATORY_CAPTURE && board[rt][ft] != EmptySquare) (*m)[rt][ft] = 3, legal[rt][ft] = 3; } @@ -7422,7 +7431,7 @@ MarkTargetSquares (int clear) if(clear) { // no reason to ever suppress clearing for(x=0; x= 0) x = kill2X, y = kill2Y; else if(killX >= 0 && killY >= 0) x = killX, y = killY; // [HGM] lion: make SAN move to intermediate square, if there is one (void) CoordsToAlgebraic(boards[forwardMostMove], PosFlags(forwardMostMove), fromY, fromX, y, x, (killX < 0)*promoChar, s); + if(kill2X >= 0 && kill2Y >= 0) + sprintf(s + strlen(s), "x%c%d", killX + AAA, killY + ONE - '0'); // 2nd leg of 3-leg move is always capture if(killX >= 0 && killY >= 0) - sprintf(s + strlen(s), "%c%c%d%c", p == EmptySquare || toX == fromX && toY == fromY ? '-' : 'x', toX + AAA, toY + ONE - '0', promoChar); + sprintf(s + strlen(s), "%c%c%d%c", p == EmptySquare || toX == fromX && toY == fromY || toX== kill2X && toY == kill2Y ? '-' : 'x', + toX + AAA, toY + ONE - '0', promoChar); if(serverMoves != NULL) { /* [HGM] write moves on file for broadcasting (should be separate routine, really) */ int timeLeft; static int lastLoadFlag=0; int king, piece; @@ -10613,7 +10633,7 @@ ShowMove (int fromX, int fromY, int toX, int toY) currentMove = forwardMostMove; } - killX = killY = -1; // [HGM] lion: used up + killX = killY = kill2X = kill2Y = -1; // [HGM] lion: used up if (instant) return; @@ -11456,7 +11476,7 @@ GameEnds (ChessMove result, char *resultDetails, int whosays) result, resultDetails ? resultDetails : "(null)", whosays); } - fromX = fromY = killX = killY = -1; // [HGM] abort any move the user is entering. // [HGM] lion + fromX = fromY = killX = killY = kill2X = kill2Y = -1; // [HGM] abort any move the user is entering. // [HGM] lion if(pausing) PauseEvent(); // can happen when we abort a paused game (New Game or Quit) @@ -11954,7 +11974,7 @@ Reset (int redraw, int init) ClearPremoveHighlights(); gotPremove = FALSE; alarmSounded = FALSE; - killX = killY = -1; // [HGM] lion + killX = killY = kill2X = kill2Y = -1; // [HGM] lion GameEnds(EndOfFile, NULL, GE_PLAYER); if(appData.serverMovesName != NULL) { @@ -12338,7 +12358,7 @@ LoadGameOneMove (ChessMove readAhead) thinkOutput[0] = NULLCHAR; MakeMove(fromX, fromY, toX, toY, promoChar); - killX = killY = -1; // [HGM] lion: used up + killX = killY = kill2X = kill2Y = -1; // [HGM] lion: used up currentMove = forwardMostMove; return TRUE; } @@ -12925,7 +12945,7 @@ LoadGame (FILE *f, int gameNumber, char *title, int useList) if (gameMode != BeginningOfGame) { Reset(FALSE, TRUE); } - killX = killY = -1; // [HGM] lion: in case we did not Reset + killX = killY = kill2X = kill2Y = -1; // [HGM] lion: in case we did not Reset gameFileFP = f; if (lastLoadGameFP != NULL && lastLoadGameFP != f) { @@ -15369,7 +15389,7 @@ EditPositionMenuEvent (ChessSquare selection, int x, int y) switch (selection) { case ClearBoard: - fromX = fromY = killX = killY = -1; // [HGM] abort any move entry in progress + fromX = fromY = killX = killY = kill2X = kill2Y = -1; // [HGM] abort any move entry in progress MarkTargetSquares(1); CopyBoard(currentBoard, boards[0]); CopyBoard(menuBoard, initialPosition); @@ -15822,7 +15842,7 @@ ForwardInner (int target) seekGraphUp = FALSE; MarkTargetSquares(1); - fromX = fromY = killX = killY = -1; // [HGM] abort any move entry in progress + fromX = fromY = killX = killY = kill2X = kill2Y = -1; // [HGM] abort any move entry in progress if (gameMode == PlayFromGameFile && !pausing) PauseEvent(); @@ -15941,7 +15961,7 @@ BackwardInner (int target) if (gameMode == EditPosition) return; seekGraphUp = FALSE; MarkTargetSquares(1); - fromX = fromY = killX = killY = -1; // [HGM] abort any move entry in progress + fromX = fromY = killX = killY = kill2X = kill2Y = -1; // [HGM] abort any move entry in progress if (currentMove <= backwardMostMove) { ClearHighlights(); DrawPosition(full_redraw, boards[currentMove]);