# define _(s) gettext (s)
# define N_(s) gettext_noop (s)
#else
-# define _(s) (s)
+# ifdef WIN32
+# define _(s) T_(s)
+# undef ngettext
+# define ngettext(s,p,n) T_(p)
+# else
+# define _(s) (s)
+# endif
# define N_(s) s
#endif
char * hint;
int an_move_index;
int an_move_count;
+ int moveKey;
} EngineOutputData;
// called by other front-end
static char header[MSG_SIZ];
#define MAX_VAR 400
-static int scores[MAX_VAR], textEnd[MAX_VAR], curDepth[2], nrVariations[2];
+static int scores[MAX_VAR], textEnd[MAX_VAR], keys[MAX_VAR], curDepth[2], nrVariations[2];
extern int initialRulePlies;
count = currentMove - count;
if(!rule) rule = 100;
if(count >= rule - 40 && (!appData.icsActive || gameMode == IcsObserving)) {
- snprintf(buf, MSG_SIZ, _("%s (%d reversible plies)"), title, count);
+ snprintf(buf, MSG_SIZ, ngettext("%s (%d reversible ply)", "%s (%d reversible plies)", count), title, count);
safeStrCpy(title, buf, MSG_SIZ);
}
if(!strcmp(oldTitle, title)) return;
EngineOutputData ed;
int clearMemo = FALSE;
int which, depth, multi;
+ ChessMove moveType;
+ int ff, ft, rf, rt;
+ char pc;
if( stats == 0 ) {
SetEngineState( 0, STATE_IDLE, "" );
if( clearMemo ) {
DoClearMemo(which); nrVariations[which] = 0;
header[0] = NULLCHAR;
- if(gameMode == AnalyzeMode && (multi = MultiPV(&first)) >= 0) {
+ if(gameMode == AnalyzeMode) {
+ if((multi = MultiPV(&first)) >= 0) {
snprintf(header, MSG_SIZ, "\t%s viewpoint\t\tfewer / Multi-PV setting = %d / more\n",
appData.whitePOV || appData.scoreWhite ? "white" : "mover", first.option[multi].value);
- InsertIntoMemo( which, header, 0);
+ }
+ snprintf(header+strlen(header), MSG_SIZ-strlen(header), "%s", exclusionHeader);
+ InsertIntoMemo( which, header, 0);
} else
if(appData.ponderNextMove && lastLine[which][0]) {
InsertIntoMemo( which, lastLine[which], 0 );
}
}
+ if(ed.pv && ed.pv[0] && ParseOneMove(ed.pv, currentMove, &moveType, &ff, &rf, &ft, &rt, &pc))
+ ed.moveKey = (ff<<24 | rf << 16 | ft << 8 | rt) ^ pc*87161;
+ else ed.moveKey = ed.nodes; // kludge to get unique key unlikely to match any move
+
/* Update */
lastDepth[which] = depth == 1 && ed.nodes == 0 ? 0 : depth; // [HGM] info-line kudge
lastForwardMostMove[which] = forwardMostMove;
offs = textEnd[i+n];
textEnd[i+n+2] = offs + len;
scores[i+n+2] = newScore;
- if(newScore < scores[i+n]) break;
+ keys[i+n+2] = ed->moveKey;
+ if(ed->moveKey != keys[i+n] && // same move always tops previous one (as a higher score must be a fail low)
+ newScore < scores[i+n]) break;
// if it had higher score as previous, move previous in stead
scores[i+n+2] = scores[i+n];
textEnd[i+n+2] = textEnd[i+n] + len;
+ keys[i+n+2] = keys[i+n];
}
if(i<0) {
offs = 0;
unsigned long nps_100 = ed->nodes / ed->time;
if( nps_100 < 100000 ) {
- snprintf( s_label, sizeof(s_label)/sizeof(s_label[0]), "NPS: %lu", nps_100 * 100 );
+ snprintf( s_label, sizeof(s_label)/sizeof(s_label[0]), "%s: %lu", _("NPS"), nps_100 * 100 );
}
else {
- snprintf( s_label, sizeof(s_label)/sizeof(s_label[0]), "NPS: %.1fk", nps_100 / 10.0 );
+ snprintf( s_label, sizeof(s_label)/sizeof(s_label[0]), "%s: %.1fk", _("NPS"), nps_100 / 10.0 );
}
}