X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=dc2972ca52d385c3588fad38ba216b27cca9a990;hb=f3a68fb378aa91c6e4b3f54fb875074888a07180;hp=bc35e345fb248bda07ea73482b6c73ed4812291d;hpb=3b417f05cba6e7b573d351790ef28cc2476fc407;p=xboard.git diff --git a/backend.c b/backend.c index bc35e34..dc2972c 100644 --- a/backend.c +++ b/backend.c @@ -448,9 +448,6 @@ long lastNodeCount=0; int shiftKey; // [HGM] set by mouse handler int have_sent_ICS_logon = 0; -int sending_ICS_login = 0; -int sending_ICS_password = 0; - int movesPerSession; int suddenDeath, whiteStartMove, blackStartMove; /* [HGM] for implementation of 'any per time' sessions, as in first part of byoyomi TC */ long whiteTimeRemaining, blackTimeRemaining, timeControl, timeIncrement, lastWhite, lastBlack; @@ -3116,17 +3113,10 @@ read_from_ics(isr, closure, data, count, error) if (!have_sent_ICS_logon && looking_at(buf, &i, "login:")) { ICSInitScript(); have_sent_ICS_logon = 1; - sending_ICS_password = 0; // in case we come back to login - sending_ICS_login = 1; continue; } - /* need to shadow the password */ - if (!sending_ICS_password && looking_at(buf, &i, "password:")) { - sending_ICS_password = 1; - continue; - } - - if (ics_getting_history != H_GETTING_MOVES /*smpos kludge*/ && + + if (ics_getting_history != H_GETTING_MOVES /*smpos kludge*/ && (looking_at(buf, &i, "\n<12> ") || looking_at(buf, &i, "<12> "))) { loggedOn = TRUE; @@ -5001,6 +4991,9 @@ fprintf(debugFP,"parsePV: %d %c%c%c%c yy='%s'\nPV = '%s'\n", valid, fromX+AAA, f moveList[endPV-1][1] = fromY + ONE; moveList[endPV-1][2] = toX + AAA; moveList[endPV-1][3] = toY + ONE; + moveList[endPV-1][4] = promoChar; + moveList[endPV-1][5] = NULLCHAR; + strncat(moveList[endPV-1], "\n", MOVE_LEN); if(storeComments) CoordsToAlgebraic(boards[endPV - 1], PosFlags(endPV - 1), @@ -5675,6 +5668,12 @@ HasPromotionChoice(int fromX, int fromY, int toX, int toY, char *promoChoice) promotionZoneSize = 3; } + // Treat Lance as Pawn when it is not representing Amazon + if(gameInfo.variant != VariantSuper) { + if(piece == WhiteLance) piece = WhitePawn; else + if(piece == BlackLance) piece = BlackPawn; + } + // next weed out all moves that do not touch the promotion zone at all if((int)piece >= BlackPawn) { if(toY >= promotionZoneSize && fromY >= promotionZoneSize) @@ -8350,6 +8349,7 @@ ParseGameHistory(game) if (q != NULL) *q = NULLCHAR; p++; } + while(q = strchr(p, '\n')) *q = ' '; // [HGM] crush linefeeds in result message gameInfo.resultDetails = StrSave(p); continue; } @@ -8488,9 +8488,9 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board) board[toY][toX] = king; board[toY][toX+1] = board[fromY][BOARD_LEFT]; board[fromY][BOARD_LEFT] = EmptySquare; - } else if (board[fromY][fromX] == WhitePawn + } else if ((board[fromY][fromX] == WhitePawn && gameInfo.variant != VariantXiangqi || + board[fromY][fromX] == WhiteLance && gameInfo.variant != VariantSuper && gameInfo.variant != VariantShogi) && toY >= BOARD_HEIGHT-promoRank - && gameInfo.variant != VariantXiangqi ) { /* white pawn promotion */ board[toY][toX] = CharToPiece(ToUpper(promoChar)); @@ -8552,9 +8552,9 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board) board[toY][toX] = BlackKing; board[fromY][0] = EmptySquare; board[toY][2] = BlackRook; - } else if (board[fromY][fromX] == BlackPawn + } else if ((board[fromY][fromX] == BlackPawn && gameInfo.variant != VariantXiangqi || + board[fromY][fromX] == BlackLance && gameInfo.variant != VariantSuper && gameInfo.variant != VariantShogi) && toY < promoRank - && gameInfo.variant != VariantXiangqi ) { /* black pawn promotion */ board[toY][toX] = CharToPiece(ToLower(promoChar)); @@ -9616,7 +9616,7 @@ AutoPlayGameLoop() return; if (matchMode || appData.timeDelay == 0) continue; - if (appData.timeDelay < 0 || gameMode == AnalyzeFile) + if (appData.timeDelay < 0) return; StartLoadGameTimer((long)(1000.0 * appData.timeDelay)); break; @@ -9633,10 +9633,18 @@ AutoPlayOneMove() fprintf(debugFP, "AutoPlayOneMove(): current %d\n", currentMove); } - if (gameMode != PlayFromGameFile) + if (gameMode != PlayFromGameFile && gameMode != AnalyzeFile) return FALSE; + if (gameMode == AnalyzeFile && currentMove > backwardMostMove) { + pvInfoList[currentMove].depth = programStats.depth; + pvInfoList[currentMove].score = programStats.score; + pvInfoList[currentMove].time = 0; + if(currentMove < forwardMostMove) AppendComment(currentMove+1, lastPV[0], 2); + } + if (currentMove >= forwardMostMove) { + if(gameMode == AnalyzeFile) { ExitAnalyzeMode(); SendToProgram("force\n", &first); } gameMode = EditGame; ModeHighlight(); @@ -9769,6 +9777,7 @@ LoadGameOneMove(readAhead) if (q != NULL) *q = NULLCHAR; p++; } + while(q = strchr(p, '\n')) *q = ' '; // [HGM] crush linefeeds in result message GameEnds(moveType, p, GE_FILE); done = TRUE; if (cmailMsgLoaded) { @@ -11641,7 +11650,7 @@ void EditTagsEvent() { char *tags = PGNTags(&gameInfo); - EditTagsPopUp(tags); + EditTagsPopUp(tags, NULL); free(tags); } @@ -13297,7 +13306,13 @@ ReplaceComment(index, text) char *text; { int len; + char *p; + float score; + if(index && sscanf(text, "%f/%d", &score, &len) == 2 && + pvInfoList[index-1].depth == len && + fabs(pvInfoList[index-1].score - score*100.) < 0.5 && + (p = strchr(text, '\n'))) text = p; // [HGM] strip off first line with PV info, if any while (*text == '\n') text++; len = strlen(text); while (len > 0 && text[len - 1] == '\n') len--; @@ -13371,24 +13386,24 @@ if(appData.debugMode) fprintf(debugFP, "Append: in='%s' %d\n", text, addBraces); safeStrCpy(commentList[index], old, oldlen + len + 6); free(old); // [HGM] braces: join "{A\n}\n" + "{\nB}" as "{A\nB\n}" - if(commentList[index][oldlen-1] == '}' && (text[0] == '{' || addBraces)) { - if(addBraces) addBraces = FALSE; else { text++; len--; } + if(commentList[index][oldlen-1] == '}' && (text[0] == '{' || addBraces == TRUE)) { + if(addBraces == TRUE) addBraces = FALSE; else { text++; len--; } while (*text == '\n') { text++; len--; } commentList[index][--oldlen] = NULLCHAR; } - if(addBraces) strcat(commentList[index], "\n{\n"); + if(addBraces) strcat(commentList[index], addBraces == 2 ? "\n(" : "\n{\n"); else strcat(commentList[index], "\n"); strcat(commentList[index], text); - if(addBraces) strcat(commentList[index], "\n}\n"); + if(addBraces) strcat(commentList[index], addBraces == 2 ? ")\n" : "\n}\n"); else strcat(commentList[index], "\n"); } else { commentList[index] = (char *) malloc(len + 6); // perhaps wastes 4... if(addBraces) - safeStrCpy(commentList[index], "{\n", 3); + safeStrCpy(commentList[index], addBraces == 2 ? "(" : "{\n", 3); else commentList[index][0] = NULLCHAR; strcat(commentList[index], text); - strcat(commentList[index], "\n"); - if(addBraces) strcat(commentList[index], "}\n"); + strcat(commentList[index], addBraces == 2 ? ")\n" : "\n"); + if(addBraces == TRUE) strcat(commentList[index], "}\n"); } } @@ -13407,7 +13422,7 @@ static char * FindStr( char * text, char * sub_text ) /* [HGM] PV time: and then remove it, to prevent it appearing twice */ char *GetInfoFromComment( int index, char * text ) { - char * sep = text; + char * sep = text, *p; if( text != NULL && index > 0 ) { int score = 0; @@ -13445,11 +13460,20 @@ char *GetInfoFromComment( int index, char * text ) return text; } + p = text; + if(p[1] == '(') { // comment starts with PV + p = strchr(p, ')'); // locate end of PV + if(p == NULL || sep < p+5) return text; + // at this point we have something like "{(.*) +0.23/6 ..." + p = text; while(*++p != ')') p[-1] = *p; p[-1] = ')'; + *p = '\n'; while(*p == ' ' || *p == '\n') p++; *--p = '{'; + // we now moved the brace to behind the PV: "(.*) {+0.23/6 ..." + } time = -1; sec = -1; deci = -1; - if( sscanf( text+1, "%d.%d/%d %d:%d", &score, &score_lo, &depth, &time, &sec ) != 5 && - sscanf( text+1, "%d.%d/%d %d.%d", &score, &score_lo, &depth, &time, &deci ) != 5 && - sscanf( text+1, "%d.%d/%d %d", &score, &score_lo, &depth, &time ) != 4 && - sscanf( text+1, "%d.%d/%d", &score, &score_lo, &depth ) != 3 ) { + if( sscanf( p+1, "%d.%d/%d %d:%d", &score, &score_lo, &depth, &time, &sec ) != 5 && + sscanf( p+1, "%d.%d/%d %d.%d", &score, &score_lo, &depth, &time, &deci ) != 5 && + sscanf( p+1, "%d.%d/%d %d", &score, &score_lo, &depth, &time ) != 4 && + sscanf( p+1, "%d.%d/%d", &score, &score_lo, &depth ) != 3 ) { return text; } @@ -13465,7 +13489,7 @@ char *GetInfoFromComment( int index, char * text ) /* [HGM] PV time: now locate end of PV info */ while( *++sep >= '0' && *sep <= '9'); // strip depth if(time >= 0) - while( *++sep >= '0' && *sep <= '9'); // strip time + while( *++sep >= '0' && *sep <= '9' || *sep == '\n'); // strip time if(sec >= 0) while( *++sep >= '0' && *sep <= '9'); // strip seconds if(deci >= 0) @@ -13485,6 +13509,7 @@ char *GetInfoFromComment( int index, char * text ) pvInfoList[index-1].score = score; pvInfoList[index-1].time = 10*time; // centi-sec if(*sep == '}') *sep = 0; else *--sep = '{'; + if(p != text) { while(*p++ = *sep++); sep = text; } // squeeze out space between PV and comment, and return both } return sep; }