X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=1cd59ce88ab2683157a4ea3ad1e69ff73bfabe66;hb=2ad3ca1ba84d14592ebcee541d4c27eb505d0784;hp=9ac6a5830f0e1e0403321996601eed7a26f72f30;hpb=fbcf1f3b86b144dd4940b326c32d4b105c0f74b3;p=xboard.git diff --git a/backend.c b/backend.c index 9ac6a58..1cd59ce 100644 --- a/backend.c +++ b/backend.c @@ -2446,6 +2446,7 @@ VariantSwitch (Board board, VariantClass newVariant) board[i][j+newHoldingsWidth-gameInfo.holdingsWidth] = board[i][j]; } + board[HOLDINGS_SET] = 0; gameInfo.boardWidth = newWidth; gameInfo.boardHeight = newHeight; gameInfo.holdingsWidth = newHoldingsWidth; @@ -4241,10 +4242,12 @@ ParseBoard12 (char *string) break; } - if((gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack) + if((gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || + gameMode == IcsObserving && appData.dualBoard) // also allow use of second board for observing two games && newGameMode == IcsObserving && gamenum != ics_gamenum && appData.bgObserve) { // [HGM] bughouse: don't act on alien boards while we play. Just parse the board and save it */ int fac = strchr(elapsed_time, '.') ? 1 : 1000; + static int lastBgGame = -1; char *toSqr; for (k = 0; k < ranks; k++) { for (j = 0; j < files; j++) @@ -4270,6 +4273,12 @@ ParseBoard12 (char *string) DisplayWhiteClock(white_time*fac, to_play == 'W'); DisplayBlackClock(black_time*fac, to_play != 'W'); activePartner = to_play; + if(gamenum != lastBgGame) { + char buf[MSG_SIZ]; + snprintf(buf, MSG_SIZ, "%s %s %s", white, _("vs."), black); + DisplayTitle(buf); + } + lastBgGame = gamenum; activePartnerTime = to_play == 'W' ? white_time*fac : black_time*fac; partnerUp = 0; flipView = !flipView; } // [HGM] dual snprintf(partnerStatus, MSG_SIZ,"W: %d:%02d B: %d:%02d (%d-%d) %c", white_time*fac/60000, (white_time*fac%60000)/1000, @@ -4279,6 +4288,16 @@ ParseBoard12 (char *string) return; } + if(appData.dualBoard && appData.bgObserve) { + if((newGameMode == IcsPlayingWhite || newGameMode == IcsPlayingBlack) && moveNum == 1) + SendToICS(ics_prefix), SendToICS("pobserve\n"); + else if(newGameMode == IcsObserving && (gameMode == BeginningOfGame || gameMode == IcsIdle)) { + char buf[MSG_SIZ]; + snprintf(buf, MSG_SIZ, "%spobserve %s\n", ics_prefix, white); + SendToICS(buf); + } + } + /* Modify behavior for initial board display on move listing of wild games. */ @@ -4313,6 +4332,7 @@ ParseBoard12 (char *string) } if (gameInfo.boardHeight != ranks || gameInfo.boardWidth != files || + move_str[1] == '@' && !gameInfo.holdingsWidth || weird && (int)gameInfo.variant < (int)VariantShogi) { /* [HGM] We seem to have switched variant unexpectedly * Try to guess new variant from board size @@ -4322,7 +4342,8 @@ ParseBoard12 (char *string) if(ranks == 10 && files == 9) newVariant = VariantXiangqi; else if(ranks == 8 && files == 12) newVariant = VariantCourier; else if(ranks == 9 && files == 9) newVariant = VariantShogi; else - if(!weird) newVariant = VariantNormal; + if(ranks == 10 && files == 10) newVariant = VariantGrand; else + if(!weird) newVariant = move_str[1] == '@' ? VariantCrazyhouse : VariantNormal; VariantSwitch(boards[currentMove], newVariant); /* temp guess */ /* Get a move list just to see the header, which will tell us whether this is really bug or zh */ @@ -5173,6 +5194,12 @@ Sweep (int step) } while(PieceToChar(promoSweep) == '.' || PieceToChar(promoSweep) == '~' || promoSweep == pawn || appData.testLegality && (promoSweep == king || gameInfo.variant == VariantShogi && promoSweep != PROMOTED last && last != PROMOTED promoSweep && last != promoSweep)); + if(toX >= 0) { + int victim = boards[currentMove][toY][toX]; + boards[currentMove][toY][toX] = promoSweep; + DrawPosition(FALSE, boards[currentMove]); + boards[currentMove][toY][toX] = victim; + } else ChangeDragPiece(promoSweep); } @@ -6971,7 +6998,7 @@ LeftClick (ClickType clickType, int xPix, int yPix) { int x, y; Boolean saveAnimate; - static int second = 0, promotionChoice = 0, clearFlag = 0; + static int second = 0, promotionChoice = 0, clearFlag = 0, sweepSelecting = 0; char promoChoice = NULLCHAR; ChessSquare piece; static TimeMark lastClickTime, prevClickTime; @@ -6995,7 +7022,7 @@ LeftClick (ClickType clickType, int xPix, int yPix) defaultPromoChoice = promoSweep; promoSweep = EmptySquare; // terminate sweep promoDefaultAltered = TRUE; - if(!selectFlag && (x != toX || y != toY)) x = fromX, y = fromY; // and fake up-click on same square if we were still selecting + if(!selectFlag && !sweepSelecting && (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 @@ -7154,9 +7181,10 @@ LeftClick (ClickType clickType, int xPix, int yPix) /* Undo animation damage if any */ DrawPosition(FALSE, NULL); } - if (second) { + if (second || sweepSelecting) { /* Second up/down in same square; just abort move */ - second = 0; + if(sweepSelecting) DrawPosition(FALSE, boards[currentMove]); + second = sweepSelecting = 0; fromX = fromY = -1; gatingPiece = EmptySquare; ClearHighlights(); @@ -7173,9 +7201,12 @@ LeftClick (ClickType clickType, int xPix, int yPix) /* we now have a different from- and (possibly off-board) to-square */ /* Completed move */ - toX = x; - toY = y; - saveAnimate = appData.animate; + if(!sweepSelecting) { + toX = x; + toY = y; + saveAnimate = appData.animate; + } else sweepSelecting = 0; // this must be the up-click corresponding to the down-click that started the sweep + if (clickType == Press) { if(gameMode == EditPosition && boards[currentMove][fromY][fromX] == EmptySquare) { // must be Edit Position mode with empty-square selected @@ -7186,16 +7217,13 @@ LeftClick (ClickType clickType, int xPix, int yPix) if(HasPromotionChoice(fromX, fromY, toX, toY, &promoChoice, FALSE)) { if(appData.sweepSelect) { ChessSquare piece = boards[currentMove][fromY][fromX]; - ChessSquare victim = boards[currentMove][toY][toX]; - boards[currentMove][toY][toX] = piece; // kludge: make sure there is something to grab for drag - DragPieceBegin(xPix, yPix, TRUE); dragging = 1; - boards[currentMove][toY][toX] = victim; 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 + sweepSelecting = 1; DisplayMessage("", _("Pull pawn backwards to under-promote")); - DrawPosition(FALSE, boards[currentMove]); + MarkTargetSquares(1); } return; // promo popup appears on up-click }