X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=f969aba5814a6b674c30e3651233ea42621b79e1;hb=624048ee61b5b5de2934df02474e6b25b0b931e0;hp=3e432aefbb76ebad5f9281837064b58c7a3d7ced;hpb=cfafc82a47f718181d7de520fd7616156a647656;p=xboard.git diff --git a/backend.c b/backend.c index 3e432ae..f969aba 100644 --- a/backend.c +++ b/backend.c @@ -6948,7 +6948,7 @@ UserMoveEvent(int fromX, int fromY, int toX, int toY, int promoChar) /* EditPosition, empty square, or different color piece; click-click move is possible */ if (toX == -2 || toY == -2) { - boards[0][fromY][fromX] = EmptySquare; + boards[0][fromY][fromX] = (boards[0][fromY][fromX] == EmptySquare ? DarkSquare : EmptySquare); DrawPosition(FALSE, boards[currentMove]); return; } else if (toX >= 0 && toY >= 0) { @@ -7323,8 +7323,8 @@ CanPromote (ChessSquare piece, int y) gameInfo.variant == VariantMakruk || gameInfo.variant == VariantASEAN) return FALSE; return (piece == BlackPawn && y <= zone || piece == WhitePawn && y >= BOARD_HEIGHT-1-zone || - piece == BlackLance && y == 1 || - piece == WhiteLance && y == BOARD_HEIGHT-2 ); + piece == BlackLance && y <= zone || + piece == WhiteLance && y >= BOARD_HEIGHT-1-zone ); } void @@ -7367,6 +7367,8 @@ void ReportClick(char *action, int x, int y) SendToProgram(buf, &first); } +Boolean right; // instructs front-end to use button-1 events as if they were button 3 + void LeftClick (ClickType clickType, int xPix, int yPix) { @@ -7377,13 +7379,6 @@ LeftClick (ClickType clickType, int xPix, int yPix) ChessSquare piece; static TimeMark lastClickTime, prevClickTime; - if(SeekGraphClick(clickType, xPix, yPix, 0)) return; - - prevClickTime = lastClickTime; GetTimeMark(&lastClickTime); - - if (clickType == Press) ErrorPopDown(); - lastClickType = clickType, lastLeftX = xPix, lastLeftY = yPix; // [HGM] alien: remember state - x = EventToSquare(xPix, BOARD_WIDTH); y = EventToSquare(yPix, BOARD_HEIGHT); if (!flipView && y >= 0) { @@ -7393,6 +7388,20 @@ LeftClick (ClickType clickType, int xPix, int yPix) x = BOARD_WIDTH - 1 - x; } + if(appData.monoMouse && gameMode == EditPosition && fromX < 0 && clickType == Press && boards[currentMove][y][x] == EmptySquare) { + static int dummy; + RightClick(clickType, xPix, yPix, &dummy, &dummy); + right = TRUE; + return; + } + + if(SeekGraphClick(clickType, xPix, yPix, 0)) return; + + prevClickTime = lastClickTime; GetTimeMark(&lastClickTime); + + if (clickType == Press) ErrorPopDown(); + lastClickType = clickType, lastLeftX = xPix, lastLeftY = yPix; // [HGM] alien: remember state + if(promoSweep != EmptySquare) { // up-click during sweep-select of promo-piece defaultPromoChoice = promoSweep; promoSweep = EmptySquare; // terminate sweep @@ -7501,6 +7510,7 @@ LeftClick (ClickType clickType, int xPix, int yPix) toP = boards[currentMove][y][x]; frc = appData.fischerCastling || gameInfo.variant == VariantSChess; if( (killX < 0 || x != fromX || y != fromY) && // [HGM] lion: do not interpret igui as deselect! + legal[y][x] == 0 && // if engine told we can move to here, do it even if own piece ((WhitePawn <= fromP && fromP <= WhiteKing && WhitePawn <= toP && toP <= WhiteKing && !(fromP == WhiteKing && toP == WhiteRook && frc) && @@ -9889,14 +9899,14 @@ ParseGameHistory (char *game) void ApplyMove (int fromX, int fromY, int toX, int toY, int promoChar, Board board) { - ChessSquare captured = board[toY][toX], piece, king; int p, rookX, oldEP = EP_NONE, berolina = 0; + ChessSquare captured = board[toY][toX], piece, pawn, king, killed; int p, rookX, oldEP, epRank, berolina = 0; int promoRank = gameInfo.variant == VariantMakruk || gameInfo.variant == VariantGrand || gameInfo.variant == VariantChuChess ? 3 : 1; /* [HGM] compute & store e.p. status and castling rights for new position */ /* we can always do that 'in place', now pointers to these rights are passed to ApplyMove */ if(gameInfo.variant == VariantBerolina) berolina = EP_BEROLIN_A; - oldEP = (signed char)board[EP_STATUS]; + oldEP = (signed char)board[EP_FILE]; epRank = board[EP_RANK]; board[EP_STATUS] = EP_NONE; board[EP_FILE] = board[EP_RANK] = 100; @@ -9913,6 +9923,7 @@ ApplyMove (int fromX, int fromY, int toX, int toY, int promoChar, Board board) if( killX >= 0 && killY >= 0 ) // [HGM] lion: Lion trampled over something // victim = board[killY][killX], + killed = board[killY][killX], board[killY][killX] = EmptySquare, board[EP_STATUS] = EP_CAPTURE; @@ -9925,14 +9936,14 @@ ApplyMove (int fromX, int fromY, int toX, int toY, int promoChar, Board board) } } - piece = board[fromY][fromX]; - if( piece == WhiteLance || piece == BlackLance ) { + pawn = board[fromY][fromX]; + if( pawn == WhiteLance || pawn == BlackLance ) { if( gameInfo.variant != VariantSuper && gameInfo.variant != VariantChu ) { if(gameInfo.variant == VariantSpartan) board[EP_STATUS] = EP_PAWN_MOVE; // in Spartan no e.p. rights must be set - else piece += WhiteLance - WhitePawn; // Lance is Pawn-like in most variants, so let Pawn code treat it by this kludge + else pawn += WhitePawn - WhiteLance; // Lance is Pawn-like in most variants, so let Pawn code treat it by this kludge } } - if( piece == WhitePawn ) { + if( pawn == WhitePawn ) { if(fromY != toY) // [HGM] Xiangqi sideway Pawn moves should not count as 50-move breakers board[EP_STATUS] = EP_PAWN_MOVE; if( toY-fromY>=2) { @@ -9945,7 +9956,7 @@ ApplyMove (int fromX, int fromY, int toX, int toY, int promoChar, Board board) board[EP_STATUS] = toX; } } else - if( piece == BlackPawn ) { + if( pawn == BlackPawn ) { if(fromY != toY) // [HGM] Xiangqi sideway Pawn moves should not count as 50-move breakers board[EP_STATUS] = EP_PAWN_MOVE; if( toY-fromY<= -2) { @@ -9984,6 +9995,12 @@ ApplyMove (int fromX, int fromY, int toX, int toY, int promoChar, Board board) if(gameInfo.variant == VariantKnightmate) king += (int) WhiteUnicorn - (int) WhiteKing; + if(piece != WhiteKing && piece != BlackKing && pieceDesc[piece] && killX >= 0 && strchr(pieceDesc[piece], 'O') // Betza castling-enabled + && (piece < BlackPawn ? killed < BlackPawn : killed >= BlackPawn)) { // and captures own + board[toY][toX] = piece; board[fromY][fromX] = EmptySquare; + board[toY][toX + (killX < fromX ? 1 : -1)] = killed; + board[EP_STATUS] = EP_NONE; // capture was fake! + } else /* Code added by Tord: */ /* FRC castling assumed when king captures friendly rook. [HGM] or RxK for S-Chess */ if (board[fromY][fromX] == WhiteKing && board[toY][toX] == WhiteRook || @@ -10038,11 +10055,11 @@ ApplyMove (int fromX, int fromY, int toX, int toY, int promoChar, Board board) && (toX != fromX) && gameInfo.variant != VariantXiangqi && gameInfo.variant != VariantBerolina - && (board[fromY][fromX] == WhitePawn) + && (pawn == WhitePawn) && (board[toY][toX] == EmptySquare)) { board[fromY][fromX] = EmptySquare; - board[toY][toX] = WhitePawn; - if(toY == board[EP_RANK] - 128 + 1) + board[toY][toX] = piece; + if(toY == epRank - 128 + 1) captured = board[toY - 2][toX], board[toY - 2][toX] = EmptySquare; else captured = board[toY - 1][toX], board[toY - 1][toX] = EmptySquare; @@ -10103,11 +10120,11 @@ ApplyMove (int fromX, int fromY, int toX, int toY, int promoChar, Board board) && (toX != fromX) && gameInfo.variant != VariantXiangqi && gameInfo.variant != VariantBerolina - && (board[fromY][fromX] == BlackPawn) + && (pawn == BlackPawn) && (board[toY][toX] == EmptySquare)) { board[fromY][fromX] = EmptySquare; - board[toY][toX] = BlackPawn; - if(toY == board[EP_RANK] - 128 - 1) + board[toY][toX] = piece; + if(toY == epRank - 128 - 1) captured = board[toY + 2][toX], board[toY + 2][toX] = EmptySquare; else captured = board[toY + 1][toX], board[toY + 1][toX] = EmptySquare; @@ -15113,7 +15130,7 @@ EditPositionMenuEvent (ChessSquare selection, int x, int y) AAA + x, ONE + y); SendToICS(buf); } - } else { + } else if(boards[0][y][x] != DarkSquare) { if(boards[0][y][x] != p) nonEmpty++; boards[0][y][x] = p; }