X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=engineoutput.c;h=aa7cc49036700dce0fa95c3dbaef8e1cfed617b6;hb=1dd394828e09f931b000c93f872814082dd8e325;hp=a409f1924f375de64e7c042f6a365356fa936fa5;hpb=4e062d14429ed3a3a251c971690bade4c8cba946;p=xboard.git diff --git a/engineoutput.c b/engineoutput.c index a409f19..aa7cc49 100644 --- a/engineoutput.c +++ b/engineoutput.c @@ -53,7 +53,13 @@ # 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 @@ -68,6 +74,7 @@ typedef struct { char * hint; int an_move_index; int an_move_count; + int moveKey; } EngineOutputData; // called by other front-end @@ -85,7 +92,7 @@ static char lastLine[2][MSG_SIZ]; 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; @@ -107,7 +114,7 @@ MakeEngineOutputTitle () 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; @@ -155,6 +162,9 @@ SetProgramStats (FrontEndProgramStats * stats) // now directly called by back-en 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, "" ); @@ -214,10 +224,13 @@ SetProgramStats (FrontEndProgramStats * stats) // now directly called by back-en 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 ); @@ -225,6 +238,10 @@ SetProgramStats (FrontEndProgramStats * stats) // now directly called by back-en } } + 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; @@ -389,10 +406,13 @@ InsertionPoint (int len, EngineOutputData *ed) 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; @@ -483,10 +503,10 @@ UpdateControls (EngineOutputData *ed) 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 ); } }