* Massachusetts.\r
*\r
* Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,\r
- * 2007, 2008, 2009, 2010 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
// 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
- "Empty"\r
- };\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", "Amazon", "Snake", "Unicorn",\r
- "King",\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
+ "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
ChessSquare p;\r
int i;\r
{\r
- if(i) return pieceToName[(int) p];\r
- return pieceTypeName[(int) p];\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
\r
VOID SayString(char *mess, BOOL flag)\r
{ // for debug file\r
- char buf[8000], *p;\r
+ static char buf[8000], *p;\r
+ int l = strlen(buf);\r
if(appData.debugMode) fprintf(debugFP, "SAY '%s'\n", mess);\r
- safeStrCpy(buf, mess, sizeof(buf)/sizeof(buf[0]));\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
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
+ (UINT_PTR) menuItemJAWS[i].code, (LPCTSTR) _(menuItemJAWS[i].name));\r
}\r
InsertMenu(menuMain, 7, MF_BYPOSITION|MF_POPUP|MF_ENABLED|MF_STRING,\r
(UINT_PTR) menuJAWS, "&JAWS");\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
+#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
\r
AdaptMenu();\r
menuBarText[0][8] = menuBarText[0][7]; menuBarText[0][7] = "&JAWS";\r
- for(i=0; i<9; i++) menuBarText[1][i] = menuBarText[0][i];\r
+ for(i=0; i<9; i++) menuBarText[2][i] = menuBarText[1][i] = menuBarText[0][i];\r
}\r
\r
hAccelJAWS = CreateAcceleratorTable(acceleratorsJAWS, 14);\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
char buf[MSG_SIZ];\r
n = boards[currentMove][fromY][1];\r
snprintf(buf, MSG_SIZ, "%d %s%s", n, PieceToName(currentPiece,0), n == 1 ? "" : "s");\r
- SayString(buf, TRUE);\r
+ SayString(buf, FALSE);\r
}\r
+ SayString(" ", TRUE);\r
} else\r
if(fromX == BOARD_RGHT + 1) {\r
SayString("white holdings", FALSE);\r
char buf[MSG_SIZ];\r
n = boards[currentMove][fromY][BOARD_WIDTH-2];\r
snprintf(buf, MSG_SIZ,"%d %s%s", n, PieceToName(currentPiece,0), n == 1 ? "" : "s");\r
- SayString(buf, TRUE);\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
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
+ SayString(buf, FALSE);\r
+ SayString(" ", TRUE);\r
}\r
return;\r
}\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), 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), 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), 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
SayString(ynum, FALSE);\r
SayString("empty", FALSE);\r
}\r
+ SayString("", TRUE); // flush\r
}\r
\r
VOID\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
{\r
ChessSquare currentpiece;\r
char *piece, *xchar, *ynum ;\r
- int yPos, xPos;\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
+ 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
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
+ 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
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
{\r
ChessSquare currentpiece;\r
char *piece, *xchar, *ynum ;\r
- int yPos, xPos;\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
+ 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
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
+ 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
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
SayString(piece, FALSE);\r
}\r
}\r
+ SayString("", TRUE); // flush\r
}\r
\r
VOID\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
SayString("on a dark square",FALSE);\r
\r
PossibleAttacked();\r
- return;\r
+ SayString("", TRUE); // flush\r
}\r
\r
VOID\r
Xpos--;\r
}\r
SayString("empty", FALSE);\r
+\r
}\r
}\r
}\r
-\r
+ SayString("", TRUE); // flush\r
}\r
\r
VOID\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
extern char *commentList[];\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
+ 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 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
click-click move is possible */\r
char promoChoice = NULLCHAR;\r
\r
- if (HasPromotionChoice(oldFromX, oldFromY, fromX, fromY, &promoChoice)) {\r
+ if (HasPromotionChoice(oldFromX, oldFromY, fromX, fromY, &promoChoice, FALSE)) {\r
if (appData.alwaysPromoteToQueen) {\r
UserMoveEvent(oldFromX, oldFromY, fromX, fromY, 'q');\r
}\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
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
+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
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