* 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, 2011, 2012, 2013, 2014, 2015, 2016 Free\r
+ * 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
-char *squareToNum[] = {"naught", "1", "2", "3", "4", "5", "6", "7", "8", "9" };\r
-\r
-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 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
- "White Falcon", "White Amazon", "White Snake", "White Unicorn",\r
- "White King",\r
- "Black Pawn", "Black Knight", "Black Bishop", "Black Rook", "Black Queen",\r
- "Black Guard", "Black Elephant", "Black Arch Bishop", "Black Chancellor",\r
- "Black General", "Black Man", "Black Cannon", "Black Night Rider",\r
- "Black Crowned Bishop", "Black Crowned Rook", "Black Grass Hopper", "Black Veteran",\r
- "Black Falcon", "Black Amazon", "Black Snake", "Black Unicorn",\r
- "Black King",\r
+char *squareToChar[] = { "ay", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t" };\r
+\r
+char *squareToNum[] = {"naught", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };\r
+\r
+char *ordinals[] = {"zeroth", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "nineth", "tenth", "eleventh", "twelfth", "thriteenth", "fourteenth", "fifteenth", "sixteenth" };\r
+\r
+char *pieceTypeName[] = {\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", "Lance", "Snake", "Unicorn", "Lion",\r
+ "Sword", "Zebra", "Camel", "Tower", "Wolf",\r
+ "Hat", "Duck", "Amazon", "Dragon", "Wildebeest", "Lion",\r
+ "Shield", "Pegasus", "Wizard", "Champion", "Helmet",\r
+ "Viking", "Flag", "Axe", "Dolphin", "Leopard", "Tiger",\r
+ "Wheel", "Butterfly", "Promo Bishop", "Promo Rook",\r
+ "Sleeping Beauty", "Reverse Shield", "Prince", "Promo Queen",\r
+ "Promo Lion", "Drunk Elephant", "Reverse Wheel", \r
+ "Tokin", "Promo Knight", "Promo Horse", "Promo Dragon", "Promo Lance",\r
+ "Promo Silver", "Dagger", "Promo Sword", "Promo Dagger", "Princess",\r
+ "King",\r
"Empty"\r
};\r
\r
ChessSquare p;\r
int i;\r
{\r
- if(i) return pieceToName[(int) p];\r
- return pieceToName[(int) p]+6;\r
+ static char buf[MSG_SIZ];\r
+ int black = (p >= BlackPawn);\r
+ if(black) p -= BlackPawn;\r
+ sprintf(buf, i ? black ? "Black " : "White " : "");\r
+ sprintf(buf + strlen(buf), "%s", pieceTypeName[(int) p]);\r
+ return T_(buf);\r
}\r
\r
char* SquareToChar(x)\r
int x;\r
{\r
- return squareToChar[x - BOARD_LEFT];\r
+ return T_(squareToChar[x - BOARD_LEFT]);\r
}\r
\r
char* SquareToNum(y)\r
int y;\r
{\r
- return squareToNum[y + (gameInfo.boardHeight < 10)];\r
+ return T_(squareToNum[y + (gameInfo.boardHeight != 10)]);\r
}\r
\r
\r
// from winboard.c: all new routines\r
-\r
-#include "jfwapi.h"\r
+#define JFWAPI __declspec(dllimport)\r
+JFWAPI BOOL WINAPI JFWSayString (LPCTSTR lpszStrinToSpeak, BOOL bInterrupt);\r
\r
typedef JFWAPI BOOL (WINAPI *PSAYSTRING)(LPCTSTR lpszStrinToSpeak, BOOL bInterrupt);\r
\r
\r
VOID SayString(char *mess, BOOL flag)\r
{ // for debug file\r
- char buf[MSG_SIZ], *p;\r
+ static char buf[8000], *p;\r
+ int l = strlen(buf);\r
if(appData.debugMode) fprintf(debugFP, "SAY '%s'\n", mess);\r
- strcpy(buf, mess);\r
+ if(l) buf[l++] = ' '; // separate by space from previous\r
+ safeStrCpy(buf+l, T_(mess), 8000-1-l); // buffer\r
+ if(!flag) return; // wait for flush\r
if(p = StrCaseStr(buf, "Xboard adjudication:")) {\r
int i;\r
for(i=19; i>1; i--) p[i] = p[i-1];\r
p[1] = ' ';\r
}\r
- RealSayString(buf, flag);\r
+ RealSayString(buf, !strcmp(mess, " ")); // kludge to indicate flushing of interruptable speach\r
+ if(appData.debugMode) fprintf(debugFP, "SPEAK '%s'\n", buf);\r
+ buf[0] = NULLCHAR;\r
}\r
\r
//static int fromX = 0, fromY = 0;\r
static int suppressClocks = 0;\r
static int suppressOneKey = 0;\r
static HANDLE hAccelJAWS;\r
+extern int jawsClock;\r
\r
typedef struct { char *name; int code; } MenuItemDesc;\r
\r
{"Say Board &Rank\tAlt+R", IDM_ReadRow },\r
{"Say Board &File\tAlt+F", IDM_ReadColumn },\r
{"-", 0 },\r
-{"Say &Upper Diagnols\tAlt+U", IDM_SayUpperDiagnols },\r
-{"Say &Lower Diagnols\tAlt+L", IDM_SayLowerDiagnols },\r
+{"Say &Upper Diagonals\tAlt+U", IDM_SayUpperDiagnols },\r
+{"Say &Lower Diagonals\tAlt+L", IDM_SayLowerDiagnols },\r
{"Say K&night Moves\tAlt+N", IDM_SayKnightMoves },\r
{"Say Current &Square\tAlt+S", IDM_SayCurrentPos },\r
{"Say &Attacks\tAlt+A", IDM_PossibleAttackMove },\r
{\r
HMENU menuMain, menuJAWS;\r
MENUBARINFO helpMenuInfo;\r
- int e, i;\r
+ int i;\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
+\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
- (UINT_PTR) menuItemJAWS[i].code, (LPCTSTR) menuItemJAWS[i].name);\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, 7, MF_BYPOSITION|MF_POPUP|MF_ENABLED|MF_STRING,\r
(UINT_PTR) menuJAWS, "&JAWS");\r
- oldMenuItemState[6] = oldMenuItemState[5];\r
+ oldMenuItemState[8] = oldMenuItemState[7];\r
DrawMenuBar(hwndMain);\r
}\r
\r
+#ifdef NVDA\r
+\r
+# define S2(X) #X\r
+# define STRINGIFY(X) S2(X)\r
+# include STRINGIFY(NVDA/nvdaController.h)\r
+\r
+ void\r
+ SayNVDA(char *text, BOOL interrupt)\r
+ {\r
+ static wchar_t buf[8000];\r
+ if(interrupt) nvdaController_cancelSpeech();\r
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, text, -1, buf, 8000);\r
+ nvdaController_speakText(buf);\r
+ }\r
+\r
+\r
+# undef UNICODE\r
+\r
+#endif\r
+\r
BOOL\r
InitJAWS()\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
+#ifdef NVDA\r
+ RealSayString = (PSAYSTRING) &SayNVDA; // assume NVDA\r
+ if(nvdaController_testIfRunning()) { // no NVDA; try JAWS\r
+#else\r
+ {\r
+#endif\r
+ HINSTANCE hApi = LoadLibrary("jfwapi32.dll");\r
+ if(!hApi) { // no interface to JAWS either\r
+ DisplayInformation("Missing jfwapi32.dll");\r
return (FALSE);\r
+ }\r
+ RealSayString = (PSAYSTRING)GetProcAddress(hApi, "JFWSayString");\r
}\r
\r
- RealSayString = (PSAYSTRING)GetProcAddress(hApi, "JFWSayString");\r
if(!RealSayString) {\r
DisplayInformation("SayString returned a null pointer");\r
return (FALSE);\r
int i;\r
\r
AdaptMenu();\r
- menuBarText[0][5] = "&JAWS";\r
- for(i=0; i<7; i++) menuBarText[1][i] = menuBarText[0][i];\r
+ menuBarText[0][8] = menuBarText[0][7]; menuBarText[0][7] = "&JAWS";\r
+ for(i=0; i<9; i++) menuBarText[2][i] = menuBarText[1][i] = menuBarText[0][i];\r
}\r
\r
hAccelJAWS = CreateAcceleratorTable(acceleratorsJAWS, 14);\r
return TRUE;\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
{\r
ChessSquare currentPiece;\r
char *piece, *xchar, *ynum ;\r
- int n;\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(flipView) switch(wParam) {\r
+ case VK_LEFT: wParam = VK_RIGHT; break;\r
+ case VK_RIGHT: wParam = VK_LEFT; break;\r
+ case VK_UP: wParam = VK_DOWN; break;\r
+ case VK_DOWN: wParam = VK_UP; break;\r
+ }\r
switch(wParam) {\r
case VK_LEFT:\r
if(fromX == BOARD_RGHT+1) fromX -= 2; else\r
- if(fromX == BOARD_LEFT) { if(fromY >= BOARD_HEIGHT - gameInfo.holdingsSize) fromX -= 2; } else\r
- if(fromX > BOARD_LEFT) fromX--;\r
+ if(fromX == BOARD_LEFT) { if(fromY >= BOARD_HEIGHT - gameInfo.holdingsSize) fromX -= 2; else beepType = 0; } else\r
+ if(fromX > BOARD_LEFT) fromX--; else beepType = 0; // off-board beep\r
break;\r
case VK_RIGHT:\r
if(fromX == BOARD_LEFT-2) fromX += 2; else\r
- if(fromX == BOARD_RGHT-1) { if(fromY < gameInfo.holdingsSize) fromX += 2; } else\r
- if(fromX < BOARD_RGHT-1) fromX++;\r
+ if(fromX == BOARD_RGHT-1) { if(fromY < gameInfo.holdingsSize) fromX += 2; else beepType = 0; } else\r
+ if(fromX < BOARD_RGHT-1) fromX++; else beepType = 0;\r
break;\r
case VK_UP:\r
- if(fromX == BOARD_RGHT+1) { if(fromY < gameInfo.holdingsSize - 1) fromY++; } else\r
- if(fromY < BOARD_HEIGHT-1) fromY++;\r
+ if(fromX == BOARD_RGHT+1) { if(fromY < gameInfo.holdingsSize - 1) fromY++; else beepType = 0; } else\r
+ if(fromY < BOARD_HEIGHT-1) fromY++; else beepType = 0;\r
break;\r
case VK_DOWN:\r
- if(fromX == BOARD_LEFT-2) { if(fromY > BOARD_HEIGHT - gameInfo.holdingsSize) fromY--; } else\r
- if(fromY > 0) fromY--;\r
+ if(fromX == BOARD_LEFT-2) { if(fromY > BOARD_HEIGHT - gameInfo.holdingsSize) fromY--; else beepType = 0; } else\r
+ if(fromY > 0) fromY--; else beepType = 0;\r
break;\r
}\r
SetHighlights(fromX, fromY, -1, -1);\r
DrawPosition(FALSE, NULL);\r
currentPiece = boards[currentMove][fromY][fromX];\r
piece = PieceToName(currentPiece,1);\r
- if(currentPiece != EmptySquare) MessageBeep(currentPiece < (int)BlackPawn ? MB_OK : MB_ICONEXCLAMATION);\r
+ if(beepType == 1 && currentPiece != EmptySquare) beepType = currentPiece < (int) BlackPawn ? 2 : 3; // white or black beep\r
+ if(beeps[beepType] == beeps[1] && (fromX == BOARD_RGHT+1 || fromX == BOARD_LEFT-2)) beepType = 4; // holdings beep\r
+ beepType = beeps[beepType]%6;\r
+ if(beepType) MessageBeep(beepCodes[beepType]);\r
if(fromX == BOARD_LEFT - 2) {\r
SayString("black holdings", FALSE);\r
if(currentPiece != EmptySquare) {\r
char buf[MSG_SIZ];\r
n = boards[currentMove][fromY][1];\r
- sprintf(buf, "%d %s%s", n, piece+6, n == 1 ? "" : "s");\r
- SayString(buf, TRUE);\r
+ snprintf(buf, MSG_SIZ, "%d %s%s", n, PieceToName(currentPiece,0), n == 1 ? "" : "s");\r
+ SayString(buf, FALSE);\r
}\r
+ SayString(" ", TRUE);\r
} else\r
if(fromX == BOARD_RGHT + 1) {\r
SayString("white holdings", FALSE);\r
if(currentPiece != EmptySquare) {\r
char buf[MSG_SIZ];\r
n = boards[currentMove][fromY][BOARD_WIDTH-2];\r
- sprintf(buf, "%d %s%s", n, piece+6, n == 1 ? "" : "s");\r
- SayString(buf, TRUE);\r
+ snprintf(buf, MSG_SIZ,"%d %s%s", n, PieceToName(currentPiece,0), n == 1 ? "" : "s");\r
+ SayString(buf, FALSE);\r
}\r
+ SayString(" ", TRUE);\r
} else\r
if(fromX >= BOARD_LEFT && fromX < BOARD_RGHT) {\r
char buf[MSG_SIZ];\r
xchar = SquareToChar(fromX);\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
- SayString(buf, TRUE);\r
+ snprintf(buf, MSG_SIZ, "%s %s %s", xchar, ynum, piece);\r
+ } else snprintf(buf, MSG_SIZ, "%s %s", xchar, ynum);\r
+ SayString(buf, FALSE);\r
+ SayString(" ", TRUE);\r
}\r
return;\r
}\r
\r
-extern char castlingRights[MAX_MOVES][BOARD_SIZE];\r
int PosFlags(int nr);\r
\r
typedef struct {\r
\r
//if(appData.debugMode) fprintf(debugFP, "PossibleAttackMove %d %d %d %d\n", fromX, fromY, oldFromX, oldFromY);\r
if(fromY < 0 || fromY >= BOARD_HEIGHT) return;\r
- if(fromX < BOARD_LEFT || fromX >= BOARD_RGHT) { SayString("holdings",FALSE); return; }\r
+ if(fromX < BOARD_LEFT || fromX >= BOARD_RGHT) { SayString("holdings",TRUE); return; }\r
\r
piece = boards[currentMove][fromY][fromX];\r
if(piece == EmptySquare) { // if square is empty, try to substitute selected piece\r
SayString("Your", FALSE);\r
SayString(PieceToName(piece, 0), FALSE);\r
SayString("would have", FALSE);\r
- } else { SayString("You must select a piece first", FALSE); return; }\r
+ } else { SayString("You must select a piece first", TRUE); return; }\r
}\r
\r
victim = boards[currentMove][fromY][fromX];\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, EmptySquare);\r
if(cl.count == 0) SayString("None", FALSE);\r
+ SayString("", TRUE); // flush\r
boards[currentMove][fromY][fromX] = victim; // repair\r
\r
if( removedSelectedPiece ) boards[currentMove][oldFromY][oldFromX] = piece;\r
ChessSquare piece = EmptySquare, victim;\r
\r
if(fromY < 0 || fromY >= BOARD_HEIGHT) return;\r
- if(fromX < BOARD_LEFT || fromX >= BOARD_RGHT) { SayString("holdings",FALSE); return; }\r
+ if(fromX < BOARD_LEFT || fromX >= BOARD_RGHT) { SayString("holdings",TRUE); return; }\r
\r
if(oldFromX >= 0 && oldFromY >= 0) { // if piece is selected, remove it\r
piece = boards[currentMove][oldFromY][oldFromX];\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, EmptySquare);\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, EmptySquare);\r
if(cl.count == 0) SayString("None", FALSE);\r
+ SayString("", TRUE); // flush\r
boards[currentMove][fromY][fromX] = victim; // put back original occupant\r
\r
if(oldFromX >= 0 && oldFromY >= 0) { // put back possibl selected piece\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
SayString(ynum, FALSE);\r
SayString("empty", FALSE);\r
}\r
+ SayString("", TRUE); // flush\r
}\r
\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
SayString(xchar, FALSE);\r
SayString("file empty", FALSE);\r
}\r
+ SayString("", TRUE); // flush\r
+}\r
+\r
+int\r
+OnBoard(int x, int y)\r
+{\r
+ return x >= BOARD_LEFT && x < BOARD_RGHT && y >= 0 && y < BOARD_HEIGHT;\r
}\r
\r
VOID\r
SayUpperDiagnols()\r
{\r
- ChessSquare currentpiece; \r
+ ChessSquare currentpiece;\r
char *piece, *xchar, *ynum ;\r
- int yPos, xPos;\r
- \r
+ int yPos, xPos, dir = (flipView ? -1 : 1);\r
+\r
if(fromX < 0 || fromY < 0) return;\r
\r
- if(fromX < BOARD_RGHT-1 && fromY < BOARD_HEIGHT-1) {\r
+ if(OnBoard(fromX+dir, fromY+dir)) {\r
SayString("The diagnol squares to your upper right contain", FALSE);\r
- yPos = fromY+1;\r
- xPos = fromX+1;\r
- while(yPos<BOARD_HEIGHT && xPos<BOARD_RGHT) {\r
- currentpiece = boards[currentMove][yPos][xPos]; \r
+ yPos = fromY+dir;\r
+ xPos = fromX+dir;\r
+ while(OnBoard(xPos, yPos)) {\r
+ currentpiece = boards[currentMove][yPos][xPos];\r
piece = PieceToName(currentpiece,1);\r
xchar = SquareToChar(xPos);\r
ynum = SquareToNum(yPos);\r
SayString(xchar , FALSE);\r
SayString(ynum, FALSE);\r
SayString(piece, FALSE);\r
- yPos++;\r
- xPos++;\r
+ yPos+=dir;\r
+ xPos+=dir;\r
}\r
}\r
else SayString("There is no squares to your upper right", FALSE);\r
\r
- if(fromX > BOARD_LEFT && fromY < BOARD_HEIGHT-1) {\r
+ if(OnBoard(fromX-dir, fromY+dir)) {\r
SayString("The diagnol squares to your upper left contain", FALSE);\r
- yPos = fromY+1;\r
- xPos = fromX-1;\r
- while(yPos<BOARD_HEIGHT && xPos>=BOARD_LEFT) {\r
- currentpiece = boards[currentMove][yPos][xPos]; \r
+ yPos = fromY+dir;\r
+ xPos = fromX-dir;\r
+ while(OnBoard(xPos, yPos)) {\r
+ currentpiece = boards[currentMove][yPos][xPos];\r
piece = PieceToName(currentpiece,1);\r
xchar = SquareToChar(xPos);\r
ynum = SquareToNum(yPos);\r
SayString(xchar , FALSE);\r
SayString(ynum, FALSE);\r
SayString(piece, FALSE);\r
- yPos++;\r
- xPos--;\r
+ yPos+=dir;\r
+ xPos-=dir;\r
}\r
}\r
else SayString("There is no squares to your upper left", FALSE);\r
+ SayString("", TRUE); // flush\r
}\r
\r
VOID\r
SayLowerDiagnols()\r
{\r
- ChessSquare currentpiece; \r
+ ChessSquare currentpiece;\r
char *piece, *xchar, *ynum ;\r
- int yPos, xPos;\r
- \r
+ int yPos, xPos, dir = (flipView ? -1 : 1);\r
+\r
if(fromX < 0 || fromY < 0) return;\r
\r
- if(fromX < BOARD_RGHT-1 && fromY > 0) {\r
+ if(OnBoard(fromX+dir, fromY-dir)) {\r
SayString("The diagnol squares to your lower right contain", FALSE);\r
- yPos = fromY-1;\r
- xPos = fromX+1;\r
- while(yPos>=0 && xPos<BOARD_RGHT) {\r
- currentpiece = boards[currentMove][yPos][xPos]; \r
+ yPos = fromY-dir;\r
+ xPos = fromX+dir;\r
+ while(OnBoard(xPos, yPos)) {\r
+ currentpiece = boards[currentMove][yPos][xPos];\r
piece = PieceToName(currentpiece,1);\r
xchar = SquareToChar(xPos);\r
ynum = SquareToNum(yPos);\r
SayString(xchar , FALSE);\r
SayString(ynum, FALSE);\r
SayString(piece, FALSE);\r
- yPos--;\r
- xPos++;\r
+ yPos-=dir;\r
+ xPos+=dir;\r
}\r
}\r
else SayString("There is no squares to your lower right", FALSE);\r
\r
- if(fromX > BOARD_LEFT && fromY > 0) {\r
+ if(OnBoard(fromX-dir, fromY-dir)) {\r
SayString("The diagnol squares to your lower left contain", FALSE);\r
- yPos = fromY-1;\r
- xPos = fromX-1;\r
- while(yPos>=0 && xPos>=BOARD_LEFT) {\r
- currentpiece = boards[currentMove][yPos][xPos]; \r
+ yPos = fromY-dir;\r
+ xPos = fromX-dir;\r
+ while(OnBoard(xPos, yPos)) {\r
+ currentpiece = boards[currentMove][yPos][xPos];\r
piece = PieceToName(currentpiece,1);\r
xchar = SquareToChar(xPos);\r
ynum = SquareToNum(yPos);\r
SayString(xchar , FALSE);\r
SayString(ynum, FALSE);\r
SayString(piece, FALSE);\r
- yPos--;\r
- xPos--;\r
+ yPos-=dir;\r
+ xPos-=dir;\r
}\r
}\r
else SayString("There is no squares to your lower left", FALSE);\r
+ SayString("", TRUE); // flush\r
}\r
\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
SayString(piece, FALSE);\r
}\r
}\r
+ SayString("", TRUE); // flush\r
}\r
\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
}\r
}\r
if(count == 0) SayString("nowhere", FALSE);\r
+ SayString("", TRUE); // flush\r
+}\r
+\r
+VOID\r
+DelayedSpeak()\r
+{\r
+#ifdef NVDA\r
+ nvdaController_cancelSpeech();\r
+#endif\r
+ SayString("", TRUE);\r
+}\r
+\r
+VOID\r
+SayPieceType(char id)\r
+{\r
+ int f, r, nr = 0;\r
+ ChessSquare piece = CharToPiece(id);\r
+ if(piece == EmptySquare) {\r
+ SayString("That is not a valid piece", FALSE);\r
+ } else {\r
+ for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++) {\r
+ if(boards[currentMove][r][f] != piece) continue;\r
+ if(!nr++) SayString(PieceToName(piece, 1), FALSE), SayString("on ", FALSE);\r
+ else SayString("and", FALSE);\r
+ SayString(SquareToChar(f), FALSE);\r
+ SayString(SquareToNum(r), FALSE);\r
+ }\r
+ if(!nr) SayString("There is no", FALSE), SayString(PieceToName(piece, 1), FALSE), SayString("on the board", FALSE);\r
+ }\r
+ ScheduleDelayedEvent(DelayedSpeak, 50); // immediate flush is interrupted by reading title bar parent window\r
+// SayString("", TRUE); // flush\r
}\r
\r
VOID\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
- return;\r
+ SayString("", TRUE); // flush\r
}\r
\r
VOID\r
{\r
int Xpos, Ypos;\r
ChessSquare currentpiece;\r
- char *piece, *xchar, *ynum ;\r
- \r
+ char *piece, *ynum ;\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, oldX = Xpos;\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
SayString("empty", FALSE);\r
+\r
}\r
}\r
}\r
- \r
+ SayString("", TRUE); // flush\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
+ SayString("", TRUE); // flush\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
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
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
\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
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
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
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
SayString(messageText, FALSE);\r
}\r
\r
+ SayString("", TRUE); // flush\r
}\r
\r
VOID\r
-SayClockTime()\r
+SayClockTime(int warning)\r
{\r
char buf1[50], buf2[50];\r
char *str1, *str2;\r
static long int lastWhiteTime, lastBlackTime;\r
\r
- suppressClocks = 1; // if user is using alt+T command, no reason to display them\r
+ if(!warning) {\r
+ suppressClocks = jawsClock = 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
+ else if(gameMode == EditGame || gameMode == BeginningOfGame) {\r
+ appData.clockMode = TRUE;\r
+ if(!pausing) StartClocks();\r
+ }\r
+ }\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
+ if(pausing) SayString("neither clock is running", FALSE);\r
+ SayString("", TRUE); // flush\r
}\r
\r
VOID\r
SayString(mess, FALSE);\r
SayString("is now", FALSE);\r
SayString(*b ? "on" : "off", FALSE);\r
+ SayString("", TRUE); // flush\r
}\r
\r
/* handles keyboard moves in a click-click fashion */\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 <= pup && pup <= BlackKing))) {\r
/* EditPosition, empty square, or different color piece;\r
click-click move is possible */\r
- \r
- if (IsPromotion(oldFromX, oldFromY, fromX, fromY)) {\r
+ char promoChoice = NULLCHAR;\r
+\r
+ if (HasPromotionChoice(oldFromX, oldFromY, fromX, fromY, &promoChoice, FALSE)) {\r
if (appData.alwaysPromoteToQueen) {\r
UserMoveEvent(oldFromX, oldFromY, fromX, fromY, 'q');\r
}\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, NULLCHAR);\r
+ UserMoveEvent(oldFromX, oldFromY, fromX, fromY, promoChoice);\r
}\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
+ SayString("selected", TRUE);\r
}\r
else {\r
oldFromX = oldFromY = -1;\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
+ SayString("unselected", TRUE);\r
}\r
}\r
}\r
return (x%3000 == 0);\r
}\r
\r
-#if 0\r
- if(isalpha((char)wParam)) {\r
- /* capitals of any ind are intercepted and distinguished by left and right shift */\r
- int mine = GetKeyState(VK_RSHIFT) < 0;\r
- if(mine || GetKeyState(VK_LSHIFT) < 0) {\r
-#endif\r
+VOID\r
+TimeWarning()\r
+{\r
+ int ta, t = (whiteTimeRemaining < blackTimeRemaining ? whiteTimeRemaining: blackTimeRemaining);\r
+ char *p = appData.alarmTimes;\r
+ static int last_t;\r
+ t = (t + 1000)/2000;\r
+ if(t > last_t) last_t = 0;\r
+ while((ta = atoi(p))) {\r
+ if(t == ta/2 && t != last_t) {\r
+ last_t = t;\r
+ if(sounds[(int)SoundAlarm].name[0] == NULLCHAR) SayString("time warning", FALSE), SayClockTime(1);\r
+ else PlayAlarmSound();\r
+ }\r
+ p = strchr(p, ','); if(p == NULL) break;\r
+ p++;\r
+ }\r
+}\r
+\r
+#define JAWS_ARGS \\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
+ { "alarmTimes", ArgString, (LPVOID) &appData.alarmTimes, TRUE, (ArgIniType) "" },\\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
case '\020': /* ctrl P */\\r
{ char buf[MSG_SIZ];\\r
if(GetWindowText(hwnd, buf, MSG_SIZ-1))\\r
- SayString(buf, FALSE);\\r
+ SayString(buf, TRUE);\\r
}\\r
return 0;\\r
\r
-#define JAWS_KB_NAVIGATION \\r
+#define JAWS_KBDOWN_NAVIGATION \\r
\\r
- case WM_KEYDOWN:\\r
\\r
if(GetKeyState(VK_MENU) < 0 && GetKeyState(VK_CONTROL) < 0) {\\r
/* Control + Alt + letter used for speaking piece positions */\\r
KeyboardEvent(hwnd, message, wParam, lParam);\\r
break;\\r
case VK_SPACE:\\r
+ shiftKey = GetKeyState(VK_SHIFT) < 0;\\r
KeyboardMove(hwnd, message, wParam, lParam);\\r
break;\\r
}\\r
- break;\\r
- case WM_KEYUP:\\r
+\r
+#define JAWS_KBUP_NAVIGATION \\r
switch (wParam) {\\r
case VK_SPACE:\\r
KeyboardMove(hwnd, message, wParam, lParam);\\r
break;\\r
}\\r
- break;\\r
\r
#define JAWS_MENU_ITEMS \\r
case IDM_PossibleAttackMove: /*What can I possible attack from here */\\r
break;\\r
\\r
case IDM_SayClockTime: /*Say the clock time */\\r
- SayClockTime();\\r
+ SayClockTime(0);\\r
break;\\r
\\r
case IDM_SayWhosTurn: /* Say whos turn it its */\\r
\r
#define JAWS_DELETE(X)\r
\r
-#define JAWS_SILENCE if(suppressClocks) return;\r
+#define JAWS_SILENCE TimeWarning(); if(suppressClocks) return;\r
\r
#define JAWS_COPYRIGHT \\r
SetDlgItemText(hDlg, OPT_MESS, "Auditory/Keyboard Enhancements By: Ed Rodriguez (sort of)");\r
\r
-#define SAY(S) SayString((S), FALSE)\r
+#define SAY(S) SayString((S), TRUE)\r
\r
#define SAYMACHINEMOVE() SayMachineMove(0)\r
\r