From fd1213c4557770ea82b25e443230345f50dfb97c Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Mon, 4 Jul 2011 11:06:12 +0200 Subject: [PATCH] Let -sweepPromotions also work for click-click moves A click-click promotion no longer causes auto-queening, but the down-click on the to-square causes a Queen to stick to the mouse pointer, and then allows the user to change it through dragging backwards before releasing it with an up-click. In WinBoard this required a slight change in DragPieceBegin, because the dragged piece there only was made visible when the mouse pointer actually started moving (and dragInfo.pos was set), presumably under the assumption that before mouse move the piece was already on the clicked square. Which in the case of a to-square was of course not true. (Because a piece jumps to the mouse pointer when the click is not centered on a square, this gives less jittery static clicks.) So DragPieceBegin has been given an extra argument now, to indicate whether it should attach the piece to the mouse pointer immediately. To make the click-click sweepPromotions work in Shogi (for which the drag-drop sweepPromotions could never work, because it is not clear the piece has a posibility to promote when you pick it up), translation of the sweep-selected piece to a Shogi promoChar had to e added. --- backend.c | 31 +++++++++++++++++++++---------- backend.h | 2 +- frontend.h | 2 +- winboard/winboard.c | 3 ++- xboard.c | 4 ++-- 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/backend.c b/backend.c index e08e829..eaaa87a 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 @@ -6819,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 @@ -6872,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) { @@ -6880,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; @@ -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; @@ -6990,10 +6990,21 @@ void LeftClick(ClickType clickType, int xPix, int yPix) 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); @@ -7044,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 diff --git a/backend.h b/backend.h index aacc706..9dccb7f 100644 --- a/backend.h +++ b/backend.h @@ -126,7 +126,7 @@ void SetBlackToPlayEvent P((void)); void UploadGameEvent P((void)); void InitBackEnd1 P((void)); void InitBackEnd2 P((void)); -int HasPromotionChoice P((int fromX, int fromY, int toX, int toY, char *choice)); +int HasPromotionChoice P((int fromX, int fromY, int toX, int toY, char *choice, int sweep)); int InPalace P((int row, int column)); int PieceForSquare P((int x, int y)); int OKToStartUserMove P((int x, int y)); diff --git a/frontend.h b/frontend.h index 24d1852..483356a 100644 --- a/frontend.h +++ b/frontend.h @@ -135,7 +135,7 @@ void CancelDelayedEvent P((void)); extern int fromX, fromY, toX, toY; typedef enum { Press, Release } ClickType; void PromotionPopUp P((void)); -void DragPieceBegin P((int x, int y)); +void DragPieceBegin P((int x, int y, Boolean instantly)); void DragPieceEnd P((int x, int y)); void LeftClick P((ClickType c, int x, int y)); int RightClick P((ClickType c, int x, int y, int *col, int *row)); diff --git a/winboard/winboard.c b/winboard/winboard.c index 17dccdd..cf66f76 100644 --- a/winboard/winboard.c +++ b/winboard/winboard.c @@ -4067,10 +4067,11 @@ SetupDropMenu(HMENU hmenu) } } -void DragPieceBegin(int x, int y) +void DragPieceBegin(int x, int y, Boolean instantly) { dragInfo.lastpos.x = boardRect.left + x; dragInfo.lastpos.y = boardRect.top + y; + if(instantly) dragInfo.pos = dragInfo.lastpos; dragInfo.from.x = fromX; dragInfo.from.y = fromY; dragInfo.piece = boards[currentMove][fromY][fromX]; diff --git a/xboard.c b/xboard.c index b4efcd7..2bff8e4 100644 --- a/xboard.c +++ b/xboard.c @@ -8644,8 +8644,8 @@ AnimateMove(board, fromX, fromY, toX, toY) } void -DragPieceBegin(x, y) - int x; int y; +DragPieceBegin(x, y, instantly) + int x; int y; Boolean instantly; { int boardX, boardY, color; XPoint corner; -- 1.7.0.4