void InitBackEnd3 P((void));
void FeatureDone P((ChessProgramState* cps, int val));
void InitChessProgram P((ChessProgramState *cps));
+double u64ToDouble P((u64 value));
#ifdef WIN32
extern void ConsoleCreate();
#endif
+
extern int tinyLayout, smallLayout;
static ChessProgramStats programStats;
#define TN_SGA 0003
#define TN_PORT 23
+/* Some compiler can't cast u64 to double
+ * This function do the job for us:
+
+ * We use the highest bit for cast, this only
+ * works if the highest bit is not
+ * in use (This should not happen)
+ *
+ * We used this for all compiler
+ */
+double
+u64ToDouble(u64 value)
+{
+ double r;
+ u64 tmp = value & 0x7fffffffffffffff;
+ r = (double)(s64)tmp;
+ if (value & 0x8000000000000000)
+ r += 9.2233720368547758080e18; /* 2^63 */
+ return r;
+}
+
/* Fake up flags for now, as we aren't keeping track of castling
availability yet */
int
char *string;
{
GameMode newGameMode;
- int gamenum, newGame, newMove, relation, basetime, increment, ics_flip = 0;
- int j, k, n, moveNum, white_stren, black_stren, white_time, black_time;
+ int gamenum, newGame, newMove, relation, basetime, increment, ics_flip = 0, i;
+ int j, k, n, moveNum, white_stren, black_stren, white_time, black_time, takeback;
int double_push, castle_ws, castle_wl, castle_bs, castle_bl, irrev_count;
char to_play, board_chars[72];
char move_str[500], str[500], elapsed_time[500];
/* Forget the old game and get the history (if any) of the new one */
if (gameMode != BeginningOfGame) {
- Reset(FALSE, TRUE);
+ Reset(FALSE, TRUE);
}
newGame = TRUE;
if (appData.autoRaiseBoard) BoardToTop();
/* Update currentMove and known move number limits */
newMove = newGame || moveNum > forwardMostMove;
+
+ /* If we found takebacks during icsEngineAnalyze
+ try send to engine */
+ if (!newGame && appData.icsEngineAnalyze && moveNum < forwardMostMove) {
+ takeback = forwardMostMove - moveNum;
+ for (i = 0; i < takeback; i++) {
+ if (appData.debugMode) fprintf(debugFP, "take back move\n");
+ SendToProgram("undo\n", &first);
+ }
+ }
if (newGame) {
forwardMostMove = backwardMostMove = currentMove = moveNum;
if (gameMode == IcsExamining && moveNum == 0) {
break;
case AnalyzeMode:
case AnalyzeFile:
+ /* icsEngineAnalyze */
+ case IcsObserving:
+ if (!appData.icsEngineAnalyze) ignore = TRUE;
break;
case TwoMachinesPlay:
if ((cps->twoMachinesColor[0] == 'w') !=
prefixHint ? lastHint : "",
prefixHint ? " " : "", buf1);
- if (currentMove == forwardMostMove ||
- gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
+ if (currentMove == forwardMostMove || gameMode == AnalyzeMode
+ || gameMode == AnalyzeFile || appData.icsEngineAnalyze) {
DisplayMove(currentMove - 1);
DisplayAnalysis();
}
programStats.line_is_book = 1;
if (currentMove == forwardMostMove || gameMode==AnalyzeMode ||
- gameMode == AnalyzeFile) {
+ gameMode == AnalyzeFile || appData.icsEngineAnalyze) {
DisplayMove(currentMove - 1);
DisplayAnalysis();
}
strcat(programStats.movelist, " ");
strcat(programStats.movelist, p);
if (currentMove == forwardMostMove || gameMode==AnalyzeMode ||
- gameMode == AnalyzeFile) {
+ gameMode == AnalyzeFile || appData.icsEngineAnalyze) {
DisplayMove(currentMove - 1);
DisplayAnalysis();
}
timeRemaining[1][currentMove] = blackTimeRemaining;
}
- if ((gameMode == AnalyzeMode || gameMode == AnalyzeFile) &&
- first.analysisSupport) {
+ if ((gameMode == AnalyzeMode || gameMode == AnalyzeFile ||
+ appData.icsEngineAnalyze) && first.analysisSupport) {
SendToProgram("analyze\n", &first);
first.analyzing = TRUE;
}
return;
if (gameMode != AnalyzeFile) {
- EditGameEvent();
- if (gameMode != EditGame) return;
+ if (!appData.icsEngineAnalyze) {
+ EditGameEvent();
+ if (gameMode != EditGame) return;
+ }
ResurrectChessProgram();
SendToProgram("analyze\n", &first);
first.analyzing = TRUE;
AnalysisPopUp(_("Analysis"),
_("Starting analysis mode...\nIf this message stays up, your chess program does not support analysis."));
}
- gameMode = AnalyzeMode;
+ if (!appData.icsEngineAnalyze) gameMode = AnalyzeMode;
pausing = FALSE;
ModeHighlight();
SetGameInfo();
void
ExitAnalyzeMode()
{
+ /* icsEngineAnalyze - possible call from other functions */
+ if (appData.icsEngineAnalyze)
+ appData.icsEngineAnalyze = FALSE;
+
if (first.analysisSupport && first.analyzing) {
SendToProgram("exit\n", &first);
first.analyzing = FALSE;
SubtractTimeMarks(&now, &programStartTime),
cps->which, message);
}
- HandleMachineMove(message, cps);
+ /* if icsEngineAnalyze is active we block all
+ whisper and kibitz output, because nobody want
+ see this
+ */
+ if (appData.icsEngineAnalyze) {
+ if (strstr(message, "whisper") != NULL ||
+ strstr(message, "kibitz") != NULL ||
+ strstr(message, "tellics") != NULL) return;
+ HandleMachineMove(message, cps);
+ } else {
+ HandleMachineMove(message, cps);
+ }
}
{
char buf[MSG_SIZ];
- if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
+ if (gameMode == AnalyzeMode || gameMode == AnalyzeFile
+ || appData.icsEngineAnalyze) {
sprintf(buf, "Analysis (%s)", first.tidy);
AnalysisPopUp(buf, text);
}
if (programStats.got_only_move) {
strcpy(buf, programStats.movelist);
} else {
- nps = (((u64)programStats.nodes) /
- (((double)programStats.time)/100.0));
+ nps = (u64ToDouble(programStats.nodes) /
+ ((double)programStats.time /100.0));
cs = programStats.time % 100;
s = programStats.time / 100;