X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=21562ab8318bb609e6ba3082d8dd1c6aac56adb0;hb=56310c5b198bc521e0a715377c68378b7bcf10a5;hp=cc5fb3aa5a13a8d07ed3f5009d40f2dc51b80a5b;hpb=d9236358bbc4eea6a967503078ac6fc6a881d1da;p=xboard.git diff --git a/backend.c b/backend.c index cc5fb3a..21562ab 100644 --- a/backend.c +++ b/backend.c @@ -6080,7 +6080,7 @@ DefaultPromoChoice(int white) static int autoQueen; // [HGM] oneclick int -HasPromotionChoice(int fromX, int fromY, int toX, int toY, char *promoChoice) +HasPromotionChoice(int fromX, int fromY, int toX, int toY, char *promoChoice, int sweepSelect) { /* [HGM] rewritten IsPromotion to only flag promotions that offer a choice */ /* [HGM] add Shogi promotions */ @@ -6162,9 +6162,9 @@ HasPromotionChoice(int fromX, int fromY, int toX, int toY, char *promoChoice) } // give caller the default choice even if we will not make it *promoChoice = ToLower(PieceToChar(defaultPromoChoice)); - if(gameInfo.variant == VariantShogi) *promoChoice = '+'; - if(appData.sweepSelect && gameInfo.variant != VariantGreat - && gameInfo.variant != VariantShogi + if(gameInfo.variant == VariantShogi) *promoChoice = (defaultPromoChoice == piece ? '=' : '+'); + if( sweepSelect && gameInfo.variant != VariantGreat + && gameInfo.variant != VariantGrand && gameInfo.variant != VariantSuper) return FALSE; if(autoQueen) return FALSE; // predetermined @@ -6805,7 +6805,6 @@ void LeftClick(ClickType clickType, int xPix, int yPix) } if (clickType == Press) ErrorPopDown(); - MarkTargetSquares(1); x = EventToSquare(xPix, BOARD_WIDTH); y = EventToSquare(yPix, BOARD_HEIGHT); @@ -6820,7 +6819,7 @@ void LeftClick(ClickType clickType, int xPix, int yPix) defaultPromoChoice = promoSweep; promoSweep = EmptySquare; // terminate sweep promoDefaultAltered = TRUE; - if(!selectFlag) x = fromX, y = fromY; // and fake up-click on same square if we were still selecting + if(!selectFlag && (x != toX || y != toY)) x = fromX, y = fromY; // and fake up-click on same square if we were still selecting } if(promotionChoice) { // we are waiting for a click to indicate promotion piece @@ -6873,7 +6872,7 @@ void LeftClick(ClickType clickType, int xPix, int yPix) } return; } - fromX = x; fromY = y; + fromX = x; fromY = y; toX = toY = -1; if(!appData.oneClick || !OnlyMove(&x, &y, FALSE) || // even if only move, we treat as normal when this would trigger a promotion popup, to allow sweep selection appData.sweepSelect && CanPromote(boards[currentMove][fromY][fromX], fromY) && originalY != y) { @@ -6881,7 +6880,7 @@ void LeftClick(ClickType clickType, int xPix, int yPix) if (OKToStartUserMove(fromX, fromY)) { second = 0; MarkTargetSquares(0); - DragPieceBegin(xPix, yPix); dragging = 1; + DragPieceBegin(xPix, yPix, FALSE); dragging = 1; if(appData.sweepSelect && CanPromote(piece = boards[currentMove][fromY][fromX], fromY)) { promoSweep = defaultPromoChoice; selectFlag = 0; lastX = xPix; lastY = yPix; @@ -6920,6 +6919,7 @@ void LeftClick(ClickType clickType, int xPix, int yPix) /* Clicked again on same color piece -- changed his mind */ second = (x == fromX && y == fromY); promoDefaultAltered = FALSE; + MarkTargetSquares(1); if(!second || appData.oneClick && !OnlyMove(&x, &y, TRUE)) { if (appData.highlightDragging) { SetHighlights(x, y, -1, -1); @@ -6935,7 +6935,7 @@ void LeftClick(ClickType clickType, int xPix, int yPix) fromX = x; fromY = y; dragging = 1; MarkTargetSquares(0); - DragPieceBegin(xPix, yPix); + DragPieceBegin(xPix, yPix, FALSE); if(appData.sweepSelect && CanPromote(piece = boards[currentMove][y][x], y)) { promoSweep = defaultPromoChoice; selectFlag = 0; lastX = xPix; lastY = yPix; @@ -6986,13 +6986,25 @@ void LeftClick(ClickType clickType, int xPix, int yPix) toX = x; toY = y; saveAnimate = appData.animate; + MarkTargetSquares(1); if (clickType == Press) { if(gameMode == EditPosition && boards[currentMove][fromY][fromX] == EmptySquare) { // must be Edit Position mode with empty-square selected - fromX = x; fromY = y; DragPieceBegin(xPix, yPix); dragging = 1; // consider this a new attempt to drag + fromX = x; fromY = y; DragPieceBegin(xPix, yPix, FALSE); dragging = 1; // consider this a new attempt to drag if(x >= BOARD_LEFT && x < BOARD_RGHT) clearFlag = 1; // and defer click-click move of empty-square to up-click return; } + if(appData.sweepSelect && HasPromotionChoice(fromX, fromY, toX, toY, &promoChoice, FALSE)) { + ChessSquare piece = boards[currentMove][fromY][fromX]; + DragPieceBegin(xPix, yPix, TRUE); dragging = 1; + promoSweep = defaultPromoChoice; + if(PieceToChar(PROMOTED piece) == '+') promoSweep = PROMOTED piece; + selectFlag = 0; lastX = xPix; lastY = yPix; + Sweep(0); // Pawn that is going to promote: preview promotion piece + DisplayMessage("", _("Pull pawn backwards to under-promote")); + DrawPosition(FALSE, boards[currentMove]); + return; + } /* Finish clickclick move */ if (appData.animate || appData.highlightLastMove) { SetHighlights(fromX, fromY, toX, toY); @@ -7043,7 +7055,7 @@ void LeftClick(ClickType clickType, int xPix, int yPix) if(gatingPiece != EmptySquare) promoChoice = ToLower(PieceToChar(gatingPiece)); - if (HasPromotionChoice(fromX, fromY, toX, toY, &promoChoice)) { + if (HasPromotionChoice(fromX, fromY, toX, toY, &promoChoice, appData.sweepSelect)) { SetHighlights(fromX, fromY, toX, toY); if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat || gameInfo.variant == VariantGrand) { // [HGM] super: promotion to captured piece selected from holdings @@ -9683,7 +9695,7 @@ WriteTourneyFile(char *results) fprintf(f, "-loadPositionIndex %d\n", appData.loadPositionIndex); fprintf(f, "-rewindIndex %d\n", appData.rewindIndex); if(searchTime > 0) - fprintf(f, "-searchTime \"%s\"\n", appData.searchTime); + fprintf(f, "-searchTime \"%d:%02d\"\n", searchTime/60, searchTime%60); else { fprintf(f, "-mps %d\n", appData.movesPerSession); fprintf(f, "-tc %s\n", appData.timeControl); @@ -15199,8 +15211,6 @@ DisplayComment(moveNumber, text) char *text; { char title[MSG_SIZ]; - char buf[8000]; // comment can be long! - int score, depth; if (moveNumber < 0 || parseList[moveNumber][0] == NULLCHAR) { safeStrCpy(title, "Comment", sizeof(title)/sizeof(title[0])); @@ -15209,14 +15219,6 @@ DisplayComment(moveNumber, text) WhiteOnMove(moveNumber) ? " " : ".. ", parseList[moveNumber]); } - // [HGM] PV info: display PV info together with (or as) comment - if(moveNumber >= 0 && (depth = pvInfoList[moveNumber].depth) > 0) { - if(text == NULL) text = ""; - score = pvInfoList[moveNumber].score; - snprintf(buf,sizeof(buf)/sizeof(buf[0]), "%s%.2f/%d %d\n%s", score>0 ? "+" : "", score/100., - depth, (pvInfoList[moveNumber].time+50)/100, text); - text = buf; - } if (text != NULL && (appData.autoDisplayComment || commentUp)) CommentPopUp(title, text); } @@ -15821,7 +15823,7 @@ PositionToFEN(move, overrideCastling) { int i, j, fromX, fromY, toX, toY; int whiteToPlay; - char buf[128]; + char buf[MSG_SIZ]; char *p, *q; int emptycount; ChessSquare piece; @@ -15832,6 +15834,7 @@ PositionToFEN(move, overrideCastling) /* Piece placement data */ for (i = BOARD_HEIGHT - 1; i >= 0; i--) { + if(MSG_SIZ - (p - buf) < BOARD_RGHT - BOARD_LEFT + 20) { *p = 0; return StrSave(buf); } emptycount = 0; for (j = BOARD_LEFT; j < BOARD_RGHT; j++) { if (boards[move][i][j] == EmptySquare) {