Let FENs handle Betza initial rights in castlingless variants
[xboard.git] / engineoutput.c
index 3e9da12..0bfd8b5 100644 (file)
@@ -231,11 +231,12 @@ SetProgramStats (FrontEndProgramStats * stats) // now directly called by back-en
         header[which][0] = NULLCHAR;
         if(gameMode == AnalyzeMode) {
           ChessProgramState *cps = (which ? &second : &first);
+          char *exclu = cps->excludeMoves ? exclusionHeader : "";
           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);
          }
-          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);
@@ -401,6 +402,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;
@@ -424,7 +433,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;
@@ -442,7 +451,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