char *ordinals[] = {"zeroth", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "nineth"};\r
\r
char *pieceToName[] = {\r
- "White Pawn", "White Knight", "White Bishop", "White Rook", "White Queen", \r
+ "White Pawn", "White Knight", "White Bishop", "White Rook", "White Queen",\r
"White Guard", "White Elephant", "White Arch Bishop", "White Chancellor",\r
"White General", "White Man", "White Cannon", "White Night Rider",\r
"White Crowned Bishop", "White Crowned Rook", "White Grass Hopper", "White Veteran",\r
};\r
\r
char *pieceTypeName[] = {\r
- "Pawn", "Knight", "Bishop", "Rook", "Queen", \r
+ "Pawn", "Knight", "Bishop", "Rook", "Queen",\r
"Guard", "Elephant", "Arch Bishop", "Chancellor",\r
"General", "Man", "Cannon", "Night Rider",\r
"Crowned Bishop", "Crowned Rook", "Grass Hopper", "Veteran",\r
"Falcon", "Amazon", "Snake", "Unicorn",\r
"King",\r
- "Pawn", "Knight", "Bishop", "Rook", "Queen", \r
+ "Pawn", "Knight", "Bishop", "Rook", "Queen",\r
"Guard", "Elephant", "Arch Bishop", "Chancellor",\r
"General", "Man", "Cannon", "Night Rider",\r
"Crowned Bishop", "Crowned Rook", "Grass Hopper", "Veteran",\r
{ // for debug file\r
char buf[8000], *p;\r
if(appData.debugMode) fprintf(debugFP, "SAY '%s'\n", mess);\r
- strcpy(buf, mess);\r
+ safeStrCpy(buf, mess, sizeof(buf)/sizeof(buf[0]));\r
if(p = StrCaseStr(buf, "Xboard adjudication:")) {\r
int i;\r
for(i=19; i>1; i--) p[i] = p[i-1];\r
helpMenuInfo.cbSize = sizeof(helpMenuInfo);\r
menuMain = GetMenu(hwndMain);\r
menuJAWS = CreatePopupMenu();\r
- \r
+\r
for(i=0; menuItemJAWS[i].name; i++) {\r
- if(menuItemJAWS[i].name[0] == '-') \r
+ if(menuItemJAWS[i].name[0] == '-')\r
AppendMenu(menuJAWS, MF_SEPARATOR, (UINT_PTR) 0, NULL);\r
- else AppendMenu(menuJAWS, MF_ENABLED|MF_STRING, \r
+ else AppendMenu(menuJAWS, MF_ENABLED|MF_STRING,\r
(UINT_PTR) menuItemJAWS[i].code, (LPCTSTR) menuItemJAWS[i].name);\r
}\r
- InsertMenu(menuMain, 5, MF_BYPOSITION|MF_POPUP|MF_ENABLED|MF_STRING, \r
+ InsertMenu(menuMain, 5, MF_BYPOSITION|MF_POPUP|MF_ENABLED|MF_STRING,\r
(UINT_PTR) menuJAWS, "&JAWS");\r
oldMenuItemState[6] = oldMenuItemState[5];\r
DrawMenuBar(hwndMain);\r
{ // to be called at beginning of WinMain, after InitApplication and InitInstance\r
HINSTANCE hApi = LoadLibrary("jfwapi32.dll");\r
if(!hApi) {\r
- DisplayInformation("Missing jfwapi32.dll"); \r
+ DisplayInformation("Missing jfwapi32.dll");\r
return (FALSE);\r
}\r
\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
if(currentPiece != EmptySquare) {\r
char buf[MSG_SIZ];\r
n = boards[currentMove][fromY][1];\r
- sprintf(buf, "%d %s%s", n, PieceToName(currentPiece,0), n == 1 ? "" : "s");\r
+ snprintf(buf, MSG_SIZ, "%d %s%s", n, PieceToName(currentPiece,0), n == 1 ? "" : "s");\r
SayString(buf, TRUE);\r
}\r
} else\r
if(currentPiece != EmptySquare) {\r
char buf[MSG_SIZ];\r
n = boards[currentMove][fromY][BOARD_WIDTH-2];\r
- sprintf(buf, "%d %s%s", n, PieceToName(currentPiece,0), n == 1 ? "" : "s");\r
+ snprintf(buf, MSG_SIZ,"%d %s%s", n, PieceToName(currentPiece,0), n == 1 ? "" : "s");\r
SayString(buf, TRUE);\r
}\r
} else\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
- } else sprintf(buf, "%s %s", xchar, ynum);\r
+ snprintf(buf, MSG_SIZ, "%s %s %s", xchar, ynum, piece);\r
+ } else snprintf(buf, MSG_SIZ, "%s %s", xchar, ynum);\r
SayString(buf, TRUE);\r
}\r
return;\r
VOID\r
ReadRow()\r
{\r
- ChessSquare currentpiece; \r
+ ChessSquare currentpiece;\r
char *piece, *xchar, *ynum ;\r
int xPos, count=0;\r
ynum = SquareToNum(fromY);\r
- \r
+\r
if(fromY < 0) return;\r
\r
for (xPos=BOARD_LEFT; xPos<BOARD_RGHT; xPos++) {\r
- currentpiece = boards[currentMove][fromY][xPos]; \r
+ currentpiece = boards[currentMove][fromY][xPos];\r
if(currentpiece != EmptySquare) {\r
piece = PieceToName(currentpiece,1);\r
xchar = SquareToChar(xPos);\r
VOID\r
ReadColumn()\r
{\r
- ChessSquare currentpiece; \r
+ ChessSquare currentpiece;\r
char *piece, *xchar, *ynum ;\r
int yPos, count=0;\r
xchar = SquareToChar(fromX);\r
- \r
+\r
if(fromX < 0) return;\r
\r
for (yPos=0; yPos<BOARD_HEIGHT; yPos++) {\r
- currentpiece = boards[currentMove][yPos][fromX]; \r
+ currentpiece = boards[currentMove][yPos][fromX];\r
if(currentpiece != EmptySquare) {\r
piece = PieceToName(currentpiece,1);\r
ynum = SquareToNum(yPos);\r
VOID\r
SayUpperDiagnols()\r
{\r
- ChessSquare currentpiece; \r
+ ChessSquare currentpiece;\r
char *piece, *xchar, *ynum ;\r
int yPos, xPos;\r
- \r
+\r
if(fromX < 0 || fromY < 0) return;\r
\r
if(fromX < BOARD_RGHT-1 && fromY < BOARD_HEIGHT-1) {\r
yPos = fromY+1;\r
xPos = fromX+1;\r
while(yPos<BOARD_HEIGHT && xPos<BOARD_RGHT) {\r
- currentpiece = boards[currentMove][yPos][xPos]; \r
+ currentpiece = boards[currentMove][yPos][xPos];\r
piece = PieceToName(currentpiece,1);\r
xchar = SquareToChar(xPos);\r
ynum = SquareToNum(yPos);\r
yPos = fromY+1;\r
xPos = fromX-1;\r
while(yPos<BOARD_HEIGHT && xPos>=BOARD_LEFT) {\r
- currentpiece = boards[currentMove][yPos][xPos]; \r
+ currentpiece = boards[currentMove][yPos][xPos];\r
piece = PieceToName(currentpiece,1);\r
xchar = SquareToChar(xPos);\r
ynum = SquareToNum(yPos);\r
VOID\r
SayLowerDiagnols()\r
{\r
- ChessSquare currentpiece; \r
+ ChessSquare currentpiece;\r
char *piece, *xchar, *ynum ;\r
int yPos, xPos;\r
- \r
+\r
if(fromX < 0 || fromY < 0) return;\r
\r
if(fromX < BOARD_RGHT-1 && fromY > 0) {\r
yPos = fromY-1;\r
xPos = fromX+1;\r
while(yPos>=0 && xPos<BOARD_RGHT) {\r
- currentpiece = boards[currentMove][yPos][xPos]; \r
+ currentpiece = boards[currentMove][yPos][xPos];\r
piece = PieceToName(currentpiece,1);\r
xchar = SquareToChar(xPos);\r
ynum = SquareToNum(yPos);\r
yPos = fromY-1;\r
xPos = fromX-1;\r
while(yPos>=0 && xPos>=BOARD_LEFT) {\r
- currentpiece = boards[currentMove][yPos][xPos]; \r
+ currentpiece = boards[currentMove][yPos][xPos];\r
piece = PieceToName(currentpiece,1);\r
xchar = SquareToChar(xPos);\r
ynum = SquareToNum(yPos);\r
VOID\r
SayKnightMoves()\r
{\r
- ChessSquare currentpiece, oldpiece; \r
+ ChessSquare currentpiece, oldpiece;\r
char *piece, *xchar, *ynum ;\r
\r
oldpiece = boards[currentMove][fromY][fromX];\r
- if(oldpiece == WhiteKnight || oldpiece == BlackKnight) \r
+ if(oldpiece == WhiteKnight || oldpiece == BlackKnight)\r
SayString("The possible squares a Knight could move to are", FALSE);\r
else\r
SayString("The squares a Knight could possibly attack from are", FALSE);\r
SayString(piece, FALSE);\r
}\r
}\r
- \r
+\r
if (fromY+1 < BOARD_HEIGHT && fromX+2 < BOARD_RGHT) {\r
currentpiece = boards[currentMove][fromY+1][fromX+2];\r
if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing))\r
SayString(piece, FALSE);\r
}\r
}\r
- \r
+\r
if (fromY-1 >= 0 && fromX+2 < BOARD_RGHT) {\r
currentpiece = boards[currentMove][fromY-1][fromX+2];\r
if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing))\r
SayString(piece, FALSE);\r
}\r
}\r
- \r
+\r
if (fromY-2 >= 0 && fromX+1 < BOARD_RGHT) {\r
currentpiece = boards[currentMove][fromY-2][fromX+1];\r
if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing))\r
SayString(piece, FALSE);\r
}\r
}\r
- \r
+\r
if (fromY-2 >= 0 && fromX-1 >= BOARD_LEFT) {\r
currentpiece = boards[currentMove][fromY-2][fromX-1];\r
if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing))\r
SayString(piece, FALSE);\r
}\r
}\r
- \r
+\r
if (fromY-1 >= 0 && fromX-2 >= BOARD_LEFT) {\r
currentpiece = boards[currentMove][fromY-1][fromX-2];\r
if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing))\r
SayString(piece, FALSE);\r
}\r
}\r
- \r
+\r
if (fromY+1 < BOARD_HEIGHT && fromX-2 >= BOARD_LEFT) {\r
currentpiece = boards[currentMove][fromY+1][fromX-2];\r
if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing))\r
VOID\r
SayPieces(ChessSquare p)\r
{\r
- ChessSquare currentpiece; \r
+ ChessSquare currentpiece;\r
char *piece, *xchar, *ynum ;\r
int yPos, xPos, count = 0;\r
char buf[50];\r
if(p == WhitePlay) SayString("White pieces", FALSE); else\r
if(p == BlackPlay) SayString("Black pieces", FALSE); else\r
if(p == EmptySquare) SayString("Pieces", FALSE); else {\r
- sprintf(buf, "%ss", PieceToName(p,1));\r
+ snprintf(buf, sizeof(buf)/sizeof(buf[0]),"%ss", PieceToName(p,1));\r
SayString(buf, FALSE);\r
}\r
SayString("are located", FALSE);\r
for(yPos=0; yPos<BOARD_HEIGHT; yPos++) {\r
for(xPos=BOARD_LEFT; xPos<BOARD_RGHT; xPos++) {\r
- currentpiece = boards[currentMove][yPos][xPos]; \r
+ currentpiece = boards[currentMove][yPos][xPos];\r
if(p == BlackPlay && currentpiece >= BlackPawn && currentpiece <= BlackKing ||\r
p == WhitePlay && currentpiece >= WhitePawn && currentpiece <= WhiteKing )\r
piece = PieceToName(currentpiece,0);\r
else if(p == currentpiece)\r
piece = NULL;\r
else continue;\r
- \r
+\r
if(count == 0) SayString("at", FALSE);\r
xchar = SquareToChar(xPos);\r
ynum = SquareToNum(yPos);\r
char *piece, *xchar, *ynum ;\r
if(fromX < BOARD_LEFT) { SayString("You strayed into the white holdings", FALSE); return; }\r
if(fromX >= BOARD_RGHT) { SayString("You strayed into the black holdings", FALSE); return; }\r
- currentpiece = boards[currentMove][fromY][fromX]; \r
+ currentpiece = boards[currentMove][fromY][fromX];\r
piece = PieceToName(currentpiece,1);\r
ynum = SquareToNum(fromY);\r
xchar = SquareToChar(fromX);\r
SayString(piece, FALSE);\r
if(((fromX-BOARD_LEFT) ^ fromY)&1)\r
SayString("on a light square",FALSE);\r
- else \r
+ else\r
SayString("on a dark square",FALSE);\r
\r
PossibleAttacked();\r
int Xpos, Ypos;\r
ChessSquare currentpiece;\r
char *piece, *ynum ;\r
- \r
+\r
if(gameInfo.holdingsWidth) {\r
int first = 0;\r
for(Ypos=0; Ypos<gameInfo.holdingsSize; Ypos++) {\r
int n = boards[currentMove][Ypos][BOARD_WIDTH-2];\r
- if(n) { char buf[MSG_SIZ];\r
- if(!first++) SayString("white holds", FALSE);\r
- currentpiece = boards[currentMove][Ypos][BOARD_WIDTH-1]; \r
- piece = PieceToName(currentpiece,0);\r
- sprintf(buf, "%d %s%s", n, piece, (n==1 ? "" : "s") );\r
- SayString(buf, FALSE);\r
+ if(n) {\r
+ char buf[MSG_SIZ];\r
+ if(!first++)\r
+ SayString("white holds", FALSE);\r
+ currentpiece = boards[currentMove][Ypos][BOARD_WIDTH-1];\r
+ piece = PieceToName(currentpiece,0);\r
+ snprintf(buf, MSG_SIZ,"%d %s%s", n, piece, (n==1 ? "" : "s") );\r
+ SayString(buf, FALSE);\r
}\r
}\r
first = 0;\r
for(Ypos=BOARD_HEIGHT-1; Ypos>=BOARD_HEIGHT - gameInfo.holdingsSize; Ypos--) {\r
int n = boards[currentMove][Ypos][1];\r
- if(n) { char buf[MSG_SIZ];\r
- if(!first++) SayString("black holds", FALSE);\r
- currentpiece = boards[currentMove][Ypos][0]; \r
- piece = PieceToName(currentpiece,0);\r
- sprintf(buf, "%d %s%s", n, piece, (n==1 ? "" : "s") );\r
- SayString(buf, FALSE);\r
+ if(n) {\r
+ char buf[MSG_SIZ];\r
+ if(!first++)\r
+ SayString("black holds", FALSE);\r
+ currentpiece = boards[currentMove][Ypos][0];\r
+ piece = PieceToName(currentpiece,0);\r
+ snprintf(buf, MSG_SIZ, "%d %s%s", n, piece, (n==1 ? "" : "s") );\r
+ SayString(buf, FALSE);\r
}\r
}\r
}\r
SayString(ynum, FALSE);\r
SayString("rank", FALSE);\r
for(Xpos=BOARD_LEFT; Xpos<BOARD_RGHT; Xpos++) {\r
- currentpiece = boards[currentMove][Ypos][Xpos]; \r
+ currentpiece = boards[currentMove][Ypos][Xpos];\r
if(currentpiece != EmptySquare) {\r
int count = 0;\r
char buf[50];\r
piece = PieceToName(currentpiece,1);\r
while(Xpos < BOARD_RGHT && boards[currentMove][Ypos][Xpos] == currentpiece)\r
Xpos++, count++;\r
- if(count > 1) { \r
- sprintf(buf, "%d %ss", count, piece);\r
- } else sprintf(buf, "%s", piece);\r
+ if(count > 1)\r
+ snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%d %ss", count, piece);\r
+ else\r
+ snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%s", piece);\r
Xpos--;\r
SayString(buf, FALSE);\r
} else {\r
if(Xpos == BOARD_RGHT && oldX == BOARD_LEFT)\r
SayString("all", FALSE);\r
else{\r
- if(count > 1) { \r
+ if(count > 1) {\r
char buf[10];\r
- sprintf(buf, "%d", count);\r
+ snprintf(buf, sizeof(buf)/sizeof(buf[0]),"%d", count);\r
SayString(buf, FALSE);\r
}\r
Xpos--;\r
}\r
}\r
}\r
- \r
+\r
}\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
} else {\r
- if(WhiteOnMove(currentMove)) \r
+ if(WhiteOnMove(currentMove))\r
SayString("White is on move here", FALSE);\r
else SayString("Black is on move here", FALSE);\r
}\r
}\r
- \r
+\r
extern char *commentList[];\r
\r
VOID\r
c = 'W'; break;\r
case IcsPlayingBlack:\r
case MachinePlaysBlack:\r
- c = 'B'; \r
+ c = 'B';\r
default:\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
+ snprintf(buf, MSG_SIZ, "score %s %d at %d ply",\r
score > 0 ? "plus" : score < 0 ? "minus" : "",\r
(int) (fabs(score)*100+0.5),\r
depth );\r
\r
n = 2*moveNr - (dotCount < 2);\r
\r
- if(previousMove != 2*moveNr + (dotCount > 1) || evenIfDuplicate) { \r
+ if(previousMove != 2*moveNr + (dotCount > 1) || evenIfDuplicate) {\r
char number[20];\r
previousMove = 2*moveNr + (dotCount > 1); // remember move nr of move last spoken\r
- sprintf(number, "%d", moveNr);\r
+ snprintf(number, sizeof(number)/sizeof(number[0]),"%d", moveNr);\r
\r
yPos = CoordToNum(messageText[len-1]); /* turn char coords to ints */\r
xPos = CoordToNum(messageText[len-2]);\r
if(xPos < 0 || xPos > 11) return; // prevent crashes if no coord string available to speak\r
if(yPos < 0 || yPos > 9) return;\r
- currentpiece = boards[n][yPos][xPos]; \r
+ currentpiece = boards[n][yPos][xPos];\r
piece = PieceToName(currentpiece,0);\r
ynum = SquareToNum(yPos);\r
xchar = SquareToChar(xPos);\r
if(StrStr(messageText, " 1/2-1/2")) p = "game ends in a draw";\r
if(comment[0]) {\r
if(p) {\r
- if(!StrCaseStr(comment, "draw") && \r
- !StrCaseStr(comment, "white") && \r
+ if(!StrCaseStr(comment, "draw") &&\r
+ !StrCaseStr(comment, "white") &&\r
!StrCaseStr(comment, "black") ) {\r
SayString(p, FALSE);\r
SayString("due to", FALSE);\r
suppressClocks = 1; // if user is using alt+T command, no reason to display them\r
if(abs(lastWhiteTime - whiteTimeRemaining) < 1000 && abs(lastBlackTime - blackTimeRemaining) < 1000)\r
suppressClocks = 0; // back on after two requests in rapid succession\r
- sprintf(buf1, "%s", TimeString(whiteTimeRemaining));\r
+ snprintf(buf1, sizeof(buf1)/sizeof(buf1[0]),"%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
+ snprintf(buf2, sizeof(buf2)/sizeof(buf2[0]), "%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
{\r
ChessSquare currentpiece;\r
char *piece;\r
- \r
+\r
static BOOLEAN sameAgain = FALSE;\r
switch (message) {\r
case WM_KEYDOWN:\r
break;\r
}\r
else if(oldFromX != -1) {\r
- \r
+\r
ChessSquare pdown, pup;\r
pdown = boards[currentMove][oldFromY][oldFromX];\r
pup = boards[currentMove][fromY][fromX];\r
- \r
+\r
if (gameMode == EditPosition ||\r
!((WhitePawn <= pdown && pdown <= WhiteKing &&\r
WhitePawn <= pup && pup <= WhiteKing) ||\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
+\r
if (HasPromotionChoice(oldFromX, oldFromY, fromX, fromY, &promoChoice)) {\r
if (appData.alwaysPromoteToQueen) {\r
UserMoveEvent(oldFromX, oldFromY, fromX, fromY, 'q');\r
toX = fromX; toY = fromY; fromX = oldFromX; fromY = oldFromY;\r
PromotionPopup(hwnd);\r
fromX = toX; fromY = toY;\r
- } \r
+ }\r
}\r
else {\r
UserMoveEvent(oldFromX, oldFromY, fromX, fromY, promoChoice);\r
oldFromX = oldFromY = -1;\r
break;\r
}\r
- \r
+\r
}\r
/* First downclick, or restart on a square with same color piece */\r
if (OKToStartUserMove(fromX, fromY)) {\r
oldFromX = fromX;\r
oldFromY = fromY;\r
- currentpiece = boards[currentMove][fromY][fromX]; \r
+ currentpiece = boards[currentMove][fromY][fromX];\r
piece = PieceToName(currentpiece,1);\r
SayString(piece, FALSE);\r
SayString("selected", FALSE);\r
if (sameAgain) {\r
/* Clicked same square twice: abort click-click move */\r
oldFromX = oldFromY = -1;\r
- currentpiece = boards[currentMove][fromY][fromX]; \r
+ currentpiece = boards[currentMove][fromY][fromX];\r
piece = PieceToName(currentpiece,0);\r
SayString(piece, FALSE);\r
SayString("unselected", FALSE);\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