* backend.c -- Common back end for X and Windows NT versions of\r
* XBoard $Id: backend.c,v 2.6 2003/11/28 09:37:36 mann Exp $\r
*\r
- * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts.\r
- * Enhancements Copyright 1992-2001 Free Software Foundation, Inc.\r
+ * Copyright 1991 by Digital Equipment Corporation, Maynard,\r
+ * Massachusetts. Enhancements Copyright\r
+ * 1992-2001,2002,2003,2004,2005,2006,2007,2008,2009 Free Software\r
+ * Foundation, Inc.\r
*\r
* The following terms apply to Digital Equipment Corporation's copyright\r
* interest in XBoard:\r
* SOFTWARE.\r
* ------------------------------------------------------------------------\r
*\r
- * The following terms apply to the enhanced version of XBoard distributed\r
- * by the Free Software Foundation:\r
+ * The following terms apply to the enhanced version of XBoard\r
+ * distributed by the Free Software Foundation:\r
* ------------------------------------------------------------------------\r
- * This program is free software; you can redistribute it and/or modify\r
+ *\r
+ * GNU XBoard is free software: you can redistribute it and/or modify\r
* it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
+ * the Free Software Foundation, either version 3 of the License, or (at\r
+ * your option) any later version.\r
*\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
+ * GNU XBoard is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * General Public License for more details.\r
*\r
* You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
- * ------------------------------------------------------------------------\r
+ * along with this program. If not, see http://www.gnu.org/licenses/. *\r
*\r
- * See the file ChangeLog for a revision history. */\r
+ *------------------------------------------------------------------------\r
+ ** See the file ChangeLog for a revision history. */\r
\r
/* [AS] Also useful here for debugging */\r
#ifdef WIN32\r
#include <sys/types.h>\r
#include <sys/stat.h>\r
#include <math.h>\r
+#include <ctype.h>\r
\r
#if STDC_HEADERS\r
# include <stdlib.h>\r
# include "zippy.h"\r
#endif\r
#include "backendz.h"\r
+#include "gettext.h" \r
+ \r
+#ifdef ENABLE_NLS \r
+# define _(s) gettext (s) \r
+# define N_(s) gettext_noop (s) \r
+#else \r
+# define _(s) (s) \r
+# define N_(s) s \r
+#endif \r
+\r
\r
/* A point in time */\r
typedef struct {\r
void InitBackEnd3 P((void));\r
void FeatureDone P((ChessProgramState* cps, int val));\r
void InitChessProgram P((ChessProgramState *cps, int setup));\r
+void OutputKibitz(int window, char *text);\r
+int PerpetualChase(int first, int last);\r
+int EngineOutputIsUp();\r
+void InitDrawingSizes(int x, int y);\r
+\r
+#ifdef WIN32\r
+ extern void ConsoleCreate();\r
+#endif\r
+\r
ChessProgramState *WhitePlayer();\r
void InsertIntoMemo P((int which, char *text)); // [HGM] kibitz: in engineo.c\r
int VerifyDisplayMode P(());\r
extern int tinyLayout, smallLayout;\r
ChessProgramStats programStats;\r
static int exiting = 0; /* [HGM] moved to top */\r
-static int setboardSpoiledMachineBlack = 0, errorExitFlag = 0;\r
-extern int startedFromPositionFile;\r
+static int setboardSpoiledMachineBlack = 0 /*, errorExitFlag = 0*/;\r
int startedFromPositionFile = FALSE; Board filePosition; /* [HGM] loadPos */\r
char endingGame = 0; /* [HGM] crash: flag to prevent recursion of GameEnds() */\r
int whiteNPS, blackNPS; /* [HGM] nps: for easily making clocks aware of NPS */\r
return dst;\r
}\r
\r
+#if 0\r
+//[HGM] for future use? Conditioned out for now to suppress warning.\r
static char * safeStrCat( char * dst, const char * src, size_t count )\r
{\r
size_t dst_len;\r
\r
return dst;\r
}\r
+#endif\r
+\r
+/* Some compiler can't cast u64 to double\r
+ * This function do the job for us:\r
+\r
+ * We use the highest bit for cast, this only\r
+ * works if the highest bit is not\r
+ * in use (This should not happen)\r
+ *\r
+ * We used this for all compiler\r
+ */\r
+double\r
+u64ToDouble(u64 value)\r
+{\r
+ double r;\r
+ u64 tmp = value & u64Const(0x7fffffffffffffff);\r
+ r = (double)(s64)tmp;\r
+ if (value & u64Const(0x8000000000000000))\r
+ r += 9.2233720368547758080e18; /* 2^63 */\r
+ return r;\r
+}\r
\r
/* Fake up flags for now, as we aren't keeping track of castling\r
availability yet. [HGM] Change of logic: the flag now only\r
Boolean alarmSounded;\r
/* end premove variables */\r
\r
-#define ICS_GENERIC 0\r
-#define ICS_ICC 1\r
-#define ICS_FICS 2\r
-#define ICS_CHESSNET 3 /* not really supported */\r
-int ics_type = ICS_GENERIC;\r
char *ics_prefix = "$";\r
+int ics_type = ICS_GENERIC;\r
\r
int currentMove = 0, forwardMostMove = 0, backwardMostMove = 0;\r
int pauseExamForwardMostMove = 0;\r
if (!ParseTimeControl(appData.timeControl, appData.timeIncrement,\r
appData.movesPerSession)) {\r
char buf[MSG_SIZ];\r
- sprintf(buf, "bad timeControl option %s", appData.timeControl);\r
+ sprintf(buf, _("bad timeControl option %s"), appData.timeControl);\r
DisplayFatalError(buf, 0, 2);\r
}\r
\r
searchTime = min * 60 + sec;\r
} else {\r
char buf[MSG_SIZ];\r
- sprintf(buf, "bad searchTime option %s", appData.searchTime);\r
+ sprintf(buf, _("bad searchTime option %s"), appData.searchTime);\r
DisplayFatalError(buf, 0, 2);\r
}\r
}\r
first.debug = second.debug = FALSE;\r
first.supportsNPS = second.supportsNPS = UNKNOWN;\r
\r
+ /* [HGM] options */\r
+ first.optionSettings = appData.firstOptions;\r
+ second.optionSettings = appData.secondOptions;\r
+\r
first.scoreIsAbsolute = appData.firstScoreIsAbsolute; /* [AS] */\r
second.scoreIsAbsolute = appData.secondScoreIsAbsolute; /* [AS] */\r
first.isUCI = appData.firstIsUCI; /* [AS] */\r
if (appData.firstProtocolVersion > PROTOVER ||\r
appData.firstProtocolVersion < 1) {\r
char buf[MSG_SIZ];\r
- sprintf(buf, "protocol version %d not supported",\r
+ sprintf(buf, _("protocol version %d not supported"),\r
appData.firstProtocolVersion);\r
DisplayFatalError(buf, 0, 2);\r
} else {\r
if (appData.secondProtocolVersion > PROTOVER ||\r
appData.secondProtocolVersion < 1) {\r
char buf[MSG_SIZ];\r
- sprintf(buf, "protocol version %d not supported",\r
+ sprintf(buf, _("protocol version %d not supported"),\r
appData.secondProtocolVersion);\r
DisplayFatalError(buf, 0, 2);\r
} else {\r
case VariantBughouse: /* need four players and two boards */\r
case VariantKriegspiel: /* need to hide pieces and move details */\r
/* case VariantFischeRandom: (Fabien: moved below) */\r
- sprintf(buf, "Variant %s supported only in ICS mode", appData.variant);\r
+ sprintf(buf, _("Variant %s supported only in ICS mode"), appData.variant);\r
DisplayFatalError(buf, 0, 2);\r
return;\r
\r
case Variant35:\r
case Variant36:\r
default:\r
- sprintf(buf, "Unknown variant name %s", appData.variant);\r
+ sprintf(buf, _("Unknown variant name %s"), appData.variant);\r
DisplayFatalError(buf, 0, 2);\r
return;\r
\r
} else {\r
/* kludge: allow timeout for initial "feature" commands */\r
FreezeUI();\r
- DisplayMessage("", "Starting chess program");\r
+ DisplayMessage("", _("Starting chess program"));\r
ScheduleDelayedEvent(InitBackEnd3, FEATURE_TIMEOUT);\r
}\r
}\r
\r
InitChessProgram(&first, startedFromSetupPosition);\r
\r
+\r
if (appData.icsActive) {\r
+#ifdef WIN32\r
+ /* [DM] Make a console window if needed [HGM] merged ifs */\r
+ ConsoleCreate(); \r
+#endif\r
err = establish();\r
if (err != 0) {\r
if (*appData.icsCommPort != NULLCHAR) {\r
- sprintf(buf, "Could not open comm port %s", \r
+ sprintf(buf, _("Could not open comm port %s"), \r
appData.icsCommPort);\r
} else {\r
- sprintf(buf, "Could not connect to host %s, port %s", \r
+ sprintf(buf, _("Could not connect to host %s, port %s"), \r
appData.icsHost, appData.icsPort);\r
}\r
DisplayFatalError(buf, err, 1);\r
} else if (StrCaseCmp(appData.initialMode, "Training") == 0) {\r
initialMode = Training;\r
} else {\r
- sprintf(buf, "Unknown initialMode %s", appData.initialMode);\r
+ sprintf(buf, _("Unknown initialMode %s"), appData.initialMode);\r
DisplayFatalError(buf, 0, 2);\r
return;\r
}\r
if (appData.matchMode) {\r
/* Set up machine vs. machine match */\r
if (appData.noChessProgram) {\r
- DisplayFatalError("Can't have a match with no chess programs",\r
+ DisplayFatalError(_("Can't have a match with no chess programs"),\r
0, 2);\r
return;\r
}\r
if (!LoadGameFromFile(appData.loadGameFile,\r
index,\r
appData.loadGameFile, FALSE)) {\r
- DisplayFatalError("Bad game file", 0, 1);\r
+ DisplayFatalError(_("Bad game file"), 0, 1);\r
return;\r
}\r
} else if (*appData.loadPositionFile != NULLCHAR) {\r
if (!LoadPositionFromFile(appData.loadPositionFile,\r
index,\r
appData.loadPositionFile)) {\r
- DisplayFatalError("Bad position file", 0, 1);\r
+ DisplayFatalError(_("Bad position file"), 0, 1);\r
return;\r
}\r
}\r
/* Set up other modes */\r
if (initialMode == AnalyzeFile) {\r
if (*appData.loadGameFile == NULLCHAR) {\r
- DisplayFatalError("AnalyzeFile mode requires a game file", 0, 1);\r
+ DisplayFatalError(_("AnalyzeFile mode requires a game file"), 0, 1);\r
return;\r
}\r
}\r
}\r
if (initialMode == AnalyzeMode) {\r
if (appData.noChessProgram) {\r
- DisplayFatalError("Analysis mode requires a chess engine", 0, 2);\r
+ DisplayFatalError(_("Analysis mode requires a chess engine"), 0, 2);\r
return;\r
}\r
if (appData.icsActive) {\r
- DisplayFatalError("Analysis mode does not work with ICS mode",0,2);\r
+ DisplayFatalError(_("Analysis mode does not work with ICS mode"),0,2);\r
return;\r
}\r
AnalyzeModeEvent();\r
AnalysisPeriodicEvent(1);\r
} else if (initialMode == MachinePlaysWhite) {\r
if (appData.noChessProgram) {\r
- DisplayFatalError("MachineWhite mode requires a chess engine",\r
+ DisplayFatalError(_("MachineWhite mode requires a chess engine"),\r
0, 2);\r
return;\r
}\r
if (appData.icsActive) {\r
- DisplayFatalError("MachineWhite mode does not work with ICS mode",\r
+ DisplayFatalError(_("MachineWhite mode does not work with ICS mode"),\r
0, 2);\r
return;\r
}\r
MachineWhiteEvent();\r
} else if (initialMode == MachinePlaysBlack) {\r
if (appData.noChessProgram) {\r
- DisplayFatalError("MachineBlack mode requires a chess engine",\r
+ DisplayFatalError(_("MachineBlack mode requires a chess engine"),\r
0, 2);\r
return;\r
}\r
if (appData.icsActive) {\r
- DisplayFatalError("MachineBlack mode does not work with ICS mode",\r
+ DisplayFatalError(_("MachineBlack mode does not work with ICS mode"),\r
0, 2);\r
return;\r
}\r
MachineBlackEvent();\r
} else if (initialMode == TwoMachinesPlay) {\r
if (appData.noChessProgram) {\r
- DisplayFatalError("TwoMachines mode requires a chess engine",\r
+ DisplayFatalError(_("TwoMachines mode requires a chess engine"),\r
0, 2);\r
return;\r
}\r
if (appData.icsActive) {\r
- DisplayFatalError("TwoMachines mode does not work with ICS mode",\r
+ DisplayFatalError(_("TwoMachines mode does not work with ICS mode"),\r
0, 2);\r
return;\r
}\r
EditPositionEvent();\r
} else if (initialMode == Training) {\r
if (*appData.loadGameFile == NULLCHAR) {\r
- DisplayFatalError("Training mode requires a game file", 0, 2);\r
+ DisplayFatalError(_("Training mode requires a game file"), 0, 2);\r
return;\r
}\r
TrainingEvent();\r
gotEof = 0;\r
outCount = OutputMaybeTelnet(icsPR, message, count, &outError);\r
if (outCount < count) {\r
- DisplayFatalError("Error writing to ICS", outError, 1);\r
+ DisplayFatalError(_("Error writing to ICS"), outError, 1);\r
}\r
} else if (count < 0) {\r
RemoveInputSource(isr);\r
- DisplayFatalError("Error reading from keyboard", error, 1);\r
+ DisplayFatalError(_("Error reading from keyboard"), error, 1);\r
} else if (gotEof++ > 0) {\r
RemoveInputSource(isr);\r
- DisplayFatalError("Got end of file from keyboard", 0, 0);\r
+ DisplayFatalError(_("Got end of file from keyboard"), 0, 0);\r
}\r
}\r
\r
count = strlen(s);\r
outCount = OutputMaybeTelnet(icsPR, s, count, &outError);\r
if (outCount < count) {\r
- DisplayFatalError("Error writing to ICS", outError, 1);\r
+ DisplayFatalError(_("Error writing to ICS"), outError, 1);\r
}\r
}\r
\r
outCount = OutputToProcessDelayed(icsPR, s, count, &outError,\r
msdelay);\r
if (outCount < count) {\r
- DisplayFatalError("Error writing to ICS", outError, 1);\r
+ DisplayFatalError(_("Error writing to ICS"), outError, 1);\r
}\r
}\r
\r
v = VariantNormal;\r
break;\r
default:\r
- sprintf(buf, "Unknown wild type %d", wnum);\r
+ sprintf(buf, _("Unknown wild type %d"), wnum);\r
DisplayError(buf, 0);\r
v = VariantUnknown;\r
break;\r
}\r
}\r
if (appData.debugMode) {\r
- fprintf(debugFP, "recognized '%s' (%d) as variant %s\n",\r
+ fprintf(debugFP, _("recognized '%s' (%d) as variant %s\n"),\r
e, wnum, VariantName(v));\r
}\r
return v;\r
int error, outCount;\r
outCount = OutputToProcess(NoProc, data, length, &error);\r
if (outCount < length) {\r
- DisplayFatalError("Error writing to display", error, 1);\r
+ DisplayFatalError(_("Error writing to display"), error, 1);\r
}\r
}\r
\r
msg[2] = option;\r
outCount = OutputToProcess(icsPR, (char *)msg, 3, &outError);\r
if (outCount < 3) {\r
- DisplayFatalError("Error writing to ICS", outError, 1);\r
+ DisplayFatalError(_("Error writing to ICS"), outError, 1);\r
}\r
}\r
\r
{\r
int newHoldingsWidth, newWidth = 8, newHeight = 8, i, j;\r
int oldCurrentMove = currentMove, oldForwardMostMove = forwardMostMove, oldBackwardMostMove = backwardMostMove;\r
- Board tempBoard; int saveCastling[BOARD_SIZE], saveEP;\r
+// Board tempBoard; int saveCastling[BOARD_SIZE], saveEP;\r
\r
startedFromPositionFile = FALSE;\r
if(gameInfo.variant == newVariant) return;\r
int buf_len;\r
int next_out;\r
int tkind;\r
+ int backup; /* [DM] For zippy color lines */\r
char *p;\r
\r
-#ifdef WIN32\r
if (appData.debugMode) {\r
if (!error) {\r
fprintf(debugFP, "<ICS: ");\r
fprintf(debugFP, "\n");\r
}\r
}\r
-#endif\r
\r
if (appData.debugMode) { int f = forwardMostMove;\r
fprintf(debugFP, "ics input %d, castling = %d %d %d %d %d %d\n", f,\r
OutputKibitz(suppressKibitz, parse);\r
} else {\r
char tmp[MSG_SIZ];\r
- sprintf(tmp, "your opponent kibitzes: %s", parse);\r
+ sprintf(tmp, _("your opponent kibitzes: %s"), parse);\r
SendToPlayer(tmp, strlen(tmp));\r
}\r
}\r
oldi = i;\r
// [HGM] kibitz: try to recognize opponent engine-score kibitzes, to divert them to engine-output window\r
if (appData.autoKibitz && started == STARTED_NONE && \r
+ !appData.icsEngineAnalyze && // [HGM] [DM] ICS analyze\r
(gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || gameMode == IcsObserving)) {\r
if(looking_at(buf, &i, "* kibitzes: ") &&\r
(StrStr(star_match[0], gameInfo.white) == star_match[0] || \r
StrStr(star_match[0], gameInfo.black) == star_match[0] )) { // kibitz of self or opponent\r
suppressKibitz = TRUE;\r
- if((StrStr(star_match[0], gameInfo.white) == star_match[0])\r
- && (gameMode == IcsPlayingWhite) ||\r
- (StrStr(star_match[0], gameInfo.black) == star_match[0])\r
- && (gameMode == IcsPlayingBlack) ) // opponent kibitz\r
+ if((StrStr(star_match[0], gameInfo.white) == star_match[0]\r
+ && (gameMode == IcsPlayingWhite)) ||\r
+ (StrStr(star_match[0], gameInfo.black) == star_match[0]\r
+ && (gameMode == IcsPlayingBlack)) ) // opponent kibitz\r
started = STARTED_CHATTER; // own kibitz we simply discard\r
else {\r
started = STARTED_COMMENT; // make sure it will be collected in parse[]\r
} // [HGM] kibitz: end of patch\r
\r
if (appData.zippyTalk || appData.zippyPlay) {\r
+ /* [DM] Backup address for color zippy lines */\r
+ backup = i;\r
#if ZIPPY\r
- if (ZippyControl(buf, &i) ||\r
- ZippyConverse(buf, &i) ||\r
- (appData.zippyPlay && ZippyMatch(buf, &i))) {\r
- loggedOn = TRUE;\r
- continue;\r
+ #ifdef WIN32\r
+ if (loggedOn == TRUE)\r
+ if (ZippyControl(buf, &backup) || ZippyConverse(buf, &backup) ||\r
+ (appData.zippyPlay && ZippyMatch(buf, &backup)));\r
+ #else\r
+ if (ZippyControl(buf, &i) ||\r
+ ZippyConverse(buf, &i) ||\r
+ (appData.zippyPlay && ZippyMatch(buf, &i))) {\r
+ loggedOn = TRUE;\r
+ if (!appData.colorize) continue;\r
}\r
+ #endif\r
#endif\r
- } else {\r
- if (/* Don't color "message" or "messages" output */\r
+ } // [DM] 'else { ' deleted\r
+ if (/* Don't color "message" or "messages" output */\r
(tkind = 5, looking_at(buf, &i, "*. * (*:*): ")) ||\r
looking_at(buf, &i, "*. * at *:*: ") ||\r
looking_at(buf, &i, "--* (*:*): ") ||\r
curColor = ColorSeek;\r
}\r
continue;\r
- }\r
}\r
\r
if (looking_at(buf, &i, "\\ ")) {\r
case H_GOT_UNWANTED_HEADER:\r
case H_GETTING_MOVES:\r
/* Should not happen */\r
- DisplayError("Error gathering move list: two headers", 0);\r
+ DisplayError(_("Error gathering move list: two headers"), 0);\r
ics_getting_history = H_FALSE;\r
break;\r
}\r
gameInfo.whiteRating = string_to_rating(star_match[1]);\r
gameInfo.blackRating = string_to_rating(star_match[3]);\r
if (appData.debugMode)\r
- fprintf(debugFP, "Ratings from header: W %d, B %d\n", \r
+ fprintf(debugFP, _("Ratings from header: W %d, B %d\n"), \r
gameInfo.whiteRating, gameInfo.blackRating);\r
}\r
continue;\r
break;\r
case H_GETTING_MOVES:\r
/* Should not happen */\r
- DisplayError("Error gathering move list: nested", 0);\r
+ DisplayError(_("Error gathering move list: nested"), 0);\r
ics_getting_history = H_FALSE;\r
break;\r
case H_GOT_REQ_HEADER:\r
if(bookHit) { // [HGM] book: simulate book reply\r
static char bookMove[MSG_SIZ]; // a bit generous?\r
\r
- programStats.depth = programStats.nodes = programStats.time = \r
+ programStats.nodes = programStats.depth = programStats.time = \r
programStats.score = programStats.got_only_move = 0;\r
sprintf(programStats.movelist, "%s (xbook)", bookHit);\r
\r
if (forwardMostMove > backwardMostMove) {\r
currentMove = --forwardMostMove;\r
DisplayMove(currentMove - 1); /* before DMError */\r
- DisplayMoveError("Illegal move (rejected by ICS)");\r
+ DisplayMoveError(_("Illegal move (rejected by ICS)"));\r
DrawPosition(FALSE, boards[currentMove]);\r
SwitchClocks();\r
DisplayBothClocks();\r
if (gameMode == IcsObserving &&\r
atoi(star_match[0]) == ics_gamenum)\r
{\r
+ /* icsEngineAnalyze */\r
+ if (appData.icsEngineAnalyze) {\r
+ ExitAnalyzeMode();\r
+ ModeHighlight();\r
+ }\r
StopClocks();\r
gameMode = IcsIdle;\r
ics_gamenum = -1;\r
\r
} else if (count == 0) {\r
RemoveInputSource(isr);\r
- DisplayFatalError("Connection closed by ICS", 0, 0);\r
+ DisplayFatalError(_("Connection closed by ICS"), 0, 0);\r
} else {\r
- DisplayFatalError("Error reading from ICS", error, 1);\r
+ DisplayFatalError(_("Error reading from ICS"), error, 1);\r
}\r
}\r
\r
char *string;\r
{ \r
GameMode newGameMode;\r
- int gamenum, newGame, newMove, relation, basetime, increment, ics_flip = 0;\r
- int j, k, n, moveNum, white_stren, black_stren, white_time, black_time;\r
+ int gamenum, newGame, newMove, relation, basetime, increment, ics_flip = 0, i;\r
+ int j, k, n, moveNum, white_stren, black_stren, white_time, black_time, takeback;\r
int double_push, castle_ws, castle_wl, castle_bs, castle_bl, irrev_count;\r
char to_play, board_chars[200];\r
char move_str[500], str[500], elapsed_time[500];\r
newGame = FALSE;\r
\r
if (appData.debugMode)\r
- fprintf(debugFP, "Parsing board: %s\n", string);\r
+ fprintf(debugFP, _("Parsing board: %s\n"), string);\r
\r
move_str[0] = NULLCHAR;\r
elapsed_time[0] = NULLCHAR;\r
&ticking);\r
\r
if (n < 21) {\r
- sprintf(str, "Failed to parse board string:\n\"%s\"", string);\r
+ sprintf(str, _("Failed to parse board string:\n\"%s\""), string);\r
DisplayError(str, 0);\r
return;\r
}\r
moveNum = (moveNum - 1) * 2;\r
if (to_play == 'B') moveNum++;\r
if (moveNum >= MAX_MOVES) {\r
- DisplayFatalError("Game too long; increase MAX_MOVES and recompile",\r
+ DisplayFatalError(_("Game too long; increase MAX_MOVES and recompile"),\r
0, 1);\r
return;\r
}\r
return;\r
case H_GETTING_MOVES:\r
/* Should not happen */\r
- DisplayError("Error gathering move list: extra board", 0);\r
+ DisplayError(_("Error gathering move list: extra board"), 0);\r
ics_getting_history = H_FALSE;\r
return;\r
}\r
\r
/* Update currentMove and known move number limits */\r
newMove = newGame || moveNum > forwardMostMove;\r
+\r
+ /* [DM] If we found takebacks during icsEngineAnalyze try send to engine */\r
+ if (!newGame && appData.icsEngineAnalyze && moveNum < forwardMostMove) {\r
+ takeback = forwardMostMove - moveNum;\r
+ for (i = 0; i < takeback; i++) {\r
+ if (appData.debugMode) fprintf(debugFP, "take back move\n");\r
+ SendToProgram("undo\n", &first);\r
+ }\r
+ }\r
+\r
if (newGame) {\r
forwardMostMove = backwardMostMove = currentMove = moveNum;\r
if (gameMode == IcsExamining && moveNum == 0) {\r
if ((gameMode == IcsPlayingWhite && WhiteOnMove(moveNum)) ||\r
(gameMode == IcsPlayingBlack && !WhiteOnMove(moveNum))) {\r
if (moveList[moveNum - 1][0] == NULLCHAR) {\r
- sprintf(str, "Couldn't parse move \"%s\" from ICS",\r
+ sprintf(str, _("Couldn't parse move \"%s\" from ICS"),\r
move_str);\r
DisplayError(str, 0);\r
} else {\r
}\r
} else if (gameMode == IcsObserving || gameMode == IcsExamining) {\r
if (moveList[moveNum - 1][0] == NULLCHAR) {\r
- sprintf(str, "Couldn't parse move \"%s\" from ICS", move_str);\r
+ sprintf(str, _("Couldn't parse move \"%s\" from ICS"), move_str);\r
DisplayError(str, 0);\r
} else {\r
if(gameInfo.variant == currentlyInitializedVariant) // [HGM] refrain sending moves engine can't understand!\r
if(bookHit) { // [HGM] book: simulate book reply\r
static char bookMove[MSG_SIZ]; // a bit generous?\r
\r
- programStats.depth = programStats.nodes = programStats.time = \r
+ programStats.nodes = programStats.depth = programStats.time = \r
programStats.score = programStats.got_only_move = 0;\r
sprintf(programStats.movelist, "%s (xbook)", bookHit);\r
\r
\r
switch (moveType) {\r
default:\r
- sprintf(user_move, "say Internal error; bad moveType %d (%d,%d-%d,%d)",\r
+ sprintf(user_move, _("say Internal error; bad moveType %d (%d,%d-%d,%d)"),\r
(int)moveType, fromX, fromY, toX, toY);\r
DisplayError(user_move + strlen("say "), 0);\r
break;\r
void\r
AlphaRank(char *move, int n)\r
{\r
- char *p = move, c; int x, y;\r
+// char *p = move, c; int x, y;\r
\r
if (appData.debugMode) {\r
fprintf(debugFP, "alphaRank(%s,%d)\n", move, n);\r
}\r
}\r
\r
+#if 0\r
/* [AS] FRC game initialization */\r
static int FindEmptySquare( Board board, int n )\r
{\r
return i;\r
}\r
\r
-#if 0\r
static void ShuffleFRC( Board board )\r
{\r
int i;\r
\r
int squaresLeft[4];\r
int piecesLeft[(int)BlackPawn];\r
-long long int seed, nrOfShuffles;\r
+u64 seed, nrOfShuffles;\r
\r
void GetPositionNumber()\r
{ // sets global variable seed\r
int i;\r
\r
for(i=BOARD_LEFT; i<BOARD_RGHT; i++) {\r
- if( ((i-BOARD_LEFT)&1)+1 & shade && board[rank][i] == EmptySquare && n-- == 0) {\r
+ if( (((i-BOARD_LEFT)&1)+1) & shade && board[rank][i] == EmptySquare && n-- == 0) {\r
board[rank][i] = (ChessSquare) pieceType;\r
- squaresLeft[(i-BOARD_LEFT&1) + 1]--;\r
+ squaresLeft[((i-BOARD_LEFT)&1) + 1]--;\r
squaresLeft[ANY]--;\r
piecesLeft[pieceType]--; \r
return i;\r
// in variants with super-numerary Kings and Rooks, we leave these for the shuffle\r
}\r
\r
- if((BOARD_RGHT-BOARD_LEFT & 1) == 0)\r
+ if(((BOARD_RGHT-BOARD_LEFT) & 1) == 0)\r
// only for even boards make effort to put pairs of colorbound pieces on opposite colors\r
for(p = (int) WhiteKing; p > (int) WhitePawn; p--) {\r
if(p != (int) WhiteBishop && p != (int) WhiteFerz && p != (int) WhiteAlfil) continue;\r
nrCastlingRights = 6;\r
castlingRights[0][0] = initialRights[0] = BOARD_RGHT-1;\r
castlingRights[0][1] = initialRights[1] = BOARD_LEFT;\r
- castlingRights[0][2] = initialRights[2] = BOARD_WIDTH-1>>1;\r
+ castlingRights[0][2] = initialRights[2] =(BOARD_WIDTH-1)>>1;\r
castlingRights[0][3] = initialRights[3] = BOARD_RGHT-1;\r
castlingRights[0][4] = initialRights[4] = BOARD_LEFT;\r
- castlingRights[0][5] = initialRights[5] = BOARD_WIDTH-1>>1;\r
+ castlingRights[0][5] = initialRights[5] =(BOARD_WIDTH-1)>>1;\r
break;\r
case VariantFalcon:\r
pieces = FalconArray;\r
}\r
if(gameInfo.holdingsSize) gameInfo.holdingsWidth = 2;\r
if(BOARD_HEIGHT > BOARD_SIZE || BOARD_WIDTH > BOARD_SIZE)\r
- DisplayFatalError("Recompile to support this BOARD_SIZE!", 0, 2);\r
+ DisplayFatalError(_("Recompile to support this BOARD_SIZE!"), 0, 2);\r
\r
pawnRow = gameInfo.boardHeight - 7; /* seems to work in all common variants */\r
if(pawnRow < 1) pawnRow = 1;\r
case IcsPlayingBlack:\r
if (appData.zippyPlay) return FALSE;\r
if (white_piece) {\r
- DisplayMoveError("You are playing Black");\r
+ DisplayMoveError(_("You are playing Black"));\r
return FALSE;\r
}\r
break;\r
case IcsPlayingWhite:\r
if (appData.zippyPlay) return FALSE;\r
if (!white_piece) {\r
- DisplayMoveError("You are playing White");\r
+ DisplayMoveError(_("You are playing White"));\r
return FALSE;\r
}\r
break;\r
\r
case EditGame:\r
if (!white_piece && WhiteOnMove(currentMove)) {\r
- DisplayMoveError("It is White's turn");\r
+ DisplayMoveError(_("It is White's turn"));\r
return FALSE;\r
} \r
if (white_piece && !WhiteOnMove(currentMove)) {\r
- DisplayMoveError("It is Black's turn");\r
+ DisplayMoveError(_("It is Black's turn"));\r
return FALSE;\r
} \r
if (cmailMsgLoaded && (currentMove < cmailOldMove)) {\r
if (appData.icsActive) return FALSE;\r
if (!appData.noChessProgram) {\r
if (!white_piece) {\r
- DisplayMoveError("You are playing White");\r
+ DisplayMoveError(_("You are playing White"));\r
return FALSE;\r
}\r
}\r
\r
case Training:\r
if (!white_piece && WhiteOnMove(currentMove)) {\r
- DisplayMoveError("It is White's turn");\r
+ DisplayMoveError(_("It is White's turn"));\r
return FALSE;\r
} \r
if (white_piece && !WhiteOnMove(currentMove)) {\r
- DisplayMoveError("It is Black's turn");\r
+ DisplayMoveError(_("It is Black's turn"));\r
return FALSE;\r
} \r
break;\r
}\r
if (currentMove != forwardMostMove && gameMode != AnalyzeMode\r
&& gameMode != AnalyzeFile && gameMode != Training) {\r
- DisplayMoveError("Displayed position is not current");\r
+ DisplayMoveError(_("Displayed position is not current"));\r
return FALSE;\r
}\r
return TRUE;\r
case MachinePlaysWhite:\r
/* User is moving for Black */\r
if (WhiteOnMove(currentMove)) {\r
- DisplayMoveError("It is White's turn");\r
+ DisplayMoveError(_("It is White's turn"));\r
return ImpossibleMove;\r
}\r
break;\r
case MachinePlaysBlack:\r
/* User is moving for White */\r
if (!WhiteOnMove(currentMove)) {\r
- DisplayMoveError("It is Black's turn");\r
+ DisplayMoveError(_("It is Black's turn"));\r
return ImpossibleMove;\r
}\r
break;\r
(int) boards[currentMove][fromY][fromX] < (int) EmptySquare) {\r
/* User is moving for Black */\r
if (WhiteOnMove(currentMove)) {\r
- DisplayMoveError("It is White's turn");\r
+ DisplayMoveError(_("It is White's turn"));\r
return ImpossibleMove;\r
}\r
} else {\r
/* User is moving for White */\r
if (!WhiteOnMove(currentMove)) {\r
- DisplayMoveError("It is Black's turn");\r
+ DisplayMoveError(_("It is Black's turn"));\r
return ImpossibleMove;\r
}\r
}\r
/* User is moving for Black */\r
if (WhiteOnMove(currentMove)) {\r
if (!appData.premove) {\r
- DisplayMoveError("It is White's turn");\r
+ DisplayMoveError(_("It is White's turn"));\r
} else if (toX >= 0 && toY >= 0) {\r
premoveToX = toX;\r
premoveToY = toY;\r
/* User is moving for White */\r
if (!WhiteOnMove(currentMove)) {\r
if (!appData.premove) {\r
- DisplayMoveError("It is Black's turn");\r
+ DisplayMoveError(_("It is Black's turn"));\r
} else if (toX >= 0 && toY >= 0) {\r
premoveToX = toX;\r
premoveToY = toY;\r
/* [HGM] but possibly ignore an IllegalMove result */\r
if (appData.testLegality) {\r
if (moveType == IllegalMove || moveType == ImpossibleMove) {\r
- DisplayMoveError("Illegal move");\r
+ DisplayMoveError(_("Illegal move"));\r
return ImpossibleMove;\r
}\r
}\r
gameMode = PlayFromGameFile;\r
ModeHighlight();\r
SetTrainingModeOff();\r
- DisplayInformation("End of game");\r
+ DisplayInformation(_("End of game"));\r
}\r
} else {\r
- DisplayError("Incorrect move", 0);\r
+ DisplayError(_("Incorrect move"), 0);\r
}\r
return 1;\r
}\r
if(bookHit) { // [HGM] book: simulate book reply\r
static char bookMove[MSG_SIZ]; // a bit generous?\r
\r
- programStats.depth = programStats.nodes = programStats.time = \r
+ programStats.nodes = programStats.depth = programStats.time = \r
programStats.score = programStats.got_only_move = 0;\r
sprintf(programStats.movelist, "%s (xbook)", bookHit);\r
\r
\r
void SendProgramStatsToFrontend( ChessProgramState * cps, ChessProgramStats * cpstats )\r
{\r
- char * hint = lastHint;\r
+// char * hint = lastHint;\r
FrontEndProgramStats stats;\r
\r
stats.which = cps == &first ? 0 : 1;\r
if (!ParseOneMove(machineMove, forwardMostMove, &moveType,\r
&fromX, &fromY, &toX, &toY, &promoChar)) {\r
/* Machine move could not be parsed; ignore it. */\r
- sprintf(buf1, "Illegal move \"%s\" from %s machine",\r
+ sprintf(buf1, _("Illegal move \"%s\" from %s machine"),\r
machineMove, cps->which);\r
DisplayError(buf1, 0);\r
- sprintf(buf1, "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d%c",\r
- machineMove, fromX+AAA, fromY+ONE, toX+AAA, toY+ONE, 0);\r
+ sprintf(buf1, "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d",\r
+ machineMove, fromX+AAA, fromY+ONE, toX+AAA, toY+ONE, moveType);\r
if (gameMode == TwoMachinesPlay) {\r
GameEnds(machineWhite ? BlackWins : WhiteWins,\r
buf1, GE_XBOARD);\r
toX--;\r
currentMoveString[2]--;\r
break;\r
+ default: ; // nothing to do, but suppresses warning of pedantic compilers\r
}\r
}\r
hintRequested = FALSE;\r
first.initDone) {\r
SendMoveToICS(moveType, fromX, fromY, toX, toY);\r
ics_user_moved = 1;\r
- if(appData.autoKibitz) { /* [HGM] kibitz: send most-recent PV info to ICS */\r
+ if(appData.autoKibitz && !appData.icsEngineAnalyze ) { /* [HGM] kibitz: send most-recent PV info to ICS */\r
char buf[3*MSG_SIZ];\r
\r
sprintf(buf, "kibitz %d/%+.2f (%.2f sec, %.0f nodes, %1.0f knps) PV = %s\n",\r
programStats.depth,\r
programStats.score / 100.,\r
programStats.time / 100.,\r
- (double) programStats.nodes,\r
- programStats.nodes / (10*abs(programStats.time) + 1.),\r
+ u64ToDouble(programStats.nodes),\r
+ u64ToDouble(programStats.nodes) / (10*abs(programStats.time) + 1.),\r
programStats.movelist);\r
SendToICS(buf);\r
}\r
{ /* [HGM] Some more adjudications for obstinate engines */\r
int NrWN=0, NrBN=0, NrWB=0, NrBB=0, NrWR=0, NrBR=0,\r
NrWQ=0, NrBQ=0, NrW=0, bishopsColor = 0,\r
- NrPieces=0, NrPawns=0, PawnAdvance=0, i, j, k;\r
+ NrPieces=0, NrPawns=0, PawnAdvance=0, i, j;\r
static int moveCount = 6;\r
\r
/* First absolutely insufficient mating material. Count what is on board. */\r
}\r
}\r
\r
- if( NrPieces == 2 || gameInfo.variant != VariantXiangqi &&\r
+ if( NrPieces == 2 || gameInfo.variant != VariantXiangqi && \r
+ gameInfo.variant != VariantShatranj && // [HGM] baring will remain possible\r
(NrPieces == 3 && NrWN+NrBN+NrWB+NrBB == 1 ||\r
NrPieces == NrBB+NrWB+2 && bishopsColor != 3)) // [HGM] all Bishops (Ferz!) same color\r
{ /* KBK, KNK, KK of KBKB with like Bishops */\r
EP_NONE, castlingRights[m-1]) != MT_CHECK)\r
hisPerpetual = 0; // the opponent did not always check\r
}\r
+ if(appData.debugMode) fprintf(debugFP, "XQ perpetual test, our=%d, his=%d\n",\r
+ ourPerpetual, hisPerpetual);\r
if(ourPerpetual && !hisPerpetual) { // we are actively checking him: forfeit\r
GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins, \r
"Xboard adjudication: perpetual checking", GE_XBOARD );\r
}\r
if(hisPerpetual && !ourPerpetual) // he is checking us, but did not repeat yet\r
break; // (or we would have caught him before). Abort repetition-checking loop.\r
- // if neither of us is checking all the time, or both are, it is draw\r
- // (illegal-chase forfeits not implemented yet!)\r
+ // Now check for perpetual chases\r
+ if(!ourPerpetual && !hisPerpetual) { // no perpetual check, test for chase\r
+ hisPerpetual = PerpetualChase(k, forwardMostMove);\r
+ ourPerpetual = PerpetualChase(k+1, forwardMostMove);\r
+ if(ourPerpetual && !hisPerpetual) { // we are actively checking him: forfeit\r
+ GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins, \r
+ "Xboard adjudication: perpetual chasing", GE_XBOARD );\r
+ return;\r
+ }\r
+ if(hisPerpetual && !ourPerpetual) // he is chasing us, but did not repeat yet\r
+ break; // Abort repetition-checking loop.\r
+ }\r
+ // if neither of us is checking or chasing all the time, or both are, it is draw\r
}\r
GameEnds( GameIsDrawn, "Xboard adjudication: repetition draw", GE_XBOARD );\r
return;\r
strcat(bookMove, bookHit);\r
message = bookMove;\r
cps = cps->other;\r
- programStats.depth = programStats.nodes = programStats.time = \r
+ programStats.nodes = programStats.depth = programStats.time = \r
programStats.score = programStats.got_only_move = 0;\r
sprintf(programStats.movelist, "%s (xbook)", bookHit);\r
\r
GameEnds(GameUnfinished, "Engine aborts game", GE_XBOARD);\r
\r
if (!ParseFEN(initial_position, &blackPlaysFirst, message + 9)) {\r
- DisplayError("Bad FEN received from engine", 0);\r
+ DisplayError(_("Bad FEN received from engine"), 0);\r
return ;\r
} else {\r
Reset(FALSE, FALSE);\r
cps->analysisSupport = FALSE;\r
cps->analyzing = FALSE;\r
Reset(FALSE, TRUE);\r
- sprintf(buf2, "%s does not support analysis", cps->tidy);\r
+ sprintf(buf2, _("%s does not support analysis"), cps->tidy);\r
DisplayError(buf2, 0);\r
return;\r
}\r
DisplayMove(currentMove-1); /* before DisplayMoveError */\r
SwitchClocks();\r
DisplayBothClocks();\r
- sprintf(buf1, "Illegal move \"%s\" (rejected by %s chess program)",\r
+ sprintf(buf1, _("Illegal move \"%s\" (rejected by %s chess program)"),\r
parseList[currentMove], cps->which);\r
DisplayMoveError(buf1);\r
DrawPosition(FALSE, boards[currentMove]);\r
|| (StrStr(message, "Permission denied") != NULL)) {\r
\r
cps->maybeThinking = FALSE;\r
- sprintf(buf1, "Failed to start %s chess program %s on %s: %s\n",\r
+ sprintf(buf1, _("Failed to start %s chess program %s on %s: %s\n"),\r
cps->which, cps->program, cps->host, message);\r
RemoveInputSource(cps->isr);\r
DisplayFatalError(buf1, 0, 1);\r
(void) CoordsToAlgebraic(boards[forwardMostMove],\r
PosFlags(forwardMostMove), EP_UNKNOWN,\r
fromY, fromX, toY, toX, promoChar, buf1);\r
- sprintf(buf2, "Hint: %s", buf1);\r
+ sprintf(buf2, _("Hint: %s"), buf1);\r
DisplayInformation(buf2);\r
} else {\r
/* Hint move could not be parsed!? */\r
sprintf(buf2,\r
- "Illegal hint move \"%s\"\nfrom %s chess program",\r
+ _("Illegal hint move \"%s\"\nfrom %s chess program"),\r
buf1, cps->which);\r
DisplayError(buf2, 0);\r
}\r
} else if (gameMode == MachinePlaysWhite ||\r
gameMode == MachinePlaysBlack) {\r
if (userOfferedDraw) {\r
- DisplayInformation("Machine accepts your draw offer");\r
+ DisplayInformation(_("Machine accepts your draw offer"));\r
GameEnds(GameIsDrawn, "Draw agreed", GE_XBOARD);\r
} else {\r
- DisplayInformation("Machine offers a draw\nSelect Action / Draw to agree");\r
+ DisplayInformation(_("Machine offers a draw\nSelect Action / Draw to agree"));\r
}\r
}\r
}\r
) {\r
int plylev, mvleft, mvtot, curscore, time;\r
char mvname[MOVE_LEN];\r
- unsigned long nodes;\r
+ u64 nodes; // [DM]\r
char plyext;\r
int ignore = FALSE;\r
int prefixHint = FALSE;\r
break;\r
case AnalyzeMode:\r
case AnalyzeFile:\r
+ break;\r
+ case IcsObserving: /* [DM] icsEngineAnalyze */\r
+ if (!appData.icsEngineAnalyze) ignore = TRUE;\r
break;\r
case TwoMachinesPlay:\r
if ((cps->twoMachinesColor[0] == 'w') != WhiteOnMove(forwardMostMove)) {\r
\r
if (!ignore) {\r
buf1[0] = NULLCHAR;\r
- if (sscanf(message, "%d%c %d %d %lu %[^\n]\n",\r
+ if (sscanf(message, "%d%c %d %d " u64Display " %[^\n]\n",\r
&plylev, &plyext, &curscore, &time, &nodes, buf1) >= 5) {\r
\r
if (plyext != ' ' && plyext != '\t') {\r
if(cps->nps >= 0) { /* [HGM] nps: use engine nodes or time to decrement clock */\r
int ticklen;\r
\r
- if(cps->nps == 0) ticklen = 10*time; // use engine reported time\r
- else ticklen = (1000. * nodes) / cps->nps; // convert node count to time\r
+ if(cps->nps == 0) ticklen = 10*time; // use engine reported time\r
+ else ticklen = (1000. * u64ToDouble(nodes)) / cps->nps; // convert node count to time\r
if(WhiteOnMove(forwardMostMove)) \r
whiteTimeRemaining = timeRemaining[0][forwardMostMove] - ticklen;\r
else blackTimeRemaining = timeRemaining[1][forwardMostMove] - ticklen;\r
strcat( thinkOutput, buf1 );\r
}\r
\r
- if (currentMove == forwardMostMove || gameMode == AnalyzeMode || gameMode == AnalyzeFile) {\r
+ if (currentMove == forwardMostMove || gameMode == AnalyzeMode\r
+ || gameMode == AnalyzeFile || appData.icsEngineAnalyze) {\r
DisplayMove(currentMove - 1);\r
DisplayAnalysis();\r
}\r
\r
SendProgramStatsToFrontend( cps, &programStats );\r
\r
- if (currentMove == forwardMostMove || gameMode==AnalyzeMode || gameMode == AnalyzeFile) {\r
+ if (currentMove == forwardMostMove || gameMode==AnalyzeMode || \r
+ gameMode == AnalyzeFile || appData.icsEngineAnalyze) {\r
DisplayMove(currentMove - 1);\r
DisplayAnalysis();\r
}\r
return;\r
- } else if (sscanf(message,"stat01: %d %lu %d %d %d %s",\r
+ } else if (sscanf(message,"stat01: %d " u64Display " %d %d %d %s",\r
&time, &nodes, &plylev, &mvleft,\r
&mvtot, mvname) >= 5) {\r
/* The stat01: line is from Crafty (9.29+) in response\r
strcat(programStats.movelist, p);\r
}\r
\r
- if (currentMove == forwardMostMove || gameMode==AnalyzeMode || gameMode == AnalyzeFile) {\r
+ if (currentMove == forwardMostMove || gameMode==AnalyzeMode ||\r
+ gameMode == AnalyzeFile || appData.icsEngineAnalyze) {\r
DisplayMove(currentMove - 1);\r
DisplayAnalysis();\r
}\r
else {\r
buf1[0] = NULLCHAR;\r
\r
- if (sscanf(message, "%d%c %d %d %lu %[^\n]\n",\r
+ if (sscanf(message, "%d%c %d %d " u64Display " %[^\n]\n",\r
&plylev, &plyext, &curscore, &time, &nodes, buf1) >= 5) \r
{\r
ChessProgramStats cpstats;\r
break;\r
case AmbiguousMove:\r
/* bug? */\r
- sprintf(buf, "Ambiguous move in ICS output: \"%s\"", yy_text);\r
+ sprintf(buf, _("Ambiguous move in ICS output: \"%s\""), yy_text);\r
if (appData.debugMode) {\r
fprintf(debugFP, "Ambiguous move from ICS: '%s'\n", yy_text);\r
fprintf(debugFP, "board L=%d, R=%d, H=%d, holdings=%d\n", BOARD_LEFT, BOARD_RGHT, BOARD_HEIGHT, gameInfo.holdingsWidth);\r
return;\r
case ImpossibleMove:\r
/* bug? */\r
- sprintf(buf, "Illegal move in ICS output: \"%s\"", yy_text);\r
+ sprintf(buf, _("Illegal move in ICS output: \"%s\""), yy_text);\r
if (appData.debugMode) {\r
fprintf(debugFP, "Impossible move from ICS: '%s'\n", yy_text);\r
fprintf(debugFP, "board L=%d, R=%d, H=%d, holdings=%d\n", BOARD_LEFT, BOARD_RGHT, BOARD_HEIGHT, gameInfo.holdingsWidth);\r
case (ChessMove) 0: /* end of file */\r
if (boardIndex < backwardMostMove) {\r
/* Oops, gap. How did that happen? */\r
- DisplayError("Gap in move list", 0);\r
+ DisplayError(_("Gap in move list"), 0);\r
return;\r
}\r
backwardMostMove = blackPlaysFirst ? 1 : 0;\r
/* [HGM] compute & store e.p. status and castling rights for new position */\r
/* if we are updating a board for which those exist (i.e. in boards[]) */\r
if((p = ((int)board - (int)boards[0])/((int)boards[1]-(int)boards[0])) < MAX_MOVES && p > 0)\r
- { int i, j;\r
+ { int i;\r
\r
if(gameInfo.variant == VariantBerolina) berolina = EP_BEROLIN_A;\r
oldEP = epStatus[p-1];\r
int fromX, fromY, toX, toY;\r
int promoChar;\r
{\r
- forwardMostMove++;\r
+// forwardMostMove++; // [HGM] bare: moved downstream\r
\r
- if(serverMoves != NULL) { /* [HGM] write moves on file for broadcasting */\r
+ if(serverMoves != NULL) { /* [HGM] write moves on file for broadcasting (should be separate routine, really) */\r
int timeLeft; static int lastLoadFlag=0; int king, piece;\r
- piece = boards[forwardMostMove-1][fromY][fromX];\r
+ piece = boards[forwardMostMove][fromY][fromX];\r
king = piece < (int) BlackPawn ? WhiteKing : BlackKing;\r
if(gameInfo.variant == VariantKnightmate)\r
king += (int) WhiteUnicorn - (int) WhiteKing;\r
- if(forwardMostMove == 1) {\r
+ if(forwardMostMove == 0) {\r
if(blackPlaysFirst) \r
fprintf(serverMoves, "%s;", second.tidy);\r
fprintf(serverMoves, "%s;", first.tidy);\r
fprintf(serverMoves, ":%c%c:%c%c", AAA+BOARD_LEFT, ONE+fromY, AAA+toX+1,ONE+toY);\r
}\r
// e.p. suffix\r
- if( (boards[forwardMostMove-1][fromY][fromX] == WhitePawn ||\r
- boards[forwardMostMove-1][fromY][fromX] == BlackPawn ) &&\r
- boards[forwardMostMove-1][toY][toX] == EmptySquare\r
+ if( (boards[forwardMostMove][fromY][fromX] == WhitePawn ||\r
+ boards[forwardMostMove][fromY][fromX] == BlackPawn ) &&\r
+ boards[forwardMostMove][toY][toX] == EmptySquare\r
&& fromX != toX )\r
fprintf(serverMoves, ":%c%c:%c%c", AAA+fromX, ONE+fromY, AAA+toX, ONE+fromY);\r
// promotion suffix\r
fprintf(serverMoves, ":%c:%c%c", promoChar, AAA+toX, ONE+toY);\r
if(!loadFlag) {\r
fprintf(serverMoves, "/%d/%d",\r
- pvInfoList[forwardMostMove-1].depth, pvInfoList[forwardMostMove-1].score);\r
- if(forwardMostMove & 1) timeLeft = whiteTimeRemaining/1000;\r
- else timeLeft = blackTimeRemaining/1000;\r
+ pvInfoList[forwardMostMove].depth, pvInfoList[forwardMostMove].score);\r
+ if(forwardMostMove+1 & 1) timeLeft = whiteTimeRemaining/1000;\r
+ else timeLeft = blackTimeRemaining/1000;\r
fprintf(serverMoves, "/%d", timeLeft);\r
}\r
fflush(serverMoves);\r
}\r
\r
- if (forwardMostMove >= MAX_MOVES) {\r
- DisplayFatalError("Game too long; increase MAX_MOVES and recompile",\r
+ if (forwardMostMove+1 >= MAX_MOVES) {\r
+ DisplayFatalError(_("Game too long; increase MAX_MOVES and recompile"),\r
0, 1);\r
return;\r
}\r
SwitchClocks();\r
- timeRemaining[0][forwardMostMove] = whiteTimeRemaining;\r
- timeRemaining[1][forwardMostMove] = blackTimeRemaining;\r
- if (commentList[forwardMostMove] != NULL) {\r
- free(commentList[forwardMostMove]);\r
- commentList[forwardMostMove] = NULL;\r
- }\r
- CopyBoard(boards[forwardMostMove], boards[forwardMostMove - 1]);\r
- ApplyMove(fromX, fromY, toX, toY, promoChar, boards[forwardMostMove]);\r
+ timeRemaining[0][forwardMostMove+1] = whiteTimeRemaining;\r
+ timeRemaining[1][forwardMostMove+1] = blackTimeRemaining;\r
+ if (commentList[forwardMostMove+1] != NULL) {\r
+ free(commentList[forwardMostMove+1]);\r
+ commentList[forwardMostMove+1] = NULL;\r
+ }\r
+ CopyBoard(boards[forwardMostMove+1], boards[forwardMostMove]);\r
+ ApplyMove(fromX, fromY, toX, toY, promoChar, boards[forwardMostMove+1]);\r
+ forwardMostMove++; // [HGM] bare: moved to after ApplyMove, to make sure clock interrupt finds complete board\r
gameInfo.result = GameUnfinished;\r
if (gameInfo.resultDetails != NULL) {\r
free(gameInfo.resultDetails);\r
{\r
int instant = (gameMode == PlayFromGameFile) ?\r
(matchMode || (appData.timeDelay == 0 && !pausing)) : pausing;\r
+ if(appData.noGUI) return;\r
if (!pausing || gameMode == PlayFromGameFile || gameMode == AnalyzeFile) {\r
if (!instant) {\r
if (forwardMostMove == currentMove + 1) {\r
char *v = VariantName(gameInfo.variant);\r
if (cps->protocolVersion != 1 && StrStr(cps->variants, v) == NULL) {\r
/* [HGM] in protocol 1 we have to assume all variants valid */\r
- sprintf(buf, "Variant %s not supported by %s", v, cps->tidy);\r
+ sprintf(buf, _("Variant %s not supported by %s"), v, cps->tidy);\r
DisplayFatalError(buf, 0, 1);\r
return;\r
}\r
}\r
\r
if (err != 0) {\r
- sprintf(buf, "Startup failure on '%s'", cps->program);\r
+ sprintf(buf, _("Startup failure on '%s'"), cps->program);\r
DisplayFatalError(buf, err, 1);\r
cps->pr = NoProc;\r
cps->isr = NULL;\r
TwoMachinesEventIfReady P((void))\r
{\r
if (first.lastPing != first.lastPong) {\r
- DisplayMessage("", "Waiting for first chess program");\r
- ScheduleDelayedEvent(TwoMachinesEventIfReady, 1000);\r
+ DisplayMessage("", _("Waiting for first chess program"));\r
+ ScheduleDelayedEvent(TwoMachinesEventIfReady, 10); // [HGM] fast: lowered from 1000\r
return;\r
}\r
if (second.lastPing != second.lastPong) {\r
- DisplayMessage("", "Waiting for second chess program");\r
- ScheduleDelayedEvent(TwoMachinesEventIfReady, 1000);\r
+ DisplayMessage("", _("Waiting for second chess program"));\r
+ ScheduleDelayedEvent(TwoMachinesEventIfReady, 10); // [HGM] fast: lowered from 1000\r
return;\r
}\r
ThawUI();\r
} else {\r
char buf[MSG_SIZ];\r
gameMode = nextGameMode;\r
- sprintf(buf, "Match %s vs. %s: final score %d-%d-%d",\r
+ sprintf(buf, _("Match %s vs. %s: final score %d-%d-%d"),\r
first.tidy, second.tidy,\r
first.matchWins, second.matchWins,\r
appData.matchGames - (first.matchWins + second.matchWins));\r
timeRemaining[1][currentMove] = blackTimeRemaining;\r
}\r
\r
- if ((gameMode == AnalyzeMode || gameMode == AnalyzeFile) &&\r
- first.analysisSupport) {\r
+ if ((gameMode == AnalyzeMode || gameMode == AnalyzeFile ||\r
+ appData.icsEngineAnalyze) && first.analysisSupport) {\r
SendToProgram("analyze\n", &first);\r
first.analyzing = TRUE;\r
}\r
if (appData.testLegality) {\r
if (appData.debugMode)\r
fprintf(debugFP, "Parsed IllegalMove: %s\n", yy_text);\r
- sprintf(move, "Illegal move: %d.%s%s",\r
+ sprintf(move, _("Illegal move: %d.%s%s"),\r
(forwardMostMove / 2) + 1,\r
WhiteOnMove(forwardMostMove) ? " " : ".. ", yy_text);\r
DisplayError(move, 0);\r
case AmbiguousMove:\r
if (appData.debugMode)\r
fprintf(debugFP, "Parsed AmbiguousMove: %s\n", yy_text);\r
- sprintf(move, "Ambiguous move: %d.%s%s",\r
+ sprintf(move, _("Ambiguous move: %d.%s%s"),\r
(forwardMostMove / 2) + 1,\r
WhiteOnMove(forwardMostMove) ? " " : ".. ", yy_text);\r
DisplayError(move, 0);\r
case ImpossibleMove:\r
if (appData.debugMode)\r
fprintf(debugFP, "Parsed ImpossibleMove (type = %d): %s\n", moveType, yy_text);\r
- sprintf(move, "Illegal move: %d.%s%s",\r
+ sprintf(move, _("Illegal move: %d.%s%s"),\r
(forwardMostMove / 2) + 1,\r
WhiteOnMove(forwardMostMove) ? " " : ".. ", yy_text);\r
DisplayError(move, 0);\r
} else {\r
f = fopen(filename, "rb");\r
if (f == NULL) {\r
- sprintf(buf, "Can't open \"%s\"", filename);\r
+ sprintf(buf, _("Can't open \"%s\""), filename);\r
DisplayError(buf, errno);\r
return FALSE;\r
}\r
if (useList && n == 0) {\r
int error = GameListBuild(f);\r
if (error) {\r
- DisplayError("Cannot build game list", error);\r
+ DisplayError(_("Cannot build game list"), error);\r
} else if (!ListEmpty(&gameList) &&\r
((ListGame *) gameList.tailPred)->number > 1) {\r
GameListPopUp(f, title);\r
int retVal;\r
\r
if (gameNumber > nCmailGames) {\r
- DisplayError("No more games in this message", 0);\r
+ DisplayError(_("No more games in this message"), 0);\r
return FALSE;\r
}\r
if (f == lastLoadGameFP) {\r
{\r
int gameNumber = lastLoadGameNumber + offset;\r
if (lastLoadGameFP == NULL) {\r
- DisplayError("No game has been loaded yet", 0);\r
+ DisplayError(_("No game has been loaded yet"), 0);\r
return FALSE;\r
}\r
if (gameNumber <= 0) {\r
- DisplayError("Can't back up any further", 0);\r
+ DisplayError(_("Can't back up any further"), 0);\r
return FALSE;\r
}\r
if (cmailMsgLoaded) {\r
gn = 1;\r
}\r
else {\r
- DisplayError("Game number out of range", 0);\r
+ DisplayError(_("Game number out of range"), 0);\r
return FALSE;\r
}\r
} else {\r
gameNumber == 1) {\r
gn = 1;\r
} else {\r
- DisplayError("Can't seek on game file", 0);\r
+ DisplayError(_("Can't seek on game file"), 0);\r
return FALSE;\r
}\r
}\r
nCmailGames = CMAIL_MAX_GAMES - gn;\r
} else {\r
Reset(TRUE, TRUE);\r
- DisplayError("Game not found in file", 0);\r
+ DisplayError(_("Game not found in file"), 0);\r
}\r
return FALSE;\r
\r
startedFromSetupPosition = TRUE;\r
if (!ParseFEN(initial_position, &blackPlaysFirst, gameInfo.fen)) {\r
Reset(TRUE, TRUE);\r
- DisplayError("Bad FEN position in file", 0);\r
+ DisplayError(_("Bad FEN position in file"), 0);\r
return FALSE;\r
}\r
CopyBoard(boards[0], initial_position);\r
if ((cm == (ChessMove) 0 && lastLoadGameStart != (ChessMove) 0) ||\r
cm == WhiteWins || cm == BlackWins ||\r
cm == GameIsDrawn || cm == GameUnfinished) {\r
- DisplayMessage("", "No moves in game");\r
+ DisplayMessage("", _("No moves in game"));\r
if (cmailMsgLoaded) {\r
if (appData.debugMode)\r
fprintf(debugFP, "Setting flipView to %d.\n", FALSE);\r
{\r
int positionNumber = lastLoadPositionNumber + offset;\r
if (lastLoadPositionFP == NULL) {\r
- DisplayError("No position has been loaded yet", 0);\r
+ DisplayError(_("No position has been loaded yet"), 0);\r
return FALSE;\r
}\r
if (positionNumber <= 0) {\r
- DisplayError("Can't back up any further", 0);\r
+ DisplayError(_("Can't back up any further"), 0);\r
return FALSE;\r
}\r
return LoadPosition(lastLoadPositionFP, positionNumber,\r
} else {\r
f = fopen(filename, "rb");\r
if (f == NULL) {\r
- sprintf(buf, "Can't open \"%s\"", filename);\r
+ sprintf(buf, _("Can't open \"%s\""), filename);\r
DisplayError(buf, errno);\r
return FALSE;\r
} else {\r
if (positionNumber < 0) {\r
/* Negative position number means to seek to that byte offset */\r
if (fseek(f, -positionNumber, 0) == -1) {\r
- DisplayError("Can't seek on position file", 0);\r
+ DisplayError(_("Can't seek on position file"), 0);\r
return FALSE;\r
};\r
pn = 1;\r
positionNumber == 1) {\r
pn = 1;\r
} else {\r
- DisplayError("Can't seek on position file", 0);\r
+ DisplayError(_("Can't seek on position file"), 0);\r
return FALSE;\r
}\r
}\r
}\r
/* See if this file is FEN or old-style xboard */\r
if (fgets(line, MSG_SIZ, f) == NULL) {\r
- DisplayError("Position not found in file", 0);\r
+ DisplayError(_("Position not found in file"), 0);\r
return FALSE;\r
}\r
#if 0\r
/* skip positions before number pn */\r
if (fgets(line, MSG_SIZ, f) == NULL) {\r
Reset(TRUE, TRUE);\r
- DisplayError("Position not found in file", 0);\r
+ DisplayError(_("Position not found in file"), 0);\r
return FALSE;\r
}\r
if (fenMode || line[0] == '#') pn--;\r
\r
if (fenMode) {\r
if (!ParseFEN(initial_position, &blackPlaysFirst, line)) {\r
- DisplayError("Bad FEN position in file", 0);\r
+ DisplayError(_("Bad FEN position in file"), 0);\r
return FALSE;\r
}\r
} else {\r
strcpy(moveList[0], "");\r
strcpy(parseList[0], "");\r
CopyBoard(boards[1], initial_position);\r
- DisplayMessage("", "Black to play");\r
+ DisplayMessage("", _("Black to play"));\r
} else {\r
currentMove = forwardMostMove = backwardMostMove = 0;\r
- DisplayMessage("", "White to play");\r
+ DisplayMessage("", _("White to play"));\r
}\r
/* [HGM] copy FEN attributes as well */\r
{ int i;\r
} else {\r
f = fopen(filename, append ? "a" : "w");\r
if (f == NULL) {\r
- sprintf(buf, "Can't open \"%s\"", filename);\r
+ sprintf(buf, _("Can't open \"%s\""), filename);\r
DisplayError(buf, errno);\r
return FALSE;\r
} else {\r
{\r
int i, offset, linelen, newblock;\r
time_t tm;\r
- char *movetext;\r
+// char *movetext;\r
char numtext[32];\r
int movelen, numlen, blank;\r
char move_buffer[100]; /* [AS] Buffer for move+PV info */\r
#else\r
seconds = (pvInfoList[i].time + 5)/10; // [HGM] PVtime: use engine time\r
#endif\r
- if (appData.debugMode,0) {\r
- fprintf(debugFP, "times = %d %d %d %d, seconds=%d\n",\r
- timeRemaining[0][i+1], timeRemaining[0][i],\r
- timeRemaining[1][i+1], timeRemaining[1][i], seconds\r
- );\r
- }\r
\r
if( seconds <= 0) buf[0] = 0; else\r
if( seconds < 30 ) sprintf(buf, " %3.1f%c", seconds/10., 0); else {\r
} else {\r
f = fopen(filename, "a");\r
if (f == NULL) {\r
- sprintf(buf, "Can't open \"%s\"", filename);\r
+ sprintf(buf, _("Can't open \"%s\""), filename);\r
DisplayError(buf, errno);\r
return FALSE;\r
} else {\r
}\r
\r
if (cmailOldMove == -1) {\r
- DisplayError("You have edited the game history.\nUse Reload Same Game and make your move again.", 0);\r
+ DisplayError(_("You have edited the game history.\nUse Reload Same Game and make your move again."), 0);\r
return FALSE;\r
}\r
\r
if (currentMove > cmailOldMove + 1) {\r
- DisplayError("You have entered too many moves.\nBack up to the correct position and try again.", 0);\r
+ DisplayError(_("You have entered too many moves.\nBack up to the correct position and try again."), 0);\r
return FALSE;\r
}\r
\r
if (currentMove < cmailOldMove) {\r
- DisplayError("Displayed position is not current.\nStep forward to the correct position and try again.", 0);\r
+ DisplayError(_("Displayed position is not current.\nStep forward to the correct position and try again."), 0);\r
return FALSE;\r
}\r
\r
cmailMoveRegistered[lastLoadGameNumber - 1] = TRUE;\r
nCmailMovesRegistered ++;\r
} else if (nCmailGames == 1) {\r
- DisplayError("You have not made a move yet", 0);\r
+ DisplayError(_("You have not made a move yet"), 0);\r
return FALSE;\r
}\r
\r
char *arcDir;\r
\r
if (! cmailMsgLoaded) {\r
- DisplayError("The cmail message is not loaded.\nUse Reload CMail Message and make your move again.", 0);\r
+ DisplayError(_("The cmail message is not loaded.\nUse Reload CMail Message and make your move again."), 0);\r
return;\r
}\r
\r
if (nCmailGames == nCmailResults) {\r
- DisplayError("No unfinished games", 0);\r
+ DisplayError(_("No unfinished games"), 0);\r
return;\r
}\r
\r
#if CMAIL_PROHIBIT_REMAIL\r
if (cmailMailedMove) {\r
- sprintf(msg, "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line.", appData.cmailGameName);\r
+ sprintf(msg, _("You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line."), appData.cmailGameName);\r
DisplayError(msg, 0);\r
return;\r
}\r
|| (nCmailMovesRegistered + nCmailResults == nCmailGames)) {\r
sprintf(string, partCommandString,\r
appData.debugMode ? " -v" : "", appData.cmailGameName);\r
- commandOutput = popen(string, "rb");\r
+ commandOutput = popen(string, "r");\r
\r
if (commandOutput == NULL) {\r
- DisplayError("Failed to invoke cmail", 0);\r
+ DisplayError(_("Failed to invoke cmail"), 0);\r
} else {\r
for (nBuffers = 0; (! feof(commandOutput)); nBuffers ++) {\r
nBytes = fread(buffer, 1, MSG_SIZ - 1, commandOutput);\r
if (!cmailMsgLoaded) return "";\r
\r
if (cmailMailedMove) {\r
- sprintf(cmailMsg, "Waiting for reply from opponent\n");\r
+ sprintf(cmailMsg, _("Waiting for reply from opponent\n"));\r
} else {\r
/* Create a list of games left */\r
sprintf(string, "[");\r
switch (nCmailGames) {\r
case 1:\r
sprintf(cmailMsg,\r
- "Still need to make move for game\n");\r
+ _("Still need to make move for game\n"));\r
break;\r
\r
case 2:\r
sprintf(cmailMsg,\r
- "Still need to make moves for both games\n");\r
+ _("Still need to make moves for both games\n"));\r
break;\r
\r
default:\r
sprintf(cmailMsg,\r
- "Still need to make moves for all %d games\n",\r
+ _("Still need to make moves for all %d games\n"),\r
nCmailGames);\r
break;\r
}\r
switch (nCmailGames - nCmailMovesRegistered - nCmailResults) {\r
case 1:\r
sprintf(cmailMsg,\r
- "Still need to make a move for game %s\n",\r
+ _("Still need to make a move for game %s\n"),\r
string);\r
break;\r
\r
case 0:\r
if (nCmailResults == nCmailGames) {\r
- sprintf(cmailMsg, "No unfinished games\n");\r
+ sprintf(cmailMsg, _("No unfinished games\n"));\r
} else {\r
- sprintf(cmailMsg, "Ready to send mail\n");\r
+ sprintf(cmailMsg, _("Ready to send mail\n"));\r
}\r
break;\r
\r
default:\r
sprintf(cmailMsg,\r
- "Still need to make moves for games %s\n",\r
+ _("Still need to make moves for games %s\n"),\r
string);\r
}\r
}\r
char title[MSG_SIZ];\r
\r
if (currentMove < 1 || parseList[currentMove - 1][0] == NULLCHAR) {\r
- strcpy(title, "Edit comment");\r
+ strcpy(title, _("Edit comment"));\r
} else {\r
- sprintf(title, "Edit comment on %d.%s%s", (currentMove - 1) / 2 + 1,\r
+ sprintf(title, _("Edit comment on %d.%s%s"), (currentMove - 1) / 2 + 1,\r
WhiteOnMove(currentMove - 1) ? " " : ".. ",\r
parseList[currentMove - 1]);\r
}\r
return;\r
\r
if (gameMode != AnalyzeFile) {\r
- EditGameEvent();\r
- if (gameMode != EditGame) return;\r
+ if (!appData.icsEngineAnalyze) {\r
+ EditGameEvent();\r
+ if (gameMode != EditGame) return;\r
+ }\r
ResurrectChessProgram();\r
SendToProgram("analyze\n", &first);\r
first.analyzing = TRUE;\r
/*first.maybeThinking = TRUE;*/\r
first.maybeThinking = FALSE; /* avoid killing GNU Chess */\r
- AnalysisPopUp("Analysis",\r
- "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis.");\r
+ AnalysisPopUp(_("Analysis"),\r
+ _("Starting analysis mode...\nIf this message stays up, your chess program does not support analysis."));\r
}\r
- gameMode = AnalyzeMode;\r
+ if (!appData.icsEngineAnalyze) gameMode = AnalyzeMode;\r
pausing = FALSE;\r
ModeHighlight();\r
SetGameInfo();\r
first.analyzing = TRUE;\r
/*first.maybeThinking = TRUE;*/\r
first.maybeThinking = FALSE; /* avoid killing GNU Chess */\r
- AnalysisPopUp("Analysis",\r
- "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis.");\r
+ AnalysisPopUp(_("Analysis"),\r
+ _("Starting analysis mode...\nIf this message stays up, your chess program does not support analysis."));\r
}\r
gameMode = AnalyzeFile;\r
pausing = FALSE;\r
EditPositionDone();\r
\r
if (!WhiteOnMove(currentMove)) {\r
- DisplayError("It is not White's turn", 0);\r
+ DisplayError(_("It is not White's turn"), 0);\r
return;\r
}\r
\r
if(bookHit) { // [HGM] book: simulate book reply\r
static char bookMove[MSG_SIZ]; // a bit generous?\r
\r
- programStats.depth = programStats.nodes = programStats.time = \r
+ programStats.nodes = programStats.depth = programStats.time = \r
programStats.score = programStats.got_only_move = 0;\r
sprintf(programStats.movelist, "%s (xbook)", bookHit);\r
\r
EditPositionDone();\r
\r
if (WhiteOnMove(currentMove)) {\r
- DisplayError("It is not Black's turn", 0);\r
+ DisplayError(_("It is not Black's turn"), 0);\r
return;\r
}\r
\r
if(bookHit) { // [HGM] book: simulate book reply\r
static char bookMove[MSG_SIZ]; // a bit generous?\r
\r
- programStats.depth = programStats.nodes = programStats.time = \r
+ programStats.nodes = programStats.depth = programStats.time = \r
programStats.score = programStats.got_only_move = 0;\r
sprintf(programStats.movelist, "%s (xbook)", bookHit);\r
\r
case MachinePlaysWhite:\r
case MachinePlaysBlack:\r
if (WhiteOnMove(forwardMostMove) == (gameMode == MachinePlaysWhite)) {\r
- DisplayError("Wait until your turn,\nor select Move Now", 0);\r
+ DisplayError(_("Wait until your turn,\nor select Move Now"), 0);\r
return;\r
}\r
/* fall through */\r
} else {\r
/* kludge: allow timeout for initial "feature" command */\r
FreezeUI();\r
- DisplayMessage("", "Starting second chess program");\r
+ DisplayMessage("", _("Starting second chess program"));\r
ScheduleDelayedEvent(TwoMachinesEventIfReady, FEATURE_TIMEOUT);\r
}\r
return;\r
if(bookHit) { // [HGM] book: simulate book reply\r
static char bookMove[MSG_SIZ]; // a bit generous?\r
\r
- programStats.depth = programStats.nodes = programStats.time = \r
+ programStats.nodes = programStats.depth = programStats.time = \r
programStats.score = programStats.got_only_move = 0;\r
sprintf(programStats.movelist, "%s (xbook)", bookHit);\r
\r
if (gameMode == Training) {\r
SetTrainingModeOff();\r
gameMode = PlayFromGameFile;\r
- DisplayMessage("", "Training mode off");\r
+ DisplayMessage("", _("Training mode off"));\r
} else {\r
gameMode = Training;\r
animateTraining = appData.animate;\r
/* make sure we are not already at the end of the game */\r
if (currentMove < forwardMostMove) {\r
SetTrainingModeOn();\r
- DisplayMessage("", "Training mode on");\r
+ DisplayMessage("", _("Training mode on"));\r
} else {\r
gameMode = PlayFromGameFile;\r
- DisplayError("Already at end of game", 0);\r
+ DisplayError(_("Already at end of game"), 0);\r
}\r
}\r
ModeHighlight();\r
break;\r
case IcsPlayingBlack:\r
case IcsPlayingWhite:\r
- DisplayError("Warning: You are still playing a game", 0);\r
+ DisplayError(_("Warning: You are still playing a game"), 0);\r
break;\r
case IcsObserving:\r
- DisplayError("Warning: You are still observing a game", 0);\r
+ DisplayError(_("Warning: You are still observing a game"), 0);\r
break;\r
case IcsExamining:\r
- DisplayError("Warning: You are still examining a game", 0);\r
+ DisplayError(_("Warning: You are still examining a game"), 0);\r
break;\r
case IcsIdle:\r
break;\r
void\r
ExitAnalyzeMode()\r
{\r
+ /* [DM] icsEngineAnalyze - possible call from other functions */\r
+ if (appData.icsEngineAnalyze) {\r
+ appData.icsEngineAnalyze = FALSE;\r
+\r
+ DisplayMessage("",_("Close ICS engine analyze..."));\r
+ }\r
if (first.analysisSupport && first.analyzing) {\r
SendToProgram("exit\n", &first);\r
first.analyzing = FALSE;\r
case IcsPlayingWhite:\r
case MachinePlaysBlack:\r
if (!WhiteOnMove(currentMove)) {\r
- DisplayMoveError("It is Black's turn");\r
+ DisplayMoveError(_("It is Black's turn"));\r
return;\r
}\r
moveType = WhiteDrop;\r
case IcsPlayingBlack:\r
case MachinePlaysWhite:\r
if (WhiteOnMove(currentMove)) {\r
- DisplayMoveError("It is White's turn");\r
+ DisplayMoveError(_("It is White's turn"));\r
return;\r
}\r
moveType = BlackDrop;\r
+ (int) BlackPawn - (int) WhitePawn);\r
}\r
if (boards[currentMove][y][x] != EmptySquare) {\r
- DisplayMoveError("That square is occupied");\r
+ DisplayMoveError(_("That square is occupied"));\r
return;\r
}\r
\r
GameEnds(GameIsDrawn, "Draw agreed", GE_PLAYER);\r
cmailMoveType[lastLoadGameNumber - 1] = CMAIL_ACCEPT;\r
} else {\r
- DisplayError("There is no pending offer on this move", 0);\r
+ DisplayError(_("There is no pending offer on this move"), 0);\r
cmailMoveType[lastLoadGameNumber - 1] = CMAIL_MOVE;\r
}\r
} else {\r
DisplayComment(cmailOldMove - 1, "Draw declined");\r
#endif /*NOTDEF*/\r
} else {\r
- DisplayError("There is no pending offer on this move", 0);\r
+ DisplayError(_("There is no pending offer on this move"), 0);\r
}\r
} else {\r
/* Not used for offers from chess program */\r
else\r
GameEnds(BlackWins, "Black wins on time", GE_PLAYER);\r
} else {\r
- DisplayError("Your opponent is not out of time", 0);\r
+ DisplayError(_("Your opponent is not out of time"), 0);\r
}\r
break;\r
case MachinePlaysBlack:\r
else\r
GameEnds(WhiteWins, "White wins on time", GE_PLAYER);\r
} else {\r
- DisplayError("Your opponent is not out of time", 0);\r
+ DisplayError(_("Your opponent is not out of time"), 0);\r
}\r
break;\r
}\r
DisplayComment(currentMove - 1, offer);\r
cmailMoveType[lastLoadGameNumber - 1] = CMAIL_DRAW;\r
} else {\r
- DisplayError("You must make your move before offering a draw", 0);\r
+ DisplayError(_("You must make your move before offering a draw"), 0);\r
cmailMoveType[lastLoadGameNumber - 1] = CMAIL_MOVE;\r
}\r
} else if (first.offeredDraw) {\r
RevertEvent()\r
{\r
if (gameMode != IcsExamining) {\r
- DisplayError("You are not examining a game", 0);\r
+ DisplayError(_("You are not examining a game"), 0);\r
return;\r
}\r
if (pausing) {\r
- DisplayError("You can't revert while pausing", 0);\r
+ DisplayError(_("You can't revert while pausing"), 0);\r
return;\r
}\r
SendToICS(ics_prefix);\r
case MachinePlaysWhite:\r
case MachinePlaysBlack:\r
if (WhiteOnMove(forwardMostMove) == (gameMode == MachinePlaysWhite)) {\r
- DisplayError("Wait until your turn,\nor select Move Now", 0);\r
+ DisplayError(_("Wait until your turn,\nor select Move Now"), 0);\r
return;\r
}\r
if (forwardMostMove < 2) return;\r
switch (gameMode) {\r
case MachinePlaysWhite:\r
if (!WhiteOnMove(forwardMostMove)) {\r
- DisplayError("It is your turn", 0);\r
+ DisplayError(_("It is your turn"), 0);\r
return;\r
}\r
cps = &first;\r
break;\r
case MachinePlaysBlack:\r
if (WhiteOnMove(forwardMostMove)) {\r
- DisplayError("It is your turn", 0);\r
+ DisplayError(_("It is your turn"), 0);\r
return;\r
}\r
cps = &first;\r
switch (gameMode) {\r
case MachinePlaysWhite:\r
if (WhiteOnMove(forwardMostMove)) {\r
- DisplayError("Wait until your turn", 0);\r
+ DisplayError(_("Wait until your turn"), 0);\r
return;\r
}\r
break;\r
case BeginningOfGame:\r
case MachinePlaysBlack:\r
if (!WhiteOnMove(forwardMostMove)) {\r
- DisplayError("Wait until your turn", 0);\r
+ DisplayError(_("Wait until your turn"), 0);\r
return;\r
}\r
break;\r
default:\r
- DisplayError("No hint available", 0);\r
+ DisplayError(_("No hint available"), 0);\r
return;\r
}\r
SendToProgram("hint\n", &first);\r
switch (gameMode) {\r
case MachinePlaysWhite:\r
if (WhiteOnMove(forwardMostMove)) {\r
- DisplayError("Wait until your turn", 0);\r
+ DisplayError(_("Wait until your turn"), 0);\r
return;\r
}\r
break;\r
case BeginningOfGame:\r
case MachinePlaysBlack:\r
if (!WhiteOnMove(forwardMostMove)) {\r
- DisplayError("Wait until your turn", 0);\r
+ DisplayError(_("Wait until your turn"), 0);\r
return;\r
}\r
break;\r
outCount = OutputToProcess(cps->pr, message, count, &error);\r
if (outCount < count && !exiting \r
&& !endingGame) { /* [HGM] crash: to not hang GameEnds() writing to deceased engines */\r
- sprintf(buf, "Error writing to %s chess program", cps->which);\r
+ sprintf(buf, _("Error writing to %s chess program"), cps->which);\r
if(gameInfo.resultDetails==NULL) { /* [HGM] crash: if game in progress, give reason for abort */\r
if(epStatus[forwardMostMove] <= EP_DRAWS) {\r
gameInfo.result = GameIsDrawn; /* [HGM] accept exit as draw claim */\r
if (count <= 0) {\r
if (count == 0) {\r
sprintf(buf,\r
- "Error: %s chess program (%s) exited unexpectedly",\r
+ _("Error: %s chess program (%s) exited unexpectedly"),\r
cps->which, cps->program);\r
if(gameInfo.resultDetails==NULL) { /* [HGM] crash: if game in progress, give reason for abort */\r
if(epStatus[forwardMostMove] <= EP_DRAWS) {\r
gameInfo.result = GameIsDrawn; /* [HGM] accept exit as draw claim */\r
- sprintf(buf, "%s program exits in draw position (%s)", cps->which, cps->program);\r
+ sprintf(buf, _("%s program exits in draw position (%s)"), cps->which, cps->program);\r
} else {\r
gameInfo.result = cps->twoMachinesColor[0]=='w' ? BlackWins : WhiteWins;\r
}\r
DisplayFatalError(buf, 0, 1);\r
} else {\r
sprintf(buf,\r
- "Error reading from %s chess program (%s)",\r
+ _("Error reading from %s chess program (%s)"),\r
cps->which, cps->program);\r
RemoveInputSource(cps->isr);\r
\r
message);\r
}\r
}\r
+\r
+ /* [DM] if icsEngineAnalyze is active we block all whisper and kibitz output, because nobody want to see this */\r
+ if (appData.icsEngineAnalyze) {\r
+ if (strstr(message, "whisper") != NULL ||\r
+ strstr(message, "kibitz") != NULL || \r
+ strstr(message, "tellics") != NULL) return;\r
+ }\r
+\r
HandleMachineMove(message, cps);\r
}\r
\r
opt->type = SaveButton;\r
} else return FALSE;\r
*p = 0; // terminate option name\r
+ // now look if the command-line options define a setting for this engine option.\r
+ p = strstr(cps->optionSettings, opt->name);\r
+ if(p == cps->optionSettings || p[-1] == ',') {\r
+ sprintf(buf, "option %s", p);\r
+ if(p = strstr(buf, ",")) *p = 0;\r
+ strcat(buf, "\n");\r
+ SendToProgram(buf, cps);\r
+ }\r
return TRUE;\r
}\r
\r
char res[MSG_SIZ];\r
char cpThinkOutput[MSG_SIZ];\r
\r
+ if(appData.noGUI) return; // [HGM] fast: suppress display of moves\r
+ \r
if (moveNumber == forwardMostMove - 1 || \r
gameMode == AnalyzeMode || gameMode == AnalyzeFile) {\r
\r
} else {\r
res[0] = NULLCHAR;\r
}\r
- \r
+\r
if (moveNumber < 0 || parseList[moveNumber][0] == NULLCHAR) {\r
DisplayMessage(res, cpThinkOutput);\r
} else {\r
{\r
char buf[MSG_SIZ];\r
\r
- if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {\r
+ if (gameMode == AnalyzeMode || gameMode == AnalyzeFile \r
+ || appData.icsEngineAnalyze) {\r
sprintf(buf, "Analysis (%s)", first.tidy);\r
AnalysisPopUp(buf, text);\r
}\r
} else {\r
safeStrCpy( lst, programStats.movelist, sizeof(lst));\r
\r
- nps = (((double)programStats.nodes) /\r
- (((double)programStats.time)/100.0));\r
+ nps = (u64ToDouble(programStats.nodes) /\r
+ ((double)programStats.time /100.0));\r
\r
cs = programStats.time % 100;\r
s = programStats.time / 100;\r
\r
if (programStats.moves_left > 0 && appData.periodicUpdates) {\r
if (programStats.move_name[0] != NULLCHAR) {\r
- sprintf(buf, "depth=%d %d/%d(%s) %+.2f %s%s\nNodes: %lu NPS: %d\nTime: %02d:%02d:%02d.%02d",\r
+ sprintf(buf, "depth=%d %d/%d(%s) %+.2f %s%s\nNodes: " u64Display " NPS: %d\nTime: %02d:%02d:%02d.%02d",\r
programStats.depth,\r
programStats.nr_moves-programStats.moves_left,\r
programStats.nr_moves, programStats.move_name,\r
((float)programStats.score)/100.0, lst,\r
only_one_move(lst)?\r
xtra[programStats.got_fail] : "",\r
- programStats.nodes, (int)nps, h, m, s, cs);\r
+ (u64)programStats.nodes, (int)nps, h, m, s, cs);\r
} else {\r
- sprintf(buf, "depth=%d %d/%d %+.2f %s%s\nNodes: %lu NPS: %d\nTime: %02d:%02d:%02d.%02d",\r
+ sprintf(buf, "depth=%d %d/%d %+.2f %s%s\nNodes: " u64Display " NPS: %d\nTime: %02d:%02d:%02d.%02d",\r
programStats.depth,\r
programStats.nr_moves-programStats.moves_left,\r
programStats.nr_moves, ((float)programStats.score)/100.0,\r
lst,\r
only_one_move(lst)?\r
xtra[programStats.got_fail] : "",\r
- programStats.nodes, (int)nps, h, m, s, cs);\r
+ (u64)programStats.nodes, (int)nps, h, m, s, cs);\r
}\r
} else {\r
- sprintf(buf, "depth=%d %+.2f %s%s\nNodes: %lu NPS: %d\nTime: %02d:%02d:%02d.%02d",\r
+ sprintf(buf, "depth=%d %+.2f %s%s\nNodes: " u64Display " NPS: %d\nTime: %02d:%02d:%02d.%02d",\r
programStats.depth,\r
((float)programStats.score)/100.0,\r
lst,\r
only_one_move(lst)?\r
xtra[programStats.got_fail] : "",\r
- programStats.nodes, (int)nps, h, m, s, cs);\r
+ (u64)programStats.nodes, (int)nps, h, m, s, cs);\r
}\r
}\r
DisplayAnalysisText(buf);\r
}\r
} else {\r
if (blackFlag) {\r
- if(gameMode != TwoMachinesPlay) DisplayTitle("Both flags fell");\r
+ if(gameMode != TwoMachinesPlay) DisplayTitle(_("Both flags fell"));\r
} else {\r
- if(gameMode != TwoMachinesPlay) DisplayTitle("White's flag fell");\r
+ if(gameMode != TwoMachinesPlay) DisplayTitle(_("White's flag fell"));\r
if (appData.autoCallFlag) {\r
GameEnds(BlackWins, "Black wins on time", GE_XBOARD);\r
return TRUE;\r
}\r
} else {\r
if (whiteFlag) {\r
- if(gameMode != TwoMachinesPlay) DisplayTitle("Both flags fell");\r
+ if(gameMode != TwoMachinesPlay) DisplayTitle(_("Both flags fell"));\r
} else {\r
- if(gameMode != TwoMachinesPlay) DisplayTitle("Black's flag fell");\r
+ if(gameMode != TwoMachinesPlay) DisplayTitle(_("Black's flag fell"));\r
if (appData.autoCallFlag) {\r
GameEnds(WhiteWins, "White wins on time", GE_XBOARD);\r
return TRUE;\r
you have neither ftime nor gettimeofday.\r
*/\r
\r
+/* VS 2008 requires the #include outside of the function */\r
+#if !HAVE_GETTIMEOFDAY && HAVE_FTIME\r
+#include <sys/timeb.h>\r
+#endif\r
+\r
/* Get the current time as a TimeMark */\r
void\r
GetTimeMark(tm)\r
#else /*!HAVE_GETTIMEOFDAY*/\r
#if HAVE_FTIME\r
\r
-#include <sys/timeb.h>\r
+// include <sys/timeb.h> / moved to just above start of function\r
struct timeb timeB;\r
\r
ftime(&timeB);\r
Board initial_position;\r
\r
if (!ParseFEN(initial_position, &blackPlaysFirst, fen)) {\r
- DisplayError("Bad FEN position in clipboard", 0);\r
+ DisplayError(_("Bad FEN position in clipboard"), 0);\r
return ;\r
} else {\r
int savedBlackPlaysFirst = blackPlaysFirst;\r