Merge branch 'v4.8.x'
[xboard.git] / engineoutput.c
index 9a92dd0..ac1103e 100644 (file)
@@ -232,11 +232,14 @@ SetProgramStats (FrontEndProgramStats * stats) // now directly called by back-en
         header[which][0] = NULLCHAR;
         if(gameMode == AnalyzeMode) {
           ChessProgramState *cps = (which ? &second : &first);
-          if((multi = MultiPV(cps)) >= 0) {
-            snprintf(header[which], MSG_SIZ, "\t%s viewpoint\t\tfewer / Multi-PV setting = %d / more\n",
-                                       appData.whitePOV || appData.scoreWhite ? "white" : "mover", cps->option[multi].value);
+          char *exclu = cps->excludeMoves ? exclusionHeader : "";
+          if((multi = MultiPV(cps, 3)) != -1) {
+            char *s = "setting";
+            if(multi < -1) multi = -2 - multi, s = "margin";
+            snprintf(header[which], MSG_SIZ, "\t%s viewpoint\t\tfewer / Multi-PV %s = %d / more\n",
+                                       appData.whitePOV || appData.scoreWhite ? "white" : "mover", s, cps->option[multi].value);
          }
-          if(!which) snprintf(header[which]+strlen(header[which]), MSG_SIZ-strlen(header[which]), "%s%s", exclusionHeader, columnHeader);
+          if(!which) snprintf(header[which]+strlen(header[which]), MSG_SIZ-strlen(header[which]), "%s%s", exclu, columnHeader);
           InsertIntoMemo( which, header[which], 0);
         } else {
           snprintf(header[which], MSG_SIZ, "%s", columnHeader);
@@ -402,6 +405,14 @@ SetEngineColorIcon (int which)
 // [HGM] multivar: sort Thinking Output within one depth on score
 
 static int
+MateFlip (int n)
+{   // map mate-score to monotonous scale, so sorting compares them correctly
+    if(n >=  MATE_SCORE) return 2*MATE_SCORE - n;
+    if(n <= -MATE_SCORE) return -2*MATE_SCORE - n;
+    return n;
+}
+
+static int
 InsertionPoint (int len, EngineOutputData *ed)
 {
        int i, offs = 0, newScore = ed->score, n = ed->which;
@@ -425,7 +436,7 @@ InsertionPoint (int len, EngineOutputData *ed)
                keys[i+n+2] = ed->moveKey;
                fail[i+n+2] = failType;
                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] && fail[i+n] == ' ') break;
+                  MateFlip(newScore) < MateFlip(scores[i+n]) && fail[i+n] == ' ') break;
                // if it had higher score as previous, move previous in stead
                scores[i+n+2] = ed->moveKey == keys[i+n] ? newScore : scores[i+n]; // correct scores of fail-low/high searches
                textEnd[i+n+2] = textEnd[i+n] + len;
@@ -443,7 +454,6 @@ InsertionPoint (int len, EngineOutputData *ed)
       return offs + strlen(header[ed->which]);
 }
 
-#define MATE_SCORE 100000
 static char spaces[] = "            "; // [HGM] align: spaces for padding
 
 static void