* Massachusetts.\r
*\r
* Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,\r
- * 2007, 2008, 2009 Free Software Foundation, Inc.\r
+ * 2007, 2008, 2009, 2010 Free Software Foundation, Inc.\r
*\r
* XBoard borrows its colors and the bitmaps.xchess bitmap set from XChess,\r
* which was written and is copyrighted by Wayne Christopher.\r
\r
extern long whiteTimeRemaining, blackTimeRemaining, timeControl, timeIncrement;\r
\r
-#if 0\r
-// from moves.h, but no longer needed, as the new routines are all moved to winboard.c\r
-\r
-extern char* PieceToName P((ChessSquare p, int i));\r
-extern char* SquareToChar P((int Xpos)); \r
-extern char* SquareToNum P((int Ypos));\r
-extern int CoordToNum P((char c));\r
-\r
-#endif\r
-\r
// from moves.c, added WinBoard_F piece types and ranks / files\r
\r
char *squareToChar[] = { "ay", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l" };\r
\r
VOID SayString(char *mess, BOOL flag)\r
{ // for debug file\r
- char buf[MSG_SIZ], *p;\r
+ char buf[8000], *p;\r
if(appData.debugMode) fprintf(debugFP, "SAY '%s'\n", mess);\r
strcpy(buf, mess);\r
if(p = StrCaseStr(buf, "Xboard adjudication:")) {\r
\r
helpMenuInfo.cbSize = sizeof(helpMenuInfo);\r
menuMain = GetMenu(hwndMain);\r
- if(appData.debugMode) fprintf(debugFP, "hwndMain: %8x %8x\n", hwndMain, menuMain);\r
menuJAWS = CreatePopupMenu();\r
\r
for(i=0; menuItemJAWS[i].name; i++) {\r
\r
int beeps[] = { 1, 0, 0, 0, 0 };\r
int beepCodes[] = { 0, MB_OK, MB_ICONERROR, MB_ICONQUESTION, MB_ICONEXCLAMATION, MB_ICONASTERISK };\r
+static int dropX = -1, dropY = -1;\r
\r
VOID\r
KeyboardEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
char *piece, *xchar, *ynum ;\r
int n, beepType = 1; // empty beep\r
\r
+ if(fromX == -1 || fromY == -1) { // if we just dropped piece, stay at that square\r
+ fromX = dropX; fromY = dropY;\r
+ dropX = dropY = -1; // but only once\r
+ }\r
if(fromX == -1 || fromY == -1) {\r
fromX = BOARD_LEFT; fromY = 0;\r
}\r
ynum = SquareToNum(fromY);\r
if(currentPiece != EmptySquare) {\r
// SayString(piece[0] == 'W' ? "white" : "black", TRUE);\r
- sprintf(buf, "%s %s %s", piece, xchar, ynum);\r
+ sprintf(buf, "%s %s %s", xchar, ynum, piece);\r
} else sprintf(buf, "%s %s", xchar, ynum);\r
SayString(buf, TRUE);\r
}\r
return;\r
}\r
\r
-extern char castlingRights[MAX_MOVES][BOARD_SIZE];\r
int PosFlags(int nr);\r
\r
typedef struct {\r
swapColor = piece < (int)BlackPawn && !WhiteOnMove(currentMove) ||\r
piece >= (int)BlackPawn && WhiteOnMove(currentMove);\r
cl.count = 0; cl.rf = fromY; cl.ff = fromX; cl.rt = cl.ft = -1;\r
- GenLegal(boards[currentMove], PosFlags(currentMove + swapColor), EP_NONE, \r
- castlingRights[currentMove], ReadCallback, (VOIDSTAR) &cl);\r
+ GenLegal(boards[currentMove], PosFlags(currentMove + swapColor), ReadCallback, (VOIDSTAR) &cl);\r
if(cl.count == 0) SayString("None", FALSE);\r
boards[currentMove][fromY][fromX] = victim; // repair\r
\r
victim = boards[currentMove][fromY][fromX]; // put dummy piece on target square, to activate Pawn captures\r
boards[currentMove][fromY][fromX] = WhiteOnMove(currentMove) ? WhiteQueen : BlackQueen;\r
cl.count = 0; cl.rt = fromY; cl.ft = fromX; cl.rf = cl.ff = -1;\r
- GenLegal(boards[currentMove], PosFlags(currentMove+1), EP_NONE, \r
- castlingRights[currentMove], ReadCallback, (VOIDSTAR) &cl);\r
+ GenLegal(boards[currentMove], PosFlags(currentMove+1), ReadCallback, (VOIDSTAR) &cl);\r
if(cl.count == 0) SayString("None", FALSE);\r
\r
SayString("You are defended by", FALSE);\r
\r
boards[currentMove][fromY][fromX] = WhiteOnMove(currentMove) ? BlackQueen : WhiteQueen;\r
cl.count = 0; cl.rt = fromY; cl.ft = fromX; cl.rf = cl.ff = -1;\r
- GenLegal(boards[currentMove], PosFlags(currentMove), EP_NONE, \r
- castlingRights[currentMove], ReadCallback, (VOIDSTAR) &cl);\r
+ GenLegal(boards[currentMove], PosFlags(currentMove), ReadCallback, (VOIDSTAR) &cl);\r
if(cl.count == 0) SayString("None", FALSE);\r
boards[currentMove][fromY][fromX] = victim; // put back original occupant\r
\r
VOID\r
SayWhosTurn()\r
{\r
- if(gameMode == MachinePlaysBlack || gameMode == IcsPlayingBlack) {\r
+ if(gameMode == MachinePlaysBlack || gameMode == IcsPlayingWhite) {\r
if(WhiteOnMove(currentMove))\r
SayString("It is your turn", FALSE);\r
else SayString("It is your opponents turn", FALSE);\r
- } else if(gameMode == MachinePlaysWhite || gameMode == IcsPlayingWhite) {\r
+ } else if(gameMode == MachinePlaysWhite || gameMode == IcsPlayingBlack) {\r
if(WhiteOnMove(currentMove))\r
SayString("It is your opponents turn", FALSE);\r
else SayString("It is your turn", FALSE);\r
}\r
}\r
\r
+extern char *commentList[];\r
\r
VOID\r
SayMachineMove(int evenIfDuplicate)\r
{\r
int len, xPos, yPos, moveNr, secondSpace = 0, castle = 0, n;\r
ChessSquare currentpiece;\r
- char *piece, *xchar, *ynum, *p;\r
+ char *piece, *xchar, *ynum, *p, checkMark = 0;\r
char c, buf[MSG_SIZ], comment[MSG_SIZ];\r
static char disambiguation[2];\r
static int previousMove = 0;\r
break;\r
}\r
}\r
- if(c != lastMover) return; // line is thinking output of future move, ignore.\r
+ if(c != lastMover && !evenIfDuplicate) return; // line is thinking output of future move, ignore.\r
if(2*moveNr - (dotCount < 2) == previousMove)\r
return; // do not repeat same move; likely ponder output\r
sprintf(buf, "score %s %d at %d ply", \r
if(secondSpace) len = secondSpace; // position behind move\r
if(messageText[len-1] == '+' || messageText[len-1] == '#') { /* you are in checkmate */\r
len--; // strip off check or mate indicator\r
+ checkMark = messageText[len]; // make sure still seen after we stip off promo piece\r
}\r
if(messageText[len-2] == '=') { /* promotion */\r
len-=2; // strip off promotion piece\r
SayString(piece, FALSE);\r
} else SayString("Capturing onn passann",FALSE);\r
}\r
- if(messageText[len] == '+') SayString("check", FALSE); else\r
- if(messageText[len] == '#') {\r
+ }\r
+ if(checkMark == '+') SayString("check", FALSE); else\r
+ if(checkMark == '#') {\r
SayString("finishing off", FALSE);\r
SayString(WhiteOnMove(n) ? "White" : "Black", FALSE);\r
- }\r
}\r
}\r
\r
SayString(comment, FALSE); // alphabetic comment (usually game end)\r
} else if(p) SayString(p, FALSE);\r
\r
+ if(commentDialog && commentList[currentMove]) SetFocus(commentDialog);\r
+\r
} else {\r
/* starts not with digit */\r
if(StrCaseStr(messageText, "illegal")) PlayIcsUnfinishedSound();\r
suppressClocks = 0; // back on after two requests in rapid succession\r
sprintf(buf1, "%s", TimeString(whiteTimeRemaining));\r
str1 = buf1;\r
- SayString("White's remaining time is", FALSE);\r
+ SayString("White clock", FALSE);\r
SayString(str1, FALSE);\r
sprintf(buf2, "%s", TimeString(blackTimeRemaining));\r
str2 = buf2;\r
- SayString("Black's remaining time is", FALSE);\r
+ SayString("Black clock", FALSE);\r
SayString(str2, FALSE);\r
lastWhiteTime = whiteTimeRemaining;\r
lastBlackTime = blackTimeRemaining;\r
(BlackPawn <= pdown && pdown <= BlackKing &&\r
BlackPawn <= pup && pup <= BlackKing))) {\r
/* EditPosition, empty square, or different color piece;\r
- click-click move is possible */\r
+ click-click move is possible */ \r
+ char promoChoice = NULLCHAR;\r
\r
- if (IsPromotion(oldFromX, oldFromY, fromX, fromY)) {\r
+ if (HasPromotionChoice(oldFromX, oldFromY, fromX, fromY, &promoChoice)) {\r
if (appData.alwaysPromoteToQueen) {\r
UserMoveEvent(oldFromX, oldFromY, fromX, fromY, 'q');\r
}\r
} \r
}\r
else {\r
- UserMoveEvent(oldFromX, oldFromY, fromX, fromY, NULLCHAR);\r
+ UserMoveEvent(oldFromX, oldFromY, fromX, fromY, promoChoice);\r
}\r
oldFromX = oldFromY = -1;\r
break;\r
}\r
\r
#define JAWS_ARGS \\r
- { "beepOffBoard", ArgInt, (LPVOID) beeps, TRUE },\\r
- { "beepEmpty", ArgInt, (LPVOID) (beeps+1), TRUE },\\r
- { "beepWhite", ArgInt, (LPVOID) (beeps+2), TRUE },\\r
- { "beepBlack", ArgInt, (LPVOID) (beeps+3), TRUE },\\r
- { "beepHoldings", ArgInt, (LPVOID) (beeps+4), TRUE },\\r
+ { "beepOffBoard", ArgInt, (LPVOID) beeps, TRUE, (ArgIniType) 1 },\\r
+ { "beepEmpty", ArgInt, (LPVOID) (beeps+1), TRUE, (ArgIniType) 0 },\\r
+ { "beepWhite", ArgInt, (LPVOID) (beeps+2), TRUE, (ArgIniType) 0 },\\r
+ { "beepBlack", ArgInt, (LPVOID) (beeps+3), TRUE, (ArgIniType) 0 },\\r
+ { "beepHoldings", ArgInt, (LPVOID) (beeps+4), TRUE, (ArgIniType) 0 },\\r
\r
#define JAWS_ALT_INTERCEPT \\r
if(suppressOneKey) {\\r
if ((char)wParam == 022 && gameMode == EditPosition) { /* <Ctl R>. Pop up piece menu */\\r
POINT pt; int x, y;\\r
SquareToPos(fromY, fromX, &x, &y);\\r
+ dropX = fromX; dropY = fromY;\\r
pt.x = x; pt.y = y;\\r
if(gameInfo.variant != VariantShogi)\\r
MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1);\\r